2012-04-29 11 views
16

Stavo imparando il pacchetto java nio e ho realizzato che ci sono molti metodi già forniti da File che nio.Files sta fornendo di nuovo usando la classe Path. Come quello che ho ottenuto ancora. In realtà non sto ottenendo quale sia l'uso effettivo del pacchetto nio.Qual è l'uso esatto del pacchetto java nio quando già sono disponibili metodi con pacchetto io

Sono solo molto nuovo a questo pacchetto in modo potrebbe essere la mia domanda è sbagliato, ma un po 'di aiuto mi può aumentare a leggere oltre.

+2

Non un * risponditore *, quindi posterò un commento: [La pagina di Wikipedia su di esso] (http://en.wikipedia.org/wiki/New_I/O) discute alcuni degli obiettivi e le ragioni per pacchetto nio. –

+0

Essendo pedante, "Path" fa parte della libreria NIO2 aggiunta in Java 7. BTW: Mentre ci si concentra molto sui socket NIO non bloccanti, di solito utilizzo i socket NIO bloccati, che sono più semplici da usare con IMHO. NIO2 Aggiungi NIO asincrono per socket e file. –

risposta

8

La differenza principale tra IO e NIO è che IO sta bloccando, mentre NIO non è bloccante.

This article spiega le differenze nei pacchetti e cosa sono IO bloccanti e non bloccanti.

+22

Si prega di non pubblicare solo un collegamento. Quando quel collegamento muore, lo fa anche questa risposta. –

+2

NIO può essere bloccante, non bloccante o asincrono. Questa non è la principale differenza. – EJP

+0

@Deco Il fattore di blocco vale anche per 'java.io.File' vs' java.nio.file'? – overexchange

1

Quasi tutti i metodi in java.io.File presentano problemi che non possono essere risolti per ragioni di compatibilità, il più ovvio è che i metodi restituiscono un valore booleano quando falliscono. Questi problemi, oltre al desiderio di supportare i file system collegabili e molte altre cose, hanno reso necessario lo sviluppo di una API del file system completamente nuova, ecco perché è stato creato java.nio.file.

7

di programmazione Java, I/O è stato fino a poco tempo effettuata utilizzando una metafora flusso. Tutto l'I/O è visto come il movimento di singoli byte, uno alla volta, attraverso un oggetto chiamato Stream. Stream I/O è utilizzato per contattare il mondo esterno. È anche usato internamente, per trasformare oggetti in byte e poi di nuovo in oggetti.

NIO ha lo stesso ruolo e lo scopo, come ho originale/O, ma utilizza una metafora diversa - blocco I/O. java.nio (new/non-blocking I/O)) è stata introdotta l'API con JDK1.4.

Che differenza c'è tra I/O del flusso e I/O del blocco?

Un sistema di I/O orientato al flusso tratta i dati un byte alla volta. Un flusso di input produce un byte di dati e un flusso di output consuma un byte di dati. È molto facile creare filtri per i dati in streaming. È anche relativamente semplice concatenare più filtri insieme in modo che ognuno faccia la sua parte in ciò che equivale a un singolo, sofisticato meccanismo di elaborazione. D'altro canto, l'I/O orientato al flusso è spesso piuttosto lento.

di offerte di sistema I/O orientati a blocchi con dati in blocchi. Ogni operazione produce o consuma un blocco di dati in un unico passaggio. L'elaborazione dei dati da parte del blocco può essere molto più veloce rispetto all'elaborazione del byte (in streaming). Ma l'I/O orientato ai blocchi manca dell'eleganza e della semplicità dell'I/O orientato al flusso.

Quando si utilizza java.io e quando si preferisce java.nio?

  1. scalabilità probabilmente guidare la vostra scelta di pacchetto. java.net richiede un thread per socket. Codificarlo sarà molto più facile. java.nio è molto più efficiente, ma è difficile da codificare.

  2. È possibile ottenere una migliore scalabilità una volta che si hanno a che fare con decine di migliaia di connessioni, ma a numeri inferiori probabilmente si otterrà un throughput migliore con il blocco dell'IO.

  3. Quando si lavora con Java SSL.nio non è una cosa facile da affrontare

Importante: se si sta lavorando con uno dei pacchetti, non è una buona idea per creare il quadro da zero fino a quando e se non avete un motivo valido per farlo così.

Per java.nio, i progetti come Grizzly e Quick Server forniscono componenti server non bloccabili riutilizzabili.

Da leggere Pain points with java.nio

Infine si riduce a requisiti specifici dei vostri progetti e ciò che si sta cercando di ottenere. Alcune delle migliori soluzioni potrebbero non richiedere l'infrastruttura più complessa al

Aggiornamento: Recentemente scoperto sul pacchetto NIO.2 che esiste da jdk 1.7. NIO.2 è diverso da NIO, il principale è che NIO.2 offre funzionalità di canale asincrono. NIO.2 primer

Se si lavora con NIO, vale la pena fare la differenza e quale si adatta al proprio scopo.

+0

Penso che questa sia la risposta migliore – lolski

+0

E questa risposta sembra essere copia-incolla di un libro ... – CuriousMind

2

Java NIO: Canali e Buffer
Nella API standard IO si lavora con i flussi di byte e corsi d'acqua di carattere. In NIO lavori con canali e buffer. I dati vengono sempre letti da un canale in un buffer o scritti da un buffer su un canale.

Java NIO: non bloccante IO
Java NIO vi permette di fare non-blocking IO. Ad esempio, un thread può chiedere a un canale di leggere i dati in un buffer. Mentre il canale legge i dati nel buffer, il thread può fare qualcos'altro. Una volta che i dati vengono letti nel buffer, il thread può continuare a processarli. Lo stesso vale per la scrittura dei dati sui canali.

Java NIO: selettori
Java NIO contiene il concetto di "selettori". Un selettore è un oggetto che può monitorare più canali per eventi (come: connessione aperta, dati arrivati ​​ecc.). Pertanto, un singolo thread può monitorare più canali per i dati.
More detail on orcale

0

NIO ha anche introdotto Canali che astraggono la specializzazione in Stream - File, Socket, Rete.

Problemi correlati