Newsgroup: it.comp.java
Titolo: un piccolo suggerimento?

Salve.
Newbie in java purtroppo.
Ho un file di testo con righe di questo tipo:
12230543453435606066.
Devo estrarre una sottostringa di due caratteri e in base al valore aprire
un file relativo o crearlo se non esiste ed aggiungerci tutto il record.
Es. se la sottostringa == "06" dovro' aprire o creare un file chiamato
file.06 e aggiungerci il record.
Se la sottostringa == "03" il file sara' file.03 e cosi' via.
Il frammento di codice che ho provato ad utilizzare e':
public void separaPerAnno() throws IOException {
    this.clean();
    FileReader f_in = new FileReader("prova.txt");
    BufferedReader in = new BufferedReader(f_in);
    String riga = in.readLine();
    String anno = riga.substring(17, 19);
    File f = new File("file."+anno);
    if (f.exists()) {
      aggiungi record al file;
    }
    else {
      crea file e aggiungi record;
    }
}
non credo che vada bene, non foss'altro perche' cosi' facendo mi crea un
oggetto file tutte le volte anche quando tale oggetto esiste gia'.
Un suggerimento?

 oggetto file tutte le volte anche quando tale oggetto esiste gia'.
Invece va bene. Se crea l'oggetto java.io.File non significa che crea
anche il relativo file su disco. L'oggetto java.io.File è disconnesso
dal file stesso.

Vincent Vega wrote:

Si lo so ma comunque ogni volta che viene creato un oggetto viene occupato
un certo quantitativo di memoria.
Seguendo il mio codice viene letta la prima riga e la substring mi ritorna
"06".
Viene cosi' creato l'oggetto new File("file.06");
Ovviamente la lettura del file principale proseguira', la substring mi
ritorna "02", viene creato new File("file.02").
Si arriva alla n-esima riga dove la substring mi ritorna di nuovo "06".
Verrebbe creato un oggetto new File("file.06") che e' lo stesso che era
stato creato in precedenza.
Non e' uno spreco di memoria?
Non so poi se questo posssa portare ad altri problemi.....

music ha scritto:

ma che te frega, il garabage collector vedrà che i precedenit 
riferimenti a quegli oggetti file non c'è + e libererà la memoria.


Intanto puoi evitarti l'if
f.createNewFile();
//Aggiungi il record
Poi, ancor meglio, chiamando dir la cartella in cui depositi i file
fai all'inizio un bel
String [] lista = dir.list();
e poi per verificare la presenza del file ti basterà cercare nell'array

 riferimenti a quegli oggetti file non c'è + e libererà la memoria.
Corretto: tuttavia una new può voler dire scrittura su disco (e quindi
rallentamento).
Non è mai una cattiva idea quella di evitarla quando possibile.

pio...@inwind.it
 ha scritto:

Beh certo, su questo hai ragione soprattutto se consideriamo la non 
eccellenza delle prestazioni del GC.

>>>> I get words from the Allmighty Great Gnus that
FDSTS> Beh certo, su questo hai ragione soprattutto se consideriamo la
FDSTS> non eccellenza delle prestazioni del GC.
Più che altro il GC parte quando vuole lui, non c'è mai certezza che sia
richiamato...
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione

 e poi per verificare la presenza del file ti basterà cercare nell'array
si ma ogni volta devo lanciare lista = dir.list()?
altrimenti la lista non verra' aggiornata con gli ultimi files da me creati.

Sì, se è possibile che nel tuo file di testo lo stesso record si
possa ripetere.
Ma in tal caso allora forse è meglio se lasci perdere la lista e
lavori solo con createNewFile()

 lavori solo con createNewFile()
Scusa non ho capito.
lista = dir.list() serve a conoscere il contenuto di una certa directory.
Secondo il tuo suggerimento dovrei utilizzarla per sapere se un certo file
e' presente.
Se non c'e' andrebbe creato se c'e' aggiungo semplicemente quello che devo
aggiungere.
Poiche' tali files vanno creati in base al contenuto dei record letti da un
altro file e' possibile che la directory venga continuamente aggiornata
quindi per sapere se un certo file esiste gia' o no dovrei lanciare
continuamente lista = dir.list();
O non e' cosi'? 

 O non e' cosi'?
Ripeto: sì se la string di due byte (nel tuo esempio "06") si può
ripetere più di una volta all'interno del file. Altrimenti non hai
necessità di implementare la lista con i nomi dei file che stai
inserendo a runtime

pio...@inwind.it
 wrote:

si che si puo' ripetere piu' volte.
all'interno di un ciclo viene letto il file di riferimento, viene estratta
la substring e creato un file relativo, a questo file viene aggiunto il
record appena letto.
Se il file esiste gia', perche' precendente creato, viene solo aggiunto il
record appena letto.
Lo stesso valore della substring puo' ripetersi varie volte.
Ecco perche' devo sapere se un dato file esiste gia' o deve essere creato.
 

 Non e' uno spreco di memoria?
Se tu riutilizzi lo stesso reference per ogni nuova istanza, o comunque
fai in modo che ogni volta l'istanza vecchia venga dereferenziata, il
problema non si pone. Ci pensa il garbage collector.
Lo spreco di memoria ce l'avresti nel momento in cui rimane un
riferimento all'oggetto (magari statico) e l'istanza non viene mai
candidata per il gc.