|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
[JAVA]utilizzo classe BufferReader
devo leggere un file di testo che contiene tot righe di testo; per leggere ogni riga uso il metodo .readline della classe bufferreader: il problema sorge quando voglio leggere *tutte" le righe di testo contenute nel file .......che ciclo devo utilizzare e sopratutto qualche condizione?
nei metodi della classe BufferReader non ho trovato nulla che mi potesse indicare l'EOF! Codice:
File aFile = new File("C:\\file.bin"); <--- file da leggere try { in = new FileInputStream (aFile); } catch(Exception e) { } <--- ottengo lo Stream (non quello della valve! lol) BufferedReader d = new BufferedReader(new InputStreamReader(in)); <--- il buffer per leggere il testo string = d.readLine(); <--- metodo per leggere una singola riga ![]() ps: secondo voi questo tipo di lettura di un file di testo è efficente o c'è qualcosa di meglio?
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
tu continua a leggere il file finché non arriva l'eccezione IOException
a quel punto sai che il file è finito |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Sep 2003
Città: Garlasco (PV)
Messaggi: 71
|
string = d.readLine();
while (string!=null) {leggi il file } .......io ho usavo questo ( mi sembra ![]() cmq dovresti mettere tutto in un array di string |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Dec 2001
Città: Roma
Messaggi: 542
|
Quote:
__________________
Il 90% dei problemi di un computer si trova tra la tastiera e la sedia. XP2500+@3200+|A7N8X Deluxe|1,25 GB DDR400|Radeon 9550|HD 160+320 GB SATA|WinXP Pro|Fastweb 6 Mb/s |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
Quote:
del resto ho usato la bufferedreader praticamente solo per le socket quindi c'era l'abitudine a usare le eccezioni |
|
![]() |
![]() |
![]() |
#6 | |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Re: [JAVA]utilizzo classe BufferReader
Quote:
Codice:
import java.io.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; public class NIOReader { public static void main(String[] args) { try { StringBuffer text = new StringBuffer(); FileChannel inChannel = new FileInputStream("z:/prova.txt").getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); Charset charset = Charset.forName("ISO-8859-1"); CharsetDecoder charsetDecoder = charset.newDecoder(); while( inChannel.read(buffer) != -1 ) { buffer.flip(); text.append(charsetDecoder.decode(buffer).toString()); buffer.clear(); } inChannel.close(); System.out.println(text); } catch(IOException e) { e.printStackTrace(System.err); System.out.println("End of stack trace"); } System.exit(0); } } |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
grazie PGI!! ...in effetti quel codice riuslta essere moolto + efficente nella lettura di file! ....però quando tento di andare a caricare file abbastanza grossi (30-40mb) mi da un errore "java.lang.OutOfMemoryError" <--- come faccio quindi a impostare la jvm per fargli utilizzare + ram ?
![]() ciao e grazie!
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
I parametri sono da impostare al momento del lancio della jvm:
http://java.sun.com/j2se/1.4.2/docs/...dows/java.html In special modo Quote:
|
|
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
da linea di comando puoi usare l'opzione -XmxN, dove N indica la quantità di memoria massima di allocazione che la jvm può usare (default 64megabyte). N può essere espresso in kilobyte o megabyte, di solito si usano i megabyte.
es. java -Xmx256m Programma.java -> la jvm "arriva" fino a 256megabyte Puoi anche stabilire la dimensione iniziale della memoria di allocazione (default 2megabyte) java -Xms16m -Xmx256m Programma.java -> la jvm parte con 16megabyte e arriva fino a 256. Questa seconda opzione si può usare nel caso in cui il programma richieda già all'avvio un quantitiativo di memoria più ampio del normale e dovrebbe garantire una partenza un po' più rapida. Se stai impacchettando l'applicazione in un Jar eseguibile, puoi definire direttamente le opzioni che verranno usate dalla macchina virtuale quando eseguirà l'applicazione usando le opzioni -J- es. jar -J-Xmx256m -mcf blablabla... crea un jar che sarà eseguito passando alla macchina virtuale l'opzione -Xmx256m. Tutte le opzioni -X sono opzioni della macchina virtuale HotSpot di Sun. Ciao. |
![]() |
![]() |
![]() |
#10 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
cn73, m'hai fregato per un minuto!
![]() |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
grazie raga
![]() ciao e grazie ![]()
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
![]() |
![]() |
![]() |
#13 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Per leggere una linea per volta personalmente ti consiglio di restare sul buon vecchio BufferedReader, forse è meno efficiente però il codice che salta fuori è 1000 volte più "rapido da leggere" (e non è una cosa da buttar via).
Con un CharsetDecoder il carattere "new line" è trattato come un carattere qualsiasi, per risolvere dovresti aggiungere un ciclo di "parsing" del testo letto, o tutto quanto, e quindi dopo aver creato una stringa che può anche essere piuttosto grossa, oppure all'interno del ciclo di lettura: togli l' "append", riversi il contenuto del buffer in una stringa intermedia e la parzializzi cercando i caratteri "\n". Così fancendo sarebbe ancora più efficiente di un bufferedreader? Non lo so, bisognerebbe provare. Sicuramente il codice è un po' più incasinato. |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
Quote:
Codice:
import java.io.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; public class ReadFile { static String text = new String(""); static Charset charset = Charset.forName("ISO-8859-1"); static CharsetDecoder charsetDecoder = charset.newDecoder(); static File aFile = new File("C:\\file.bin"); static FileChannel inChannel; static ByteBuffer buffer; static { try { inChannel = new FileInputStream(aFile).getChannel(); } catch(Exception e) { } } public ReadFile() { buffer = ByteBuffer.allocate((int)aFile.length()); try { while( inChannel.read(buffer) != -1 ) { buffer.flip(); text = (charsetDecoder.decode(buffer)).toString(); buffer.clear(); } inChannel.close(); } catch(IOException e) { e.printStackTrace(System.err); System.out.println("End of stack trace"); } splitting(); } public void splitting() { String[] array = text.split("\n"); System.out.println("^_^"); } } ciao ![]() edit ps: ho separato in un metodo a se stante le righe di codice per splittare così da poter eventualmente modificare lo String text completo in altri modi.
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- Ultima modifica di Frank1962 : 07-03-2004 alle 01:29. |
|
![]() |
![]() |
![]() |
#15 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Per funzionare dovrebbe funzionare, bisogna vedere se funziona "meglio".
Prima carichi la stringa in un buffer, poi carichi il contenuto in un array, alla fine potresti ritrovarti con un po' di duplicati. Ma la cosa è tutta da vedere, perchè il motore di gestione delle stringhe in Java potrebbe anche offrire la possibilità di rimuovere i duplicati usando il metodo "intern()" della classe String, che rimpiazza la stringa generata con un riferimento ad una delle stringhe nel pool in memoria. Forse si potrebbe parzializzare tutto il testo in tanti "token" quante sono le singole parole e richiamare "intern()" su ciascuno di essi. Ma è un'idea un po' così. E poi dipende dalla lunghezza del testo, per 100kb non andrei ad arrovellarmi troppo sulla questione, per 40megabyte però... Ciao. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:30.