Accedi per seguire   
Seguaci 0
idol8

[Java] Leggere la prima parola di ogni riga di un file di testo

2 messaggi in questa discussione

ormai non so più se sono nel forum giusto, sbaglio sempre, comunque dovrei caricare un file di testo in un elemento 'Vector' in java, così avrei:

private Vector prog = new Vector();

//private List prog=new ArrayList();

String nuovoFile = "primometa.txt";

ma io devo avere, per ogni riga del file 'primometa' un elemento solo del mio vettore 'prog'

(poi mi vengono dubbi se usare una 'List' non mi agevolerebbe il lavoro?!?!?!?):

String token = "";

String riga = "";

try

{

FileInputStream fs = new FileInputStream(nuovoFile);

DataInputStream dis = new DataInputStream(fs);

e dal titolo vi ho parlato di token, perchè ora, per ogni elemento del vettore, ovvero per ogni riga del file di testo, io dovrei leggere la prima parola:

riga = dis.readLine();

StringTokenizer tok=new StringTokenizer(riga);

token = tok.nextToken();

while (riga != null)

{

//numRighe++;

if(riga.charAt(0)!='#')

{

try

{

prog.addElement(riga);

i miei problemi nascono qui quando devo aggiornare i token. come devo fare?

//dis.close();

}

catch (Exception e)

{System.err.println("Errore nella lettura da file!");}

}

riga = dis.readLine();

anche qui nutro dubbi, quale comando mi fa questo assegamento?

token = tok.nextToken();

perde il riferimento.........

}

dis.close();

}

catch(IOException e)

{

System.out.println(e.toString());

}

}

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Se ho capito bene, il tuo problema è:

- leggere un file di testo

- inserire ogni riga del file di testo all'interno di un vettore

- recuperare la prima parola di ogni riga.

Questa è la versione che ho pensato io:

	try {
		FileReader fr = new FileReader("c:\\prova.txt");
		BufferedReader reader = new BufferedReader(fr);
		ArrayList lines = new ArrayList();

		String line;
		int count = 1; //Per debug
		while ((line = reader.readLine()) != null) {
			if (!lines.add(line))
				System.err.println("Warning: Non è stato possibile aggiungere la nuova linea");

			String firstWord = null;

			int endIndex = line.indexOf(' ');
			if ((endIndex == -1) && (line.length() > 0))
				endIndex = line.length();
			if (endIndex >= 0)
				firstWord = line.substring(0, endIndex);

			/*
			 * Per debug
			 */
			if (firstWord != null)
				System.out.println((count++)+") "+firstWord);
		}

		reader.close();
		fr.close();
	} catch (FileNotFoundException fnfe) {
	} catch (IOException ioe) {}

ArrayList e Vector si equivalgono. La differenza principale è che i Vector sono sincronizzati mentre gli ArrayList no. La sincronizzazione aggiunge un overhead computazionale. Quindi, se non stai sviluppando un'applicazione multithread, ti consiglio l'utilizzo dell'ArrayList (più veloce ma non sicuro per applicazioni multithread).

Invece che un FileInputStream ti consiglio di utilizzare un FileReader in modo da poterlo passare direttamente al BufferedReader.

Il BufferedReader permette di leggere una riga alla volta (grazie a readLine()).

La mia applicazione legge una riga alla volta (dentro il ciclo while) fino a che non ci sono più righe da leggere (line risulta null).

Dentro il ciclo while aggiungo all'ArrayList precedentemente instanziato la nuova line letta dal file.

Invece che utilizzare uno StringTokenizer, per estrarre la prima parola della linea, ho preferito un approccio diverso:

la prima parola di ogni riga altro non è se non una sottostringa (substring()) della linea stessa con indice iniziale 0 (il primo carattere della linea) e indice finale il primo spazio presente nella stringa. (substring() copia dall'indice iniziale fino al carattere precedente a quello finale evitando, quindi di copiare anche lo spazio).

Per evitare di incorrere in un IndexOutOfBoundException, prima di copiare la parola controllo di aver trovato uno spazio o che almeno la linea contenga caratteri.

:)

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Crea un account o accedi per lasciare un commento

Devi essere un utente registrato per partecipare

Crea un account

Iscriviti per un nuovo account nella nostra community. È facile!


Registra un nuovo account

Accedi

Sei già registrato? Accedi qui.


Accedi Ora
Accedi per seguire   
Seguaci 0