2012-01-26 13 views
13

Disclaimer: Ho esaminato tutte le domande che riesco a trovare e nessuna risponde a questa domanda esatta. Se ne trovi uno per favore indicami ed educati.Utilizzare File o FileReader con Scanner?

Così, il Oracle I/O tutorial apre un file di testo con scanner come segue:

new Scanner(BufferedReader(FileReader("xanadu.txt"))); 

Ma la Javadoc apre un file di testo con scanner in questo modo:

new Scanner(new File("myNumbers")); 

Sarebbe bello utilizzare il metodo più semplice, soprattutto quando ho un piccolo file e posso vivere con il buffer più piccolo, ma ho anche visto persone dire che quando apri un file direttamente, fai il can't close it. Se è così, perché questo idioma è usato nella documentazione ufficiale?

Modifica: ho anche visto new Scanner(FileReader("blah.txt")); ma questo sembra il peggiore di entrambi i mondi.

Modifica: non sto tentando di avviare un dibattito sull'utilizzo dello scanner o meno. Ho una domanda su come usare Scanner. Grazie.

risposta

5

Si potrebbe guardare all'implementazione di Scanner (JDK viene fornito con il codice sorgente). Esiste anche un metodo close() nella classe Scanner. In sostanza, entrambi gli approcci elencati sono identici per il tuo caso di lettura di file di piccole dimensioni - non dimenticare di chiamare close() alla fine.

+1

Come sottolineato da @Tudor, File non si chiude() - così il file reale si chiude quando si utilizza Scanner in questo modo, o la risorsa rimane sospesa? – orbfish

+3

Sì, se si passa File al programma di sviluppo Scanner, viene utilizzato per aprire il flusso che verrebbe chiuso dopo aver chiamato il metodo Scanner.close(). Non importa quale costruttore si usi se si chiama close() correttamente (ad esempio da try/finally) quindi sarebbe correttamente chiuso. – maximdim

-2

Esistono diversi modi per costruire un oggetto Scanner.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

Io personalmente non avrei nemmeno utilizzare scanner per la lettura di file però. Guarda le esercitazioni di BufferedReader. Non è troppo difficile da capire.

+0

Questo non risponde alla mia domanda. Per favore, leggi la domanda se hai intenzione di rispondere. Nota: c'è un sacco di dibattito là fuori sul fatto di usare Scanner o Straight BufferedReader. Entrambi sono forniti da Java, sto cercando di capire le migliori pratiche per usarlo, non decidere se usarlo. – orbfish

+0

http://docs.oracle.com/javase/tutorial/essential/io/scanning.html – bdabmxican

+0

Sì, l'ho letto, non ha risposto alla mia domanda, che sapresti se leggessi la mia domanda! – orbfish

2

La classe File non ha il metodo close() perché assorbe solo un file su disco. Non è un flusso di input per il file, quindi non c'è nulla da chiudere.

+0

Sì, so che il file non è chiudibile. Quindi, lasci in sospeso una risorsa (come suggerito dal link nella domanda) oppure no? – orbfish

+2

Non lasciare nulla in giro. La classe File è solo un supporto di informazioni per un file fisico. Non è un handle di file. – Tudor

1

Sì, puoi farlo.

Fondamentalmente è fare:

Scanner file = new Scanner(new FileReader("file.txt")); 

per leggere una stringa:

String s = file.next(); 

Quando si è fatto con il file, fare

file.close(); 
1

Cavalli per i corsi. Da scanner javadocs, uno scanner è "A semplice scanner che può analizzare tipi e stringhe primitive utilizzando le espressioni regolari ". Quindi, la mia opinione sulla tua domanda è: non importa quale approccio usi, l'opzione più semplice con File è buona come quella che si trova nei tutorial di Oracle. Lo scanner è utile per la tokenizzazione di file di testo e, se il file è piccolo, come hai detto, è perfetto.

Poiché uno scanner utilizza espressioni regolari, non ci si può davvero aspettare grandi prestazioni con esso, indipendentemente dal fatto che si crei o meno un lettore di file bufferizzato per lo scanner.Il sottostante Leggibile sarà close() d (se è un Closeable, quale sarà, se si usa il costruttore Scanner (File)), e quindi non ti devi preoccupare finché si chiude() il tuo oggetto Scanner (o usare try-with-resources).

Problemi correlati