2012-02-12 8 views
5

Come faccio a implementare una funzione in java nio dire nextLineNio() che legge la riga successiva da FileChannel in modo incrementale in quanto il file potrebbe essere enorme, la mia idea iniziale era quella di leggere in un ByteBuffer di dimensioni maggiori allora lunghezza massima di una linea che potrebbe esistere e read() dal FileChannel se necessario, ma il problema che vedo è come faccio a non leggere l'ultima sequenza di byte che non finisce in una nuova riga. Inoltre, come faccio a garantire che la funzione nextLineNio() non abbia esito negativo poiché nio api è asincrono. Qualsiasi aiuto o implementazioni già esistenti?java nio righe di lettura da un file

Grazie

risposta

2

Come @EJP fa notare, è molto probabile che si ottengono prestazioni più che sufficiente usando BufferedReader.readLine() A meno che non si sa questo non è adatto, questo è quello che vorrei suggerire a mantenere le cose semplice.

http://vanillajava.blogspot.com/2011/01/how-slow-can-you-readwrite-files-in.html


avrei memoria mappare l'intero file e la ricerca di nuove righe per ottenere una linea alla volta. Questo evita la necessità di preoccuparsi per le dimensioni del buffer o più letture (o il problema della lettura troppo)

NIO è sincrono per impostazione predefinita, il file IO è sincrona solo (fino Java 7). Per rendere Sockets asincroni devi chiamare un setter speciale.

+0

Non lo farei. Vorrei usare un BufferedReader. Non userei NIO mappato per qualcosa tranne un grande file singolo che sarebbe stato aperto per tutta la vita del programma, ad es. un database auto-implementato. – EJP

+0

@EJP, punto eccellente. Avrei dovuto chiederti se hai bisogno di NIO in primo luogo. –