Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Salvare dati di un programma

    Ciao a tutti, sto creando un piccolo programma che quando viene avviato printa in console una certa variabile dal valore inserito dall'utente. Vorrei che questa variabile possa essere salvata e che in un nuovo avvio possa essere printata col valore in cui è stata salvata. Ecco il codice:



    import java.util.Scanner;

    public class Prova{

    public static int x;
    public static Scanner scanner;

    public static void main(String[] args) {
    System.out.println("x è una variabile dal valore:");
    System.out.println(x);

    System.out.println("Inserire nuovo valore di x");
    scanner = new Scanner(System.in);
    x = scanner.nextInt();

    System.out.println("Il nuovo valore di x è:");
    System.out.println(x);

    System.exit(0);
    }
    }

    P.S. sono un principiante non conosco molte cose di java apparte le interfaccie grafiche e l input e l output
    Ultima modifica di Leosavi25; 04-08-2017 a 14:45

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Trovi una spiegazione su come mantenere lo stato dell'applicazione al successivo avvio ad esempio qui : https://www.iprogrammatori.it/forum-...html?hilit=Xml

    A mio parere all'inizio, per fare pratica, puoi tranquillamente usare un semplice file di testo. Per qualsiasi dubbio chiedi pure qui.

  3. #3
    Fino a qui cercando su internet avevo capito, però il mio problema è a livello di codice: come faccio a scrivere un file di testo per esempio .txt e scriverci sopra e poi successivamente rileggerlo? E se ho piu variabili, come faccio a dire a java quale è la variabile a e la variabile b?

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ci sono molte classi che permettono di scrivere/leggere file di ogni tipo, BufferedReader/Writer, PrintWriter, classi per la scrittura e lettura di oggetti ...
    Fai una ricerca su internet per vedere le varie differenze, io sono abituato a usare PrintWriter in scrittura e a leggere i file per riga con la classe BufferedReader, ma puoi fare in molti modi.

    Scrivere e ricostruire un oggetto con più variabili non è immediato, per questo avevo linkato una discussione che ti desse una panoramica un po' generale.
    Se usi un formato standard tra quelli citati il lavoro è già in gran parte svolto, ad esempio tramite la serializzazione è possibile scrivere e leggere un oggetto su file con poche righe di codice, e non devi preoccuparti praticamente di niente (cerca esempi in rete sull'uso della serializzazione degli oggetti).

    Se vuoi scrivere tu un tuo file, ad esempio un file di testo, devi preoccuparti di come distinguire le varie informazioni per ricostruire l'oggetto, e la cosa può creare problemi.
    Se hai campi (es. stringhe) di lunghezza fissa potresti anche pensare di scrivere tutto consecutivamente e poi spezzare la stringa che leggi nelle varie parti, oppure potresti usare un carattere di separazione tra le variabili, o scrivere una variabile per riga, etc...
    Ma potresti trovarti in situazioni in cui il formato viene sballato dal fatto di avere un campo che contiene all'interno il carattere di separazione scelto, o se ci sono informazioni mancanti o quant'altro.
    Per questo sarebbe meglio affidarsi a procedimenti già consolidati.

    Tuttavia la scrittura/lettura/modifica di file è una skill importante da acquisire (almeno dal mio punto di vista), quindi all'inizio potresti far pratica con un semplice file di testo.

    Ti posto sotto un esempio di scrittura e lettura di file, in cui memorizzo i dati relativi a Persone (nome e cognome) su righe diverse di un semplice file di testo.

    Alcune note:

    - Quando usi una classe di IO devi ricordarti di richiamare il metodo close sullo stream. Se non lo fai potresti avere diversi problemi, tra cui la creazione di un file vuoto ad esempio.
    - L'utilizzo delle suddette classi può generare eccezioni (banalmente il percorso del file potrebbe essere invalido). Devi quindi dichiarare l'eccezione o gestirla esplicitamente in un blocco try-catch. In questo caso dovresti anche usare il blocco finally, per assicurarti che la risorsa sia chiusa in ogni caso.
    - Da java 7 in poi puoi usare il costrutto try-with-resources (vedi metodo scriviPersona), che gestisce da solo la chiusura delle risorse inizializzate.
    - In generale le classi che si occupano della scrittura di un file sovrascrivono un file precedente con lo stesso nome. Per evitare che ciò accada devi preoccupartene tu (controlla sempre la documentazione). Nel mio esempio il metodo aggiungiPersona passa al costruttore di PrintWriter un FileWriter a cui è stato specificato di usare la modalità "append" (con il parametro booleano).
    - Generalmenete con BufferedReader si segue il procedimento che ho commentato nel codice, ovvero leggere una riga alla volta e fare qualcosa con la riga letta.
    Nel mio esempio, visto che ipotizzo che il file sia scritto a blocchi di due righe (contenenti nome e cognome delle persone) seguo un approccio diverso in lettura, ma se il file è mal formato puoi andare incontro a diversi tipi di errore.

    codice:
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    public class TestFile
    {
    	public static void main (String [] a) {
    		scriviPersona (new Persona ("Mario", "Rossi"), "Esempio.txt");
    		aggiungiPersona (new Persona ("Paolo", "Verdi"), "Esempio.txt");
    		leggiPersone ("Esempio.txt");
    	}
    	private static void scriviPersona (Persona persona, String path) {
    		try (PrintWriter writer = new PrintWriter (path)) {
    			writer.println (persona.getNome ());
    			writer.println (persona.getCognome ());
    		}
    		catch (Exception e) {
    			e.printStackTrace ();
    		}
    	}
    	private static void aggiungiPersona (Persona persona, String path) {
    		PrintWriter writer = null;
    		try  {
    			writer = new PrintWriter (new FileWriter (path, true)); 
    			writer.println (persona.getNome ());
    			writer.println (persona.getCognome ());
    		}
    		catch (Exception e) {
    			e.printStackTrace ();
    		}
    		finally {
    			if (writer != null) writer.close ();
    		}
    	}
    	private static void leggiPersone (String path) {
    		ArrayList <Persona> persone = new ArrayList <Persona> ();
    		try (BufferedReader reader = new BufferedReader (new FileReader (path))) {
    			/* String line;
    			while ((line = reader.readLine ()) != null) {
    				// fai qualcosa con la linea letta, ad esempio la aggiungi ad una lista di stringhe per "memorizzare" l'intero file e poi elaborarlo o altro ...
    			} */
    			while (true) {
    				String nome = reader.readLine ();
    				String cognome = reader.readLine ();
    				if (nome == null || cognome == null) break;
    				else persone.add (new Persona (nome, cognome));
    			}
    		}
    		catch (Exception e) {
    			e.printStackTrace ();
    		}
    		System.out.println ("Lista di persone trovate nel file : " + System.lineSeparator () + persone);
    	}
    }
    class Persona
    {
    	private String nome, cognome;
    	public Persona (String nome, String cognome) {
    		this.nome = nome;
    		this.cognome = cognome;
    	}
    	public String getNome () {
    		return nome;
    	}
    	public String getCognome () {
    		return cognome;
    	}
    	@Override public String toString () {
    		return nome + " " + cognome;
    	}
    }
    Ho messo molta carne al fuoco, prova però a cercare in internet le cose a cui ho fatto riferimento, poi se ci sono problemi siamo qui apposta !
    Ultima modifica di Ansharja; 11-08-2017 a 08:07

  5. #5
    Grazie per il codice, il funzionamento sono riuscito a capirlo, però se voglio salvare tramite variabili come potrei fare?

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da Leosavi25 Visualizza il messaggio
    Grazie per il codice, il funzionamento sono riuscito a capirlo, però se voglio salvare tramite variabili come potrei fare?
    Se vuoi salvare lo stato dell oggetto così com'è, senza preoccuparti di inventarti un tuo formato, lo ripeto, puoi usare la serializzazione (ti avevo già consigliato di cercare in rete), o un altro dei metodi scritti nella discussione che avevo linkato (per i miei scopi ridotti io ho sempre usato la serializzazione, non saprei consigliarti al momento su altri metodi).

    Puoi leggere qualcosa sulla serializzazione ad esempio a questo link :
    https://www.google.com/url?sa=t&sour...rtw2TaCODgmM3A , ma devi abituarti a cercare tu in rete e nella documentazione ufficiale le cose di cui hai bisogno

  7. #7
    ok grazie mille

  8. #8
    pensavo volesse dire senza far uso di file.
    In tal caso non è possibile, perché le variabili sono salvate sulla RAM che viene cancellata alla fine del programma

    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  9. #9
    si si facendo uso di file lo so che tutto viene resettato alla fine del programma

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.