Cosa si preferisce per l'I / O di file in Java? [chiuso]

8

Dei tre

  • BufferedReader / Writer
  • Flussi binari
  • Canali

  • che è più preferito nella vita reale per l'I / O di file in Java e perché?
    Preferisco che i canali per i dati binari siano messi in file o letti da e BufferedReader / Writer per i dati String     
    posta Dummy Derp 09.09.2012 - 19:46
    fonte

    3 risposte

    18

    java.io usa Streams mentre java.nio usa Channels e buffer , la distinzione più importante tra java.io way e java.nio è, come vengono impacchettati e trasmessi i dati.java.io con dati in streaming (un byte alla volta), mentre java.nio si occupa di dati in blocchi. L'elaborazione dei dati da parte del blocco può essere molto più veloce dell'elaborazione da parte del byte (in streaming) ma non è così semplice come i flussi.

    In queste situazioni, è meglio usare java.io way:

    • I file possono essere grandi ma non enormi. È possibile leggere un intero file in memoria.
    • Un'applicazione legge o scrive solo su alcuni file o connessioni di rete allo stesso tempo, idealmente usando solo un flusso alla volta.
    • L'applicazione è sequenziale. Non sarà in grado di fare molto finché non avrà finito di leggere o scrivere un file.

    In queste situazioni, è meglio usare java.nio modo:

    • Un'applicazione che deve servire centinaia o migliaia di connessioni simultaneamente.

    Puoi visualizzare i seguenti link per ulteriori informazioni:

    link

    link

    link

    link

        
    risposta data 09.09.2012 - 21:09
    fonte
    4

    which is more preferred in real life for file I/O in Java and why?

    Dovrebbe davvero essere una questione di funzione piuttosto che di preferenza.

    • Si utilizzano Readers and Writers per dati orientati ai caratteri (che richiede codifica e decodifica), Input / OutputStreams per dati orientati ai byte e flussi binari se i dati codificano dati binari.

    • Si utilizzano le classi BufferedXxx se è necessario I / O alla granularità di un carattere o di un byte. Sono un modo semplice per evitare i seri problemi di prestazioni che possono verificarsi se si eseguono molte sessioni di lettura e scrittura byte-at-time.

    • Se si esegue solo I / O leggendo / scrivendo grandi blocchi, allora le classi BufferedXxx potrebbero effettivamente ridurre un throughput di un bit. Puoi utilizzare lettori / scrittori / stream semplici (con grandi char[] o byte[] buffer) o Canali e XxxBuffer. Questi ultimi sono potenzialmente più veloci, ma le API sono più scomode.

    • Utilizzi i canali se ti servono bassi overhead e / o fai cose specializzate come "selezionare" da più flussi, scatter / gather e accesso ai file mappati in memoria.

    Come puoi vedere, le diverse API sono progettate per scopi diversi. In alcuni casi d'uso c'è sovrapposizione, in altri solo una API è adatta allo scopo.

    Il problema con lo sviluppo di una "preferenza" per uno stile di I / O rispetto a un altro è che porta a software non valido; ovvero un codice che è inefficiente dove è necessaria l'efficienza I / O, o eccessivamente complicato dove l'efficienza I / O non dovrebbe essere un problema.

        
    risposta data 13.09.2012 - 14:22
    fonte
    3

    La risposta è "Dipende" - I / O bufferizzati, streaming, bloccanti e non bloccanti vengono tutti utilizzati per scopi diversi a seconda della concorrenza, del throughput e di altre caratteristiche delle prestazioni che stai cercando.

        
    risposta data 09.09.2012 - 20:27
    fonte

    Leggi altre domande sui tag