Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [JAVA] Salvare su file di testo

    Salve a tutti. Premetto che sono un novello di Java e sto imparando qualcosa. Veniamo al dunque:
    Ho una classe che mi restituisce un oggetto Libro con varie caratteristiche (numero identificativo, costo, ecc). Il problema è che non so come fare a salvare queste caratteristiche in un file (ad esempio di testo). Fino ad ora so solo come vederlo in una finestra di shell ma così facendo mi è impossibile recuperare quei dati. Sicuramente per voi è una sciocchezza, quindi, per piacere aiutatemi.

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Dai uno sguardo al package java.io

    Ciao.
    Slack? Smack!

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Esiste la classe PrintStream che ti permette di salvare del testo in un file.
    Devi innanzitutto creare un oggetto di tipo FileOutputStream, poi utilizzarlo per creare un oggetto di tipo PrintStream.
    Questo oggetto ti mette a disposizione i metodi print e println con i quali puoi scrivere il testo che desideri (immagino che la classe Libro abbia dei metodi predisposti per restituire le informazioni come oggetti String, nel caso non le avesse esiste sempre il metodo predefinito di tutti gli object toString()).

    Ti faccio un esempio di utilizzo:

    codice:
    String nomefile = "nome_del_file" // nome_del_file è il nome del file da creare con il suo percorso
    FileOutputStream fos = new FileOutputStream(nomefile);
    PrintStream ps = new PrintStream(fos);
    
    //Ora scrivo "ciao" nel file e torno a capo
    ps.println("ciao");
    
    //Ora scrivo le info di un oggetto di tipo Libro nel file
    ps.println(mioLibro); // mioLibro è un oggetto di tipo Libro
    Per ulteriori informazioni consulta la documentazione Java all'indirizzo http://java.sun.com


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Sinceramente c'ho guardato ma in mezzo a quel mare di classi non so a quale riferirmi. Non è che potresti essere più preciso sulla classe da usare?

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  5. #5
    Ops, non m'ero accorto che era già arrivata un'altra risposta!!

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  6. #6
    Dunque, ho trovato questa classe che fa al caso mio: mi aiuto con un esempio:
    codice:
    try
    		{
    			String nomefile = "Libri.txt";
    			FileOutputStream fos = new FileOutputStream(nomefile);
    			PrintStream ps = new PrintStream(fos);
    			ps.println("Esempio");
    			
    				for(int i = 0; i < testi.length; i++)
    					{
    						ps.println("N." + testi[i].getNumeroProgressivo() +
    						" Nome: " + testi[i].getNome() + " Stipendio: " + 
    						testi[i].getStipendioIniziale() +
    						" Nuovo: " + testi[i].getNuovoStipendio());
    					}
    				
    			
    
    			
    		}
    		catch (IOException e)
    		{
    			e.printStackTrace();
    		}
    Quello che vorrei sapere, adesso, è se per caso posso recuperare questi dati scritti in un file per poter ricreare gli stessi oggetti con le stesse caratteristiche e magari aggiungerne di nuovi.
    Grazie a tutti

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Per la tua esigenza, ti consiglio di usare la classe ObjectOutputStream.
    Questa classe ti consente di salvare IL TUO OGGETTO in un file e di poterlo recuperare in seguito tramite una lettura del file, senza perdita di informazioni (nemmeno con strutture dati particolari come i grafi circolari).
    Il file risultante non è un file di testo leggibile, ma un file in bytecode interpretabile da Java.
    E' importante che tu costruisca la tua classe aggiungendo l'implementazione di Serializable (java.io.Serializable) come mostrato nell'esempio seguente:

    codice:
    public class Libro  implements Serializable  {
       ... // costruttore, metodi, variabili, tutto come prima
    }
    Ora il tuo oggetto può essere salvato su file:

    codice:
    String filename = "nome_file";
    FileOutputStream fos = new FileOutputStream(filename);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    
    // Ho un oggetto Libro
    Libro l = new Libro(...);
    
    // Ora salvo il mio oggetto libro sul file
    oos.writeObject(l);
    
    // Se ora voglio recuperarlo dal file:
    FileInputStream fis = new FileInputStream(nomefile);
    ObjectInputStream ois = new ObjectInputStream(fis);
    
    // Leggo un oggetto dal file
    Libro l = (Libro) ois.readObject();
    Se ti servono ulteriori informazioni puoi sempre chiedere (e comunque esiste sempre la salvezza: http://java.sun.com )


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    indubbiamente la serializzazione è una soluzione migliore rispetto al salvataggio (e al successivo parsing in fase di lettura) sul file di testo. Il difetto di questa soluzione è che nel momento in cui vai a cambiare la classe Libro, non puoi piu' leggere eventuali files contenti istanze della vecchia versione di Libro serializzate in precendeza ( nn so se mi sono spiegato bene) ...

    Insommma, se vuoi fare le cose fatte veramente bene usa un DB

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Indubbiamente la soluzione con DB è da preferire... solo che non tutti possono permettersi questa soluzione. Una variante un po' più casalinga forse è più a portata di mano... (soprattutto se non si sa come interfacciarsi con un db o non si hanno esperienze in questo campo).




    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Magari ho capito male, ma mi state dicendo che salvando in un file di testo dopo non sono in grado di recupeare le vecchie istanze della classe Libro? Forse stò sbagliando ma mi sembra di averle recuperate:
    codice:
    import java.util.*;
    import java.io.*;
    import javax.swing.*;
    public class TestLettura3
    {
    	public static void main(String[]args)throws Exception
    	{
    		
    		
    		String input2 = JOptionPane.showInputDialog("Vuoi aprire? S/N");
    		if (input2.equalsIgnoreCase("s"))
    		{
    			
    			FileInputStream file = new FileInputStream("archivio.dat");
    			ObjectInputStream in = new ObjectInputStream(file);
    			
    			ArrayList libri2 =(ArrayList)in.readObject();
    			in.close();
    			for(int i = 0; i<libri2.size();i++)
    			{
    				Libro2 l = (Libro2)libri2.get(i);
    				System.out.println("nome="+l.getNome());
    			}
    			
    			
    		}
    		String input = JOptionPane.showInputDialog("Vuoi salvare? S/N");
    		if (input.equalsIgnoreCase("s"))
    		{
    				ArrayList libri = new ArrayList();
    				libri.add(new Libro2("Lupo",30000));
    				libri.add(new Libro2("gggg",5000));
    				libri.add(new Libro2("gfddfdgg",7000));
    				
    				FileOutputStream file = new FileOutputStream("archivio.dat");
    				ObjectOutputStream out = new ObjectOutputStream(file);
    				out.writeObject(libri);
    				out.close();
    				
    		}
    		
    		System.exit(0);
    	}
    }
    class Libro2 implements java.io.Serializable
    {
    	public Libro2(String aNome, double aCosto)
    	{
    		nome = aNome;
    		costo = aCosto;
    	}
    	public String getNome()
    	{
    		return nome;
    	}
    	public double getCosto()
    	{
    		return costo;
    	}
    	private String nome;
    	private double costo;
    	
    	private void writeObject(java.io.ObjectOutputStream out)
    	throws IOException
    	{
    		out.writeObject(nome);
    		out.writeDouble(costo);
    	}
    	private void readObject(java.io.ObjectInputStream in)
    	throws IOException, ClassNotFoundException
    	{
    		nome = (String)in.readObject();
    		costo = (double)in.readDouble();
    	}
    }
    Per favore ditemi se stò sbagliando o sono sulla strada giusta. Ho testato il programma e mi sembra di importare tutto facendo poi un cast (l'unico problema è che prima bisogna salvare e poi aprire in quanto il file "archivio.dat" non contiene ArrayList all'inizio).

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

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 © 2025 vBulletin Solutions, Inc. All rights reserved.