PDA

View Full Version : [java] bufferedreader


RaNd0m
21-01-2004, 11:27
Premessa: ho iniziato da poco :D

nn c'è qualke modo x sapere il num d righe del file input?
es.
BufferedReader br = new BufferedReader(new FileReader("input"));

se nn c'è è possible fare questo x saperlo?

(while br.readLine!=null) {righe++}

dopo questo posso ancora utilizzare br x leggere il contenuto di "input" o devo creare un br2?

beog
21-01-2004, 13:01
Non sono sicuro, perchè so solo qualcosina di java, dovrebbe essere il carattere di escape '/n' a determ il cambio riga, cmq secondo me anche col tuo modo (while readline != null... )dovrebbe funzionare.
Ciao

RaNd0m
21-01-2004, 14:56
Grazie.....ma io volevo sapere se c'è un metodo (ke nn debba scrivere io) x sapere il num di righe di un file (del genere br.getNumrighe())

....se nn esiste: una volta fatto il "(while br.readLine!=null) {righe++}" (o qualcosa d simile) devo creare un'altro oggetto "BufferedReader br2 = new BufferedReader(new FileReader("input"));" x leggere il file "input" o c'è qualke modo x usare ancora br?

cn73
21-01-2004, 16:37
Non esiste un metodo, anche perchè come hai intuito è davvero semplice crearselo, va bene il tuo codice!

RaNd0m
21-01-2004, 17:30
è quello ke pensavo ankio ;) ...ma se x es:

int righe = 0;
BufferedReader br = new BufferedReader(new FileReader("input"));
(while br.readLine!=null) {righe++}
String[] riga=new String[righe];
for(int c=0; c<righe-1; c++) {riga[c]=br.readLine();} \\questo nn funziona xkè br punta alla prima riga null, giuto?

è x questo ke kiedevo se dovevo creare br2 :D

cn73
21-01-2004, 17:45
Perchè dovrebbe essere nulla la prima riga?

Comunque se non hai vincoli particolari sulle strutture dati da utilizzare io lo risolverei diversamente...tu probabilmente vuoi sapere a priori il num di righe per dimensionare l'array... invece puoi usare un vector e fare un ciclo finchè ci sono righe...


String line = ""
Vector righe=new Vector();
while (line != null){
line = br.readLine();
righe.addElement(line)
}


fra l'altro alla fine la righe.size() ti restituisce in num di righe...

RaNd0m
21-01-2004, 20:50
xkè dopo il ciclo while (ke finisce quando br.readLine()=null) br.readLine() leggerà dalla 1° riga null in avanti

cmq nn sapevo questa storia d Vector.....molto meglio :D

nn è ke hai un link dove posso documentarmi?

THX ;)

cn73
22-01-2004, 09:04
Scusa, parliamo di questo:


for(int c=0; c<righe-1; c++) {riga[c]=br.readLine();}


tu fai tanti readLine() quante sono le righe del file, come fa a andare oltre la fine?? ;)

Cmq di documentazione ce n'è quanta ne vuoi:
http://java.sun.com/docs/books/tutorial/index.html

:D

PS: i Vector sono una delle classi fondamentali di Java, le trovi in qualunque documento che parli di Java...

Angus
22-01-2004, 09:58
Originariamente inviato da RaNd0m
nn c'è qualke modo x sapere il num d righe del file input?


che io sappia non c'è un metodo diretto per farlo... bisogna leggere tutto il file e contare i caratteri di fineriga, ad esempio come tu proponi:

es.
BufferedReader br = new BufferedReader(new FileReader("input"));
(while br.readLine!=null) {righe++}


oppure utilizzando java.io.LineNumberReader o java.io.LineNumberInputStream che estendono BufferedReader proprio con un contatore interno per le righe...


dopo questo posso ancora utilizzare br x leggere il contenuto di "input" o devo creare un br2?

Reader non permette di ricominciare da capo quindi devi utilizzarne uno nuovo (ricordandoti di chiudere con .close() quello vecchio se non ti serve più).

soalle
22-01-2004, 11:45
Originariamente inviato da cn73
Scusa, parliamo di questo:


for(int c=0; c<righe-1; c++) {riga[c]=br.readLine();}


tu fai tanti readLine() quante sono le righe del file, come fa a andare oltre la fine?? ;)

Cmq di documentazione ce n'è quanta ne vuoi:
http://java.sun.com/docs/books/tutorial/index.html

:D

PS: i Vector sono una delle classi fondamentali di Java, le trovi in qualunque documento che parli di Java...

Ha ragione random... se prima fai un
while(br.readLine()!=null){...}
dopo tutte le successive chiamate restituiscono null...

Soluzione migliore è quella di usare un Vector...

Se però è necessario rileggere per forza da capo le soluzioni sono due:
1. creare un nuovo buffered reader
2. marcare il file all'inizio ( -> br.mark(...); ) e successivamente fare il reset();

Angus
22-01-2004, 12:07
Originariamente inviato da soalle

2. marcare il file all'inizio ( -> br.mark(...); ) e successivamente fare il reset();



Mi permetto di aggiungere a questa ipotesi che, come specificato nella documentazione di .mark(int readAheadLimit), bisogna considerare che readAheadLimit è il limite superiore del buffer interno a BufferedReader oltrepassato il quale non è possibile effettuare un reset(): quindi nel caso specifico si sarebbe costretti ad utilizzare un buffer interno grande almeno quanto tutto il file.

cn73
22-01-2004, 12:59
Originariamente inviato da soalle
Ha ragione random... se prima fai un
while(br.readLine()!=null){...}
dopo tutte le successive chiamate restituiscono null...

Soluzione migliore è quella di usare un Vector...

Se però è necessario rileggere per forza da capo le soluzioni sono due:
1. creare un nuovo buffered reader
2. marcare il file all'inizio ( -> br.mark(...); ) e successivamente fare il reset(); Non avevo capito che intendeva dopo il ciclo...nel ciclo non potrà mai avere un null...

RaNd0m
22-01-2004, 14:07
Grazie x i consigli ;)

proverò ad usare Vector, mi sembra + figo :D

riaw
23-01-2004, 08:55
ot per random: a me interessava il tuo server, quello di questa discussione:
http://forum.hwupgrade.it/showthread.php?s=&threadid=605780

come mai è stata chiusa?