Scanner controBufferedReader
-
19-09-2019 - |
Domanda
Per quanto ne so, vengono utilizzati i due metodi più comuni per leggere i dati basati sui caratteri da un file in Java Scanner
O BufferedReader
.So anche che il BufferedReader
leggere i file in modo efficiente utilizzando un buffer per evitare operazioni sul disco fisico.Le mie domande sono:
- Fa
Scanner
si comporta così comeBufferedReader
? - Perché sceglieresti?
Scanner
SopraBufferedReader
o vice versa?
Soluzione
Scanner
viene utilizzato per analizzare i token dal contenuto del torrente, mentre BufferedReader
appena legge il flusso e non fa alcuna analisi speciale.
In realtà è possibile passare un BufferedReader
ad un scanner
come fonte di caratteri da analizzare.
Altri suggerimenti
Nel momento ultima JDK6 versione / build (B27), il Scanner
ha un buffer più piccolo ( 1024 caratteri ) in contrasto con il BufferedReader
( 8192 caratteri ), ma è più che sufficiente.
Per quanto riguarda la scelta, utilizzare il Scanner
se si desidera parse il file, utilizzare il BufferedReader
se si desidera lettura il file riga per riga. Si veda anche il testo introduttivo della loro documentazione API aforelinked.
- Analisi = interpretare l'informazione fornita come token (parti). E 'in grado di restituire voi specifiche parti direttamente come int, string, decimale, ecc Vedi anche tutti quei metodi
nextXxx()
in classeScanner
. - Lettura = Streaming muto. Si continua a dare indietro voi tutti i personaggi, che si a loro volta hanno per ispezionare manualmente se si desidera abbinare o comporre qualcosa di utile. Ma se non c'è bisogno di farlo comunque, quindi la lettura è sufficiente.
link , seguente è citato da lì:
Un BufferedReader è una semplice classe significava per leggere in modo efficiente dal flusso subalterno. In generale, ogni richiesta di lettura costituito da un lettore come un FileReader provoca una richiesta di lettura corrispondente da apportare flusso sottostante. Ogni invocazione di read () o readLine () potrebbe causa byte da leggere dal file, convertito in caratteri e poi tornò, che può essere molto inefficiente. L'efficienza è migliorata sensibilmente Se un lettore viene deformato in un BufferedReader.
BufferedReader è sincronizzato, così operazioni di lettura su un BufferedReader può tranquillamente essere fatto da più thread.
Uno scanner d'altra parte ha molto più formaggio integrato in esso; esso può fare tutto ciò che un BufferedReader può fare e allo stesso livello di efficienza pure. Tuttavia, in aggiunta uno scanner in grado di analizzare la flusso sottostante per i tipi primitivi e stringhe utilizzando regolari espressioni. Può anche tokenize flusso sottostante con la delimitatore di vostra scelta. Si può anche fare la scansione in avanti della flusso sottostante trascurando il delimitatore!
Uno scanner tuttavia non è thread-safe, deve essere esternamente sincronizzato.
La scelta di utilizzare un BufferedReader o uno scanner dipende dal codice si sta scrivendo, se si sta scrivendo una semplice lettura log Buffered lettore è adeguata. Tuttavia, se si sta scrivendo un parser XML scanner è la scelta più naturale.
Anche durante la lettura l'ingresso, se vogliono accettare linea di inserimento da la linea e dire basta aggiungere a un file, un BufferedReader è abbastanza buono. D'altra parte, se si desidera accettare l'input dell'utente come un comando con più opzioni, e poi intendono eseguire diverse operazioni sulla base del comando e le opzioni specificati, uno scanner si adatta meglio.
-
BufferedReader
ha significativamente più grande memoria buffer di scanner. UtilizzareBufferedReader
se si desidera ottenere stringhe lunghe da un ruscello, e utilizzareScanner
se si vuole analizzare specifico tipo di gettone da un ruscello. -
Scanner
può utilizzare tokenize utilizzando delimitatore personalizzato e analizzare il flusso in tipi primitivi dei dati, mentreBufferedReader
può solo leggere e memorizzare Stringa. -
BufferedReader
è sincrona mentreScanner
non è. UtilizzareBufferedReader
se si sta lavorando con più thread. -
Scanner
nasconde IOException duranteBufferedReader
getta immediatamente.
Suggerisco di usare BufferedReader
per la lettura del testo. Scanner
nasconde IOException
mentre BufferedReader
getta immediatamente.
Differenza fra BufferedReader E Scanner stanno seguendo:
- BufferedReader lo è sincronizzato ma Scanner lo è non sincronizzato.
- BufferedReader lo è sicuro per il filo ma Scanner lo è non thread-safe.
- BufferedReader ha una memoria buffer più grande ma Scanner ha una memoria buffer più piccola.
- BufferedReader lo è Più veloce ma Scanner lo è più lento nell'esecuzione.
Codice per leggere una riga dalla console:
BufferedReader:
InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br= new BufferedReader(isr); String st= br.readLine();
Scanner:
Scanner sc= new Scanner(System.in); String st= sc.nextLine();
Di seguito sono riportate le differenze tra BufferedReader e Scanner
- BufferedReader legge solo i dati ma lo scanner li analizza anche.
- È possibile leggere solo la stringa usando BufferedReader, ma puoi leggere int, lungo o galleggiare usando lo scanner.
- BufferedReader è più vecchio dallo scanner, esiste da JDK 1.1 mentre lo scanner è stato aggiunto sulla versione JDK 5.
- La dimensione del tampone del bufferedReader è grande (8kb) rispetto a 1 kb di scanner.
- BufferedReader è più adatto per la lettura di file con stringa lunga mentre lo scanner è più adatto per la lettura di piccoli input utente dal prompt dei comandi.
- BufferedReader è sincronizzato ma lo scanner non lo è, il che significa che non è possibile condividere lo scanner tra più thread.
- BufferedReader è più veloce dello scanner perché non ha trascorso il tempo ad analizzare
- BufferedReader è un po' più veloce rispetto a Scanner
- BufferedReader proviene dal pacchetto Java.io e lo scanner è del pacchetto Java.util sulla base dei punti che possiamo selezionare la nostra scelta.
Grazie
le differenze principali:
- Scanner
- Un semplice scanner di testo che può analizzare i tipi primitivi e le stringhe utilizzando le espressioni regolari.
- A Scanner rompe il suo input in token utilizzando un modello delimitatore, che di default corrisponde a spazi bianchi. I gettoni risultanti possono poi essere convertiti in valori di tipi diversi utilizzando i diversi metodi seguenti.
Esempio
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();
stampa il seguente output:
1
2
red
blue
La stessa uscita può essere generato con questo codice, che utilizza un'espressione regolare per analizzare tutti i quattro gettoni contemporaneamente:
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input);
s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
System.out.println(result.group(i));
s.close(); `
-
BufferedReader:
-
Legge testo da un flusso di immissione di caratteri, buffer caratteri in modo da provvedere alla lettura efficace dei caratteri, array e linee.
-
La dimensione del buffer può essere specificato, o la dimensione predefinita può essere utilizzato. Il valore di default è abbastanza grande per la maggior parte degli scopi.
-
In generale, ogni richiesta di lettura costituito da un lettore provoca una richiesta di lettura corrispondente ad essere fatto di flusso di caratteri o byte sottostante. E 'quindi consigliabile avvolgere un BufferedReader intorno a qualsiasi lettore di cui read () le operazioni possono essere costosi, come ad esempio FileReaders e InputStreamReaders. Ad esempio,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
si tamponare l'input dal file specificato. Senza buffering, ogni chiamata read () o readLine () potrebbe causare byte da leggere dal file, convertite in caratteri e quindi restituito, che può essere molto inefficiente. I programmi che utilizzano DataInputStreams per l'input testuale possono essere localizzati sostituendo ogni DataInputStream un BufferedReader appropriata.
Fonte: link
Ci sono diversi modi di prendere in ingresso in Java come:
1) BufferedReader 2) Scanner 3) Argomenti della riga di comando
BufferedReader Leggere testo da un flusso di immissione di caratteri, buffer caratteri in modo da provvedere alla lettura efficace dei caratteri, array e linee.
Dove Scanner è un semplice scanner di testo che può analizzare i tipi primitivi e stringhe utilizzando espressioni regolari.
se si sta scrivendo un semplice lettore di lettura log buffer è adeguata. se si sta scrivendo uno scanner parser XML è la scelta più naturale.
Per ulteriori informazioni si prega di consultare:
La risposta seguente è tratta da Lettura da Console:Scanner JAVA rispetto a BufferedReader
Quando si legge un input dalla console, esistono due opzioni per raggiungere questo obiettivo.Primo utilizzo Scanner
, un altro utilizzando BufferedReader
.Entrambi hanno caratteristiche diverse.Significa differenze su come usarlo.
Lo scanner ha trattato l'input fornito come token.BufferedReader legge semplicemente riga per riga l'input fornito come stringa.Lo scanner stesso fornisce funzionalità di analisi proprio come nextInt(), nextFloat().
Ma quali sono le differenze tra gli altri?
- Lo scanner ha trattato l'input fornito come token.BufferedReader come linea di flusso/stringa
- Lo scanner ha tokenizzato l'input fornito utilizzando regex.Utilizzando BufferedReader è necessario scrivere codice aggiuntivo
- BufferedReader più veloce dello scanner *punto n.2
- Lo scanner non è sincronizzato, BufferedReader sincronizzato
Lo scanner viene fornito a partire dalla versione JDK 1.5 successiva.
Quando utilizzare lo scanner o il lettore bufferizzato?
Guarda le principali differenze tra entrambi, uno utilizza tokenizzato, altri utilizzano stream line.Quando sono necessarie funzionalità di analisi, utilizzare invece Scanner.Ma mi sento più a mio agio con BufferedReader.Quando hai bisogno di leggere da un file, usa BufferedReader, perché usa il buffer quando leggi un file.Oppure puoi utilizzare BufferedReader come input per Scanner.
-
BufferedReader probabilmente vi darà la migliore prestazione (a causa dello scanner è basata su InputStreamReader, cercare fonti).UPS, per la lettura di file che utilizza nio. Quando ho provato prestazioni nio contro prestazioni BufferedReader per file di grandi dimensioni NIO mostra un po 'meglio le prestazioni. - Per la lettura dal file provare Apache Commons IO.
Io preferisco Scanner
perché non getta eccezioni controllate e quindi è risultato di utilizzo in un codice più snello.