PDA

View Full Version : [JAVA]Scrittura su file


Attila7894
08-09-2009, 14:04
Salve a tutti :) Avrei bisogno di un aiuto. In questa situazione


File atti = new File("/PD_Software/src/FilmRandom/lista");
Scanner input = new Scanner(atti);

cosa devo fare per poter anche scrivere o rimuovere stringhe al file atti?

wingman87
08-09-2009, 14:23
Puoi usare la classe PrintWriter: LINK (http://java.sun.com/j2se/1.5.0/docs/api/java/io/PrintWriter.html)

Attila7894
08-09-2009, 14:58
Ho visto un po' di classi che potrei utilizzare, ma non sò come implementarle nel mio caso.

wingman87
08-09-2009, 15:18
Esattamente cosa dovresti fare? La lettura e scrittura devono essere due operazioni distinte o hai bisogno mano a mano che leggi di fare delle operazioni di scrittura? Nel secondo caso la classe che dovresti usare credo sia RandomAccessFile: LINK (http://java.sun.com/j2se/1.5.0/docs/api/java/io/RandomAccessFile.html)
Se sei nel primo caso basta creare un oggetto PrintWriter e usare i suoi metodi print e/o println:
PrintWriter output=new PrintWriter(atti);
Ma attenzione, in questo modo il contenuto del file rappresentato da atti verrà cancellato, se invece vuoi aggiungere dei contenuti al file senza perdere quelli già presenti devi usare FileOutputStream che ha un costruttore apposito: LINK (http://java.sun.com/j2se/1.5.0/docs/api/java/io/FileOutputStream.html#FileOutputStream%28java.io.File,%20boolean%29)
PrintWriter output=new PrintWriter(new FileOutputStream(atti,true));
e poi usare i metodi print e/o println di PrintWriter come nell'altro caso

Attila7894
08-09-2009, 17:35
Ti spiego la mia situazione. Ho un'interfaccia con due bottoni, aggiungi e rimuovi, che permettono di rimuovere o aggiungere un elemento a una lista di elementi. All'apertura del programma la lista degli elementi viene inizializzata da un file di testo, in cui in ogni riga c'è un elemento. A quanto ho capito dovrei utilizzare il primo per scrivere. E per rimuovere?

Ho provato a utilizzare questo
PrintWriter output=new PrintWriter(new FileOutputStream(atti,true));

ma sia col metodo print che con write, sul file non viene scritto nulla...

wingman87
08-09-2009, 18:40
Al termine della scrittura devi chiudere lo stream con
output.close()
Prova così, e se ancora non funziona posta tutto il codice così posso consigliarti meglio

nuovoUtente86
08-09-2009, 19:09
prima di close chiama flush().

wingman87
08-09-2009, 19:13
Quando chiudi lo stream viene fatto automaticamente un flush

Attila7894
08-09-2009, 19:13
Grazie mille a entrambi per la disponibilità. Potreste spiegarmi l'utilità di flush() ?

Inoltre, come faccio stavolta a rimuovere una certa stringa dal file di testo?

wingman87
08-09-2009, 19:21
Il flush serve a scrivere ciò che si trova sul buffer sul disco. Se non fai né il flush né la close ciò che hai scritto sul buffer resta lì e le modifiche non vengono salvate sul disco.
Per togliere una certa riga devi leggere l'intero file, rimuovere la stringa che vuoi rimuovere e riscrivere l'intero file.
EDIT: in verità se fai una lettura riga per riga con l'ausilio di un file aggiuntivo puoi leggere una riga dal primo file e se non è quella che devi rimuovere ricopiarla nel secondo file. Vai avanti così fino alla fine e poi cancelli il vecchio file e lo rimpiazzi con il nuovo.

nuovoUtente86
08-09-2009, 19:29
Grazie mille a entrambi per la disponibilità. Potreste spiegarmi l'utilità di flush() ?

Inoltre, come faccio stavolta a rimuovere una certa stringa dal file di testo?

La soluzione più adatta è quella di riscrivere l' intero file.
Attraverso la classe RandomAccessFile puoi accedere al file in maniera selezionata, ma oltre al fatto di conoscere l' esatta posizione della stringa (potresti anche ricavarla, ma non ne vale la pena) ti si pone il problema di fillarne il valore per tutta la dimensione.

Attila7894
08-09-2009, 20:35
Grazie, un'ultima cosa. Ho un Box box in cui aggiungo oggetti scrivendo, ogni volta

FilmRandom.box.add(new JLabel(FrameAdd.txtadd.getText()));

gli oggetti JLabel non hanno quindi un proprio nome. Se io ne volessi togliere uno, sapendo il valore della stringa, cosa dovrei fare?

nuovoUtente86
08-09-2009, 22:08
Grazie, un'ultima cosa. Ho un Box box in cui aggiungo oggetti scrivendo, ogni volta

FilmRandom.box.add(new JLabel(FrameAdd.txtadd.getText()));

gli oggetti JLabel non hanno quindi un proprio nome. Se io ne volessi togliere uno, sapendo il valore della stringa, cosa dovrei fare?

dovresti farti restituire il set di oggetti(Label in questo caso) contenuti in BOX e ciclando eliminare le istanze corrispondenti. Nota che il confronto per Stringa per quanto riguarda i Component non è sicuro.

Attila7894
09-09-2009, 03:06
dovresti farti restituire il set di oggetti(Label in questo caso) contenuti in BOX e ciclando eliminare le istanze corrispondenti. Nota che il confronto per Stringa per quanto riguarda i Component non è sicuro.

E allora cosa potrei fare? In quali rischi incorro?

Ho creato questo metodo ma non funziona. file è dove è tenuta la lista, temp è il file di testo di supporto. Alla fine del metodo file è vuoto...

public static void removeFromFile(String a) throws IOException{
temp.createNewFile();
Scanner scan = new Scanner(file);
PrintWriter output=new PrintWriter(new FileOutputStream(FilmRandom.temp,true));


while(scan.hasNext()){

output.println(scan.next());
output.flush();
}
output.close();



FilmRandom.file.delete();
FilmRandom.file.createNewFile();
Scanner scann = new Scanner(temp);
PrintWriter outputt=new PrintWriter(new FileOutputStream(FilmRandom.file,true));
String s;
while(scann.hasNext()){
s=scann.next();
if(s!=a)outputt.println(s);
}
temp.delete();
}

banryu79
09-09-2009, 08:09
Ti spiego la mia situazione. Ho un'interfaccia con due bottoni, aggiungi e rimuovi, che permettono di rimuovere o aggiungere un elemento a una lista di elementi. All'apertura del programma la lista degli elementi viene inizializzata da un file di testo, in cui in ogni riga c'è un elemento. A quanto ho capito dovrei utilizzare il primo per scrivere. E per rimuovere?

Dirò una banalità (dato che non ho letto gli altri post dopo di questo, sono di frettissima) ma:
Visto che all'apertura del programma la lista degli elementi viene caricata tramite lettura dei dati da un file di testo, perchè non caricarla in una qualche struttura dati in memoria? Poi le varie operazioni di ADD e DELETE le fai sulla struttura dati e il file di testo lo riscrivi solo a chiusura programma (o in altro momeno da te scelto).

L'unico problema con questa soluzione è che se per qualche ragione l'applicazione fa "bum" a runtime (es. si stacca la spina del pc) prima dell'avvenuta scrittura sul file, le modifiche fatte alla lista vanno perse.

franksisca
09-09-2009, 10:26
Dirò una banalità (dato che non ho letto gli altri post dopo di questo, sono di frettissima) ma:
Visto che all'apertura del programma la lista degli elementi viene caricata tramite lettura dei dati da un file di testo, perchè non caricarla in una qualche struttura dati in memoria? Poi le varie operazioni di ADD e DELETE le fai sulla struttura dati e il file di testo lo riscrivi solo a chiusura programma (o in altro momeno da te scelto).

L'unico problema con questa soluzione è che se per qualche ragione l'applicazione fa "bum" a runtime (es. si stacca la spina del pc) prima dell'avvenuta scrittura sul file, le modifiche fatte alla lista vanno perse.

stavo per dire la stessa cosa...serializable e via...


inoltre io ho "risolto" questo problema facendo un salvataggio su file di backup e un "autocaricamenteo" in caso di crash...certo se hai la botta di :ciapet: ciao a tutti

Attila7894
09-09-2009, 13:24
Dirò una banalità (dato che non ho letto gli altri post dopo di questo, sono di frettissima) ma:
Visto che all'apertura del programma la lista degli elementi viene caricata tramite lettura dei dati da un file di testo, perchè non caricarla in una qualche struttura dati in memoria? Poi le varie operazioni di ADD e DELETE le fai sulla struttura dati e il file di testo lo riscrivi solo a chiusura programma (o in altro momeno da te scelto).

L'unico problema con questa soluzione è che se per qualche ragione l'applicazione fa "bum" a runtime (es. si stacca la spina del pc) prima dell'avvenuta scrittura sul file, le modifiche fatte alla lista vanno perse.

Dici quindi di implementare il tutto in un ArrayList, per esempio? Interessante, ora provo :D

franksisca
09-09-2009, 14:36
Dici quindi di implementare il tutto in un ArrayList, per esempio? Interessante, ora provo :D

se hai un identificativo meglio ancora una hashmap ;)