Scanner versus BufferedReader

Voor zover ik weet, zijn de twee meest gebruikelijke methoden voor het lezen van op tekens gebaseerde gegevens uit een bestand in Java het gebruik van Scannerof BufferedReader. Ik weet ook dat de BufferedReaderbestanden efficiënt leest door een buffer te gebruiken om fysieke schijfbewerkingen te voorkomen.

Mijn vragen zijn:

  • Prestert Scannereven goed als BufferedReader?
  • Waarom zou u Scannerverkiezen boven BufferedReaderof omgekeerd?

Antwoord 1, autoriteit 100%

Scannerwordt gebruikt voor het ontleden van tokens uit de inhoud van de stream, terwijl BufferedReaderalleen de stream leest en geen speciale parsering uitvoert.

In feite kun je een BufferedReaderdoorgeven aan een Scannerals bron van te ontleden tekens.


Antwoord 2, autoriteit 95%

In de momenteel nieuwste JDK6 release/build (b27), de Scannerheeft een kleinere buffer (1024 tekens) in tegenstelling tot de BufferedReader(8192 tekens), maar het is meer dan voldoende.

Voor de keuze, gebruik de Scannerals je het bestand wilt parsen, gebruik de BufferedReaderals je wilt leeshet bestand regel voor regel. Zie ook de inleidende tekst van hun eerder gelinkte API-documentatie.

  • parsing = interpreteren van de gegeven invoer als tokens (onderdelen). Het is in staat om je specifieke onderdelen rechtstreeks te geven als int, string, decimaal, enz. Zie ook al die nextXxx()methoden in Scannerklasse.
  • lezen = domme streaming. Het blijft je alle personages teruggeven, die je op hun beurt handmatig moet inspecteren als je iets wilt matigen of iets nuttigs kunt maken. Maar als u dat hoe dan ook niet hoeft te doen, is het lezen voldoende.

Antwoord 3, Autoriteit 36%

Zie deze Link , het volgende is geciteerd Vanaf daar:

Een bufferedreader is een eenvoudige klasse bedoeld om efficiënt te lezen van de
ondergeschikte stroom. Over het algemeen, elk leesverzoek van een lezer als een
FileReader veroorzaakt een bijbehorend leesverzoek aan
onderliggende stroom. Elke aanroeping van lezen () of readline () zou kunnen
Oorzaak bytes te lezen uit het bestand, omgezet in karakters, en
dan geretourneerd, wat erg inefficiënt kan zijn. Efficiëntie is verbeterd
aanzienlijk als een lezer is kromgetrokken in een bufferedreader.

BufferedReader is gesynchroniseerd, dus lees operaties op een bufferedreader
kan veilig worden gedaan vanuit meerdere draden.

Een scanner aan de andere kant heeft veel meer kaas ingebouwd; het
kan alles doen wat een bufferedreader kan doen en op hetzelfde niveau van
Efficiëntie ook. Bovendien kan een scanner echter de
Onderliggende stroom voor primitieve typen en snaren met behulp van normaal
uitdrukkingen. Het kan ook de onderliggende stroom met de
Scheidingsteken van uw keuze. Het kan ook het scannen van de
Onderliggende stroom negeren de scheidingsteken!

Een scanner is echter geen draad veilig, het moet extern zijn
gesynchroniseerd.

De keuze om een BufferedReader of een Scanner te gebruiken hangt af van de code
u schrijft, als u een eenvoudige loglezer schrijft Buffered
lezer is voldoende. Als u echter een XML-parserscanner schrijft:
is de meer natuurlijke keuze.

Zelfs tijdens het lezen van de invoer, als u de invoerregel van de gebruiker wilt accepteren met
regel en zeg gewoon voeg het toe aan een bestand, een BufferedReader is goed genoeg.
Aan de andere kant, als u gebruikersinvoer wilt accepteren als een commando met
meerdere opties, en vervolgens van plan om verschillende bewerkingen uit te voeren
op basis van de opgegeven opdracht en opties is een scanner geschikt
beter.


Antwoord 4, autoriteit 19%

  1. BufferedReaderheeft een aanzienlijk groter buffergeheugen dan Scanner. Gebruik BufferedReaderals je lange strings uit een stream wilt halen, en gebruik Scannerals je een specifiek type token uit een stream wilt ontleden.

  2. Scannerkan tokenize gebruiken met behulp van een aangepast scheidingsteken en de stream ontleden in primitieve soorten gegevens, terwijl BufferedReaderalleen String kan lezen en opslaan.

  3. BufferedReaderis synchroon terwijl Scannerdat niet is. Gebruik BufferedReaderals u met meerdere threads werkt.

  4. Scannerverbergt IOException terwijl BufferedReaderhet onmiddellijk gooit.


Antwoord 5, autoriteit 9%

Ik raad aan om BufferedReaderte gebruiken voor het lezen van tekst. Scannerverbergt IOExceptionterwijl BufferedReaderhet onmiddellijk gooit.


Antwoord 6, autoriteit 7%

Het verschil tussen BufferedReaderen Scanneris het volgende:

  1. BufferedReader is gesynchroniseerdmaar Scanner is niet gesynchroniseerd.
  2. BufferedReader is threadsafemaar Scanner is niet thread-safe.
  3. BufferedReader heeft een groter buffergeheugenmaar Scanner heeft een kleiner buffergeheugen.
  4. BufferedReader is snellermaar Scanner is trager in uitvoering.
  5. Code om een regel van de console te lezen:

BufferedReader:

    InputStreamReader isr=new InputStreamReader(System.in);
     BufferedReader br= new BufferedReader(isr);
     String st= br.readLine();

//U kunt het object InputStreamReader-object binnen de BufferReader-methode maken.
BufferReader br = nieuwe BufferedReader(InputStreamReader(System.in));
String st = br.readLine();

// U kunt het type invoerstroom zelfs handmatig inspecteren door de Parse-methode te gebruiken die stringparameter accepteert.

   int x = Integer.parseInt(br.readLine());
    //or you can pass the object directly.
    int x = Integer.parseInt(st);

Scanner:

   Scanner sc= new Scanner(System.in);
    String st= sc.nextLine();

Antwoord 7, autoriteit 4%

Hier volgen de verschillen tussen BufferedReader en Scanner

  1. BufferedReader leest alleen gegevens, maar scanner analyseert ook gegevens.
  2. je kunt String alleen lezen met BufferedReader, maar je kunt int lezen,
    lang of zwevend met Scanner.
  3. BufferedReader is ouder dan Scanner, het bestaat uit jdk 1.1 terwijl
    Scanner is toegevoegd op JDK 5-release.
  4. De buffergrootte van BufferedReader is groot (8KB) in vergelijking met 1KB
    van Scanner.
  5. BufferedReader is meer geschikt voor het lezen van bestanden met een lange string
    terwijl Scanner meer geschikt is voor het lezen van kleine gebruikersinvoer van
    opdrachtprompt.
  6. BufferedReader is gesynchroniseerd, maar Scanner niet, wat betekent dat u
    kan Scanner niet tussen meerdere threads delen.
  7. BufferedReader is sneller dan Scanner omdat het geen tijd kost
    bij het ontleden
  8. BufferedReader is iets sneller in vergelijking met Scanner
  9. BufferedReader komt uit het java.io-pakket en Scanner komt uit het java.util-pakket
    op basis van de punten kunnen we onze keuze maken.

Bedankt


Antwoord 8, autoriteit 3%

De belangrijkste verschillen:

  1. Scanner

  • Een eenvoudige tekstscanner die primitieve typen en tekenreeksen kan ontleden met behulp van reguliere expressies.
  • Een scanner splitst zijn invoer op in tokens met behulp van een scheidingstekenpatroon, dat standaard overeenkomt met witruimte. De resulterende tokens kunnen vervolgens worden omgezet in waarden van verschillende typen met behulp van de verschillende volgende methoden.

Voorbeeld

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(); 

drukt de volgende uitvoer af:

1
 2
 red
 blue 

Dezelfde uitvoer kan worden gegenereerd met deze code, die een reguliere expressie gebruikt om alle vier de tokens tegelijk te ontleden:

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(); `


  1. BufferedReader:

    • Leest tekst uit een tekeninvoerstroom, waarbij tekens worden gebufferd om te zorgen voor een efficiënte lezing van tekens, arrays en regels.

    • De buffergrootte kan worden opgegeven, of de standaardgrootte kan worden gebruikt. De standaardwaarde is groot genoeg voor de meeste doeleinden.

Over het algemeen zorgt elk leesverzoek van een Reader ervoor dat er een overeenkomstig leesverzoek wordt gedaan van de onderliggende teken- of bytestroom. Het is daarom raadzaam om een BufferedReader om elke Reader te wikkelen waarvan de read()-bewerkingen kostbaar kunnen zijn, zoals FileReaders en InputStreamReaders. Bijvoorbeeld,

BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));

buffert de invoer van het opgegeven bestand. Zonder buffering kan elke aanroep van read() of readLine() ervoor zorgen dat bytes uit het bestand worden gelezen, worden omgezet in tekens en vervolgens worden geretourneerd, wat erg inefficiënt kan zijn.
Programma’s die DataInputStreams gebruiken voor tekstinvoer kunnen worden gelokaliseerd door elke DataInputStream te vervangen door een geschikte BufferedReader.

Bron:Link


Antwoord 9

Er zijn verschillende manieren om invoer in Java op te nemen, zoals:

1) BufferedReader 2) Scanner 3) Opdrachtregelargumenten

BufferedReader Lees tekst uit een tekeninvoerstroom, waarbij tekens worden gebufferd om te zorgen voor het efficiënt lezen van tekens, arrays en regels.

Waarbij Scanner een eenvoudige tekstscanner is die primitieve typen en tekenreeksen kan ontleden met behulp van reguliere expressies.

als u een eenvoudige logboeklezer schrijft Een gebufferde lezer is voldoende. als u een XML-parser schrijft, is Scanner de meest natuurlijke keuze.

Voor meer informatie verwijzen wij u naar:

http://java.meritcampus.com/t/240/Bufferedreader? tc=mm69


Antwoord 10

Het onderstaande antwoord is afkomstig van Lezen van console: JAVA Scanner vs BufferedReader

Als je een invoer van de console leest, zijn er twee opties om dat te bereiken. Eerst met Scanner, een ander met BufferedReader. Beiden hebben verschillende kenmerken. Het betekent verschillen hoe het te gebruiken.

Scanner behandelde gegeven invoer als token. BufferedReader leest regel voor regel gegeven invoer als string. Scanner zelf biedt parseermogelijkheden, net als nextInt(), nextFloat().

Maar waar zijn andere verschillen tussen?

  • Scanner behandelde gegeven invoer als token. BufferedReader als stroomlijn/string
  • Scanner tokeniseerde gegeven invoer met behulp van regex. Het gebruik van BufferedReader moet extra code schrijven
  • BufferedReader sneller dan Scanner *puntnr. 2
  • Scanner is niet gesynchroniseerd, BufferedReader gesynchroniseerd

Scanner meegeleverd sinds JDK versie 1.5 hoger.

Wanneer moet scanner of gebufferde lezer worden gebruikt?

Kijk naar de belangrijkste verschillen tussen beide, een met tokenized, andere met streamline. Gebruik in plaats daarvan Scanner als u parseermogelijkheden nodig hebt. Maar ik ben meer op mijn gemak met BufferedReader. Wanneer u uit een bestand moet lezen, gebruik dan BufferedReader, omdat het een buffer gebruikt bij het lezen van een bestand. Of u kunt BufferedReader gebruiken als invoer voor Scanner.


Antwoord 11

  1. BufferedReader zal je waarschijnlijk betere prestaties geven (omdat Scanner gebaseerd is op InputStreamReader, zoek bronnen).ups, voor het lezen van bestanden gebruikt het nio. Toen ik nio-prestaties testte tegen BufferedReader-prestaties voor grote bestanden, liet nio een beetje betere prestaties zien.
  2. Probeer Apache Commons IO om uit een bestand te lezen.

Antwoord 12

Ik geef de voorkeur aan Scanneromdat het geen gecontroleerde uitzonderingen genereert en daarom resulteert het gebruik in een meer gestroomlijnde code.

Other episodes