Java, evitare di leggere due volte un file di input
Sto facendo degli esercizi di programamzione in Java, tra cui quelli basati su scrivere un programma che legge in input un file e restituisce un altro file.
Mi chiedevo, se per esempio devo lavorare su un file impostando per la lettura:
Ora una volta fatta questa cosa se devo contare il numero di righe del testo faccio:
Se devo rileggere nuovamente il testo, c'è un modo per rileggerlo senza dovere inizializzare nuovamente gli oggetti: cioè senza rifare:
Perchè se non lo faccio ottengo null.
Mi chiedevo, se per esempio devo lavorare su un file impostando per la lettura:
FileReader reader=new FileReader("input.txt"); BufferedReader in=new BufferedReader(reader);
Ora una volta fatta questa cosa se devo contare il numero di righe del testo faccio:
while(in.readLine()!=null) int righe++;
Se devo rileggere nuovamente il testo, c'è un modo per rileggerlo senza dovere inizializzare nuovamente gli oggetti: cioè senza rifare:
FileReader reader=new FileReader("input.txt"); BufferedReader in=new BufferedReader(reader);
Perchè se non lo faccio ottengo null.
Risposte
Non riesci proprio a fare "entrambe" cose man mano che leggi le righe ?
Cercherò di trovare una soluzione...

Provando a dare un occhio alla documentazione su reader & co. potrebbe funzionare il fatto di usare il metodo "mark" appena inizializzato il reader, e una volta terminato il conteggio delle linee, usare il metodo "reset" che dovrebbe riportare il reader all'ultimo mark (dunque in questo caso all'inizio), ma non ho verificato il funzionamento nel contesto specifico
Esattamente, vorrei usare questo metodo ma non riesco a farlo funzionare, mi invalida il metodo reset, in questo esercizio che posto in parte dovrei leggere un file fatto di sole righe con numeri che sono maggiori di 500 caratteri, perciò devono per forza memorizzarli come stringhe perchè superano la dimensione massima consentita dai vari tipi primitivi, vorrei memorizzarli in un array di stringhe e poi confrontarli. Il problema è che dovrei leggere una volta per stabilire il numero di righe e quindi la dimensione dell'array e poi rileggere le stringhe.
In questo esempio mi dà errore nel reset, non capisco come usare il mark per "marcare" il primo rigo da cui ripartire, mi aiutereste?
import java.io.*; public class EsercizioVI { public static void main(String [] args) throws IOException { FileReader reader=null; PrintWriter out=null; BufferedReader in=null; try{ reader=new FileReader("input.txt"); in=new BufferedReader(reader); out=new PrintWriter("OUTPUT.txt"); int righe=0; String max=""; in.mark(1000); while(in.readLine()!=null){ righe++; } in.reset();
In questo esempio mi dà errore nel reset, non capisco come usare il mark per "marcare" il primo rigo da cui ripartire, mi aiutereste?
Il mark lo metterei a zero, ma è comunque possibile che non sia supportato in quel reader
Se però il problema di fondo è quello di determinare il numero di righe epr dimensionare l'array, non ti conviene usare un Vector o una ArrayList per salvare le stringhe che leggi?! In questo modo non hai bisogno di sapere il numero delle stringhe da memorizzare.
A questo punto puoi usare il vettore in modo equivalente ad un array classico
Ti consiglio comunque di guardare i vari metodi nella documentazione ufficiale
Se però il problema di fondo è quello di determinare il numero di righe epr dimensionare l'array, non ti conviene usare un Vector o una ArrayList per salvare le stringhe che leggi?! In questo modo non hai bisogno di sapere il numero delle stringhe da memorizzare.
Vector<String> v = new Vector<String>(); String s = null; while ((s =in.readLine) != null) { v.add(s); }
A questo punto puoi usare il vettore in modo equivalente ad un array classico
for (int i = 0; i < v.size(); i++) { String current = v.get(i); //[......] }
Ti consiglio comunque di guardare i vari metodi nella documentazione ufficiale

Vorrei memorizzare le stringhe in un array, ma non so il numero di stringhe, purtroppo gli Arraylist non li abbiamo ancora trattati..
Per Vector non so cosa intendi...
P.S. con mark(0) Viene generata un' eccezione di tipo mark invalid.

Per Vector non so cosa intendi...
P.S. con mark(0) Viene generata un' eccezione di tipo mark invalid.
Il Vector è simile alla ArrayList, la differenza sta nei metodi non sincroni, quindi pericolosi nella programmazione concorrente.
Comunque, se proprio proprio vuoi usare gli array, dato che i mark sembrano non andare, reinizializza gli oggetti
Comunque, se proprio proprio vuoi usare gli array, dato che i mark sembrano non andare, reinizializza gli oggetti
