Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    52

    problema concatenazione file

    ho un problema con un altro esercizio: questa volta riguarda la concatenazione dei file.

    guardate questa classe:

    codice:
    package file;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.PrintWriter;
    import java.util.Scanner;
    
    public class CatFiles {
    	
    	public CatFiles(String fileInput) throws FileNotFoundException
    	{
    		reader = new FileReader(fileInput);
    	}
    	
    	public void concatenaFile(String nomeFile) throws FileNotFoundException
    	{
    		out = new PrintWriter("ConcatenazioneRisultato.txt");
    		Scanner in = new Scanner(reader);
    		while(in.hasNextLine())
    		{
    			String riga = in.nextLine();
    			out.println(riga);
    		}
    		FileReader file = new FileReader(nomeFile);
    		in = new Scanner(file);
    		while(in.hasNextLine())
    		{
    			String riga = in.nextLine();
    			out.println(riga);
    		}
    		out.close();
    	}
    	
    	private FileReader reader;
    	private PrintWriter out;
    
    }
    nel costruttore si specifica il nome del primo file che si vuole concatenare (il file origine), mentre nel metodo concatenaFile si specifica il file successivo da unire. il problema è questo: se chiamo il metodo una prima volta, il programma funziona correttamente, se poi lo chiamo ancora il file risultato presenta solo i caratteri del file specificato nel metodo, mentre tutto il resto non compare. potete spiegarmi perchè? cosa sbaglio? in pratica a partire dal file origine del costruttore vorrei poter unire un numero non determinato di file a quest ultimo chiamando sempre il metodo concatenaFile.

    grazie

    EDIT: ho notato tramite debug (forse si capiva anche senza) che la seconda volta che chiamo il metodo concatenaFile nel test, il programma non entra proprio nel primo while, ma perchè? non dovrebbe rileggere il contenuto del file reader?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: problema concatenazione file

    Originariamente inviato da auron567
    nel costruttore si specifica il nome del primo file che si vuole concatenare (il file origine), mentre nel metodo concatenaFile si specifica il file successivo da unire.
    Ehm ... no. Io personalmente farei proprio tutto il contrario!! C'è 1 file destinazione e più sorgenti. Quindi sarebbe logico che la classe venga istanziata specificando il file di destinazione. E la classe avrebbe un metodo es. aggiungiFile() che si può invocare più volte per aggiungere gli N file sorgenti. La classe dovrebbe anche avere un metodo close() per chiudere lo stream di destinazione. E ci dovrebbe essere una più valida e corretta gestione delle eccezioni. Cosa che invece non hai fatto .... (hai usato Scanner ... poco utile e inoltre "zittisce" le eccezioni di I/O).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    52

    Re: Re: problema concatenazione file

    Originariamente inviato da andbin
    Ehm ... no. Io personalmente farei proprio tutto il contrario!! C'è 1 file destinazione e più sorgenti. Quindi sarebbe logico che la classe venga istanziata specificando il file di destinazione. E la classe avrebbe un metodo es. aggiungiFile() che si può invocare più volte per aggiungere gli N file sorgenti. La classe dovrebbe anche avere un metodo close() per chiudere lo stream di destinazione. E ci dovrebbe essere una più valida e corretta gestione delle eccezioni. Cosa che invece non hai fatto .... (hai usato Scanner ... poco utile e inoltre "zittisce" le eccezioni di I/O).
    sul libro di testo in un esempio simile utilizzava lo scanner, ecco perchè ho fatto così. però potresti spiegarmi perchè questo programma non funziona? se invoco il metodo una prima volta tutto ok, se lo invoco una seconda volta mi salta il primo ciclo while, e non riesco a capire il perchè...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: Re: Re: problema concatenazione file

    Originariamente inviato da auron567
    sul libro di testo in un esempio simile utilizzava lo scanner
    Ma sai come funziona Scanner? Sai in quali circostanze può essere davvero utile??? Perché altrimenti è come se piantassi un chiodo usando una chiave a brugola .....

    Originariamente inviato da auron567
    potresti spiegarmi perchè questo programma non funziona?
    Beh, intanto PrintWriter, per come l'hai usato, non "appende" un bel niente. Ogni volta che lo istanzi, lui sovrascrive e quindi azzera il file.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    52
    ho provato a cambiare un pò il programma, ma ancora non riesco a farlo funzionare:

    codice:
    import java.io.FileReader;
    import java.io.PrintWriter;
    import java.util.Scanner;
    
    public class CatFiles {
    	
    	public CatFiles(String fileOutput) throws FileNotFoundException
    	{
    		out = new PrintWriter(fileOutput);
    	}
    	
    	public void concatenaFile(String nomeFile) throws FileNotFoundException
    	{
    		FileReader reader = new FileReader(nomeFile);
    		Scanner in = new Scanner(reader);
    		while(in.hasNextLine())
    		{
    			String riga = in.nextLine();
    			out.println(riga);
    		}
    		out.close();
    	}
    	
    	private PrintWriter out;
    
    }
    funziona solo la prima volta che il metodo viene invocato, poi non aggiunge più niente. penso sia dovuto a quel out.close, che chiude il file e non si può più scrivere o sbaglio? non è possibile riaprirlo in qualche modo? mi sa che non ho ben capito come funziona questo meccanismo....

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da auron567
    funziona solo la prima volta che il metodo viene invocato
    A me sembra ovvio che 'out' non lo devi chiudere nel metodo concatenaFile(), visto che è quello che viene invocato (possibilmente) più volte. Metti un metodo close() nella tua classe ... che invoca close su out.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    52
    ok, ho aggiunto il metodo close e quindi la classe di test diventa così:

    codice:
    package file;
    
    import java.io.FileNotFoundException;
    
    public class CatFilesTest {
    
    	public static void main(String[] args) throws FileNotFoundException {
    		
    		CatFiles x = new CatFiles("ConcatenazioneRisultato.txt");
    		x.concatenaFile("Concatenazione.txt");
    		x.concatenaFile("Concatenazione1.txt");
    		x.concatenaFile("Concatenazione2.txt");
    		x.close();
    
    	}
    
    }
    ma è l'unica soluzione possibile? non è possibile farlo funzionare in qualche modo senza dover invocare quel metodo close nella classe di test?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da auron567
    ma è l'unica soluzione possibile?
    L'unica no .... ma comunque è una che ha senso.

    Un'altra soluzione sarebbe questa: istanziare CatFiles passando sempre il nome del file ma non istanziare subito un oggetto per la scrittura (basta solo tenersi il nome del file).
    All'interno del metodo concatenaFile() si apre il file di destinazione specificando di fare l'"append" (non sovrascrittura) .... vedi costruttori di FileOutputStream quindi copiare e poi chiudere entrambi gli stream.

    Le strade sono poi semplicemente 2 (non me ne vengono in mente altre ....):

    a)
    Apri destinazione
    Apri, leggi e copia la sorgente 1, chiudi
    Apri, leggi e copia la sorgente 2, chiudi
    ...
    Chiudi destinazione

    Oppure

    b)
    Apri destinazione per l'append
    Apri, leggi e copia la sorgente 1, chiudi
    Chiudi destinazione
    Apri destinazione per l'append
    Apri, leggi e copia la sorgente 2, chiudi
    Chiudi destinazione
    ....

    Insomma ... non è che te ne puoi inventare molti altri ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    52
    Originariamente inviato da andbin
    L'unica no .... ma comunque è una che ha senso.

    Un'altra soluzione sarebbe questa: istanziare CatFiles passando sempre il nome del file ma non istanziare subito un oggetto per la scrittura (basta solo tenersi il nome del file).
    All'interno del metodo concatenaFile() si apre il file di destinazione specificando di fare l'"append" (non sovrascrittura) .... vedi costruttori di FileOutputStream quindi copiare e poi chiudere entrambi gli stream.

    Le strade sono poi semplicemente 2 (non me ne vengono in mente altre ....):

    a)
    Apri destinazione
    Apri, leggi e copia la sorgente 1, chiudi
    Apri, leggi e copia la sorgente 2, chiudi
    ...
    Chiudi destinazione

    Oppure

    b)
    Apri destinazione per l'append
    Apri, leggi e copia la sorgente 1, chiudi
    Chiudi destinazione
    Apri destinazione per l'append
    Apri, leggi e copia la sorgente 2, chiudi
    Chiudi destinazione
    ....

    Insomma ... non è che te ne puoi inventare molti altri ....
    ok, grazie ancora una volta per i consigli, sempre molto utili ed efficienti!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.