Newsgroup: it.comp.java
Titolo: Pikkolo problema con i file

Salve a tutti!
Vi ringrazio in anticipo per una possibile o eventuale risposta.
Sono alle prime armi con Java, e dopo aver imparato a gestire gli
eventi, solo X i pulsanti, sto cercando di imparare qualcosa sulla
gestione dei file.
Il mio scopo sarebbe quello di realizzare un contatore di accessi, ma
come ho visto questo crea dei problemi di protezione.
Qualcuno potrebbe spiegarmi almeno i rudimenti della gestione file? Per
favore? :)
Grazie in anticipo

favore? :)
E' un pelino complicato perche' i file si gestiscono in due modi:
gli Stream di input e output, visti come sequenze di byte (in parte
retaggio del vecchio Java 1.0); e i Reader e i Writer, sequenze
di caratteri (in Java, un carattere non e' un singolo byte, visto che
Java supporta Unicode -- 1 carattere == 2 byte...).  Gli approcci
basati sui soli Stream, gli unici a funzionare in Java 1.0, sono
deprecati per Java 1.1 (e successivi).  L'integrazione fra il
livello Stream e quello Reader/Writer e' decisamente incompleta
e imperfetta.
Secondo fattore di complicazione e' che l'approccio Java e' basato
sull'"annidamento" di oggetti-Stream (o Reader/Writer).  Ad es.,
un qualsiasi oggetto che implementa l'interfaccia fondamentale
Reader (java.io.Reader) fornisce solo metodi elementari per la
lettura di un char o di un array di char; se, come generalmente e',
richiedi funzionalita` supplementari (ad esempio, la lettura di una
RIGA di testo alla volta), puoi ottenerle solo "rivestendo" un altro
Reader (la vera fonte dei caratteri in input) con una opportuna
classe di incapsulamento (ad esempio, un BufferedReader).  Questo,
a differenza del problema accennato al paragrafo precedente che
e' indiscutibilmente un difetto, e' uno schema flessibile e potente;
resta il fatto che tende a confondere le idee ai principianti del
Java (a meno che non abbiano comunque un grosso background
di design-patterns dell'OO).
Ecco un esempio, in cui leggiamo un file riga per riga:
import 
java.io
;
public class prova {
    static public main(int argc, String[] argv) 
        throws IoException
    {
        BufferedReader brin = 
            new BufferedReader(
                new FileReader("file.txt")
            );       
        for(;;) {
            String riga =
                brin.readLine();
            if(riga==null) break;
            // qui si puo` elaborare
            // la riga appena letta
        }
    }
}
Da notare qui soprattutto la costruzione di brin: si
genera un BufferedReader passando al costruttore
il riferimento ad un altro Reader (qui, un FileReader
costruito a sua volta per leggere uno specifico file
di testo dal directory corrente).  Il metodo readLine()
torna la String della riga appena letta, null se siamo
alla fine del file.
Analogamente, per fare dell'output orientato alle
righe di caratteri, potremmo costruire anche un
BufferedWriter (passandogli un altro Writer...) per
usare il suo metodo newLine() per "andare a capo".
In questi casi, per fortuna, la complicazione della
distinzione reader/stream ci viene nascosta.  In
altri casi, ahime`, questo non e' cosi` trasparente.
Per scrivere, ad esempio, dati Java formattati
(interi, double, ecc), bisognerebbe usare la
interfaccia DataOutput -- di cui esiste nella
libreria Java una implementazione per Stream,
ma non una per Writer.  L'alternativa e` fare tutta
la formattazione a livello di stringhe, e limitare
le operazioni di I/O su file all'I/O vero e proprio,
al massimo col concetto di separazione di righe.
(Le cose erano piu` semplici prima che Java 1.1
introducesse Reader e Writer, ma il support per
Unicode in I/O era allora insufficiente...).
Alex