Skaner vs. BufferedReader

Z tego, co wiem, dwie najczęstsze metody odczytu danych opartych na znakach z pliku w Javie to Scanner LUB BufferedReader. Wiem również, że BufferedReader efektywnie odczytuje pliki za pomocą bufora, aby uniknąć fizycznych operacji na dysku. Moje pytania to:

  • czy Scanner działa tak dobrze jak BufferedReader?
  • Dlaczego wybrałeś Scanner zamiast BufferedReader czy odwrotnie?
Author: Vladimir Vagaytsev, 2010-02-09

15 answers

Scanner jest używany do parsowania tokenów z zawartości strumienia, podczas gdy BufferedReader tylko odczytuje strumień i nie wykonuje żadnego specjalnego parsowania.

W rzeczywistości możesz przekazać {[1] } do scanner jako źródło znaków do analizy.

 181
Author: Chandra Sekar S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-22 15:41:54

W najnowszym wydaniu/kompilacji JDK6 (b27),Scanner posiada Mniejszy bufor ( 1024 znaków) w przeciwieństwie do BufferedReader (8192 chars ), ale to więcej niż wystarczające.

Jeśli chodzi o wybór, użyj Scannerjeśli chcesz parsować plik, użyj BufferedReaderjeśli chcesz odczytać plik linia po linii. Zapoznaj się również z tekstem wprowadzającym ich wyżej wymienionych dokumentów API.

  • parsowanie = interpretacja podane dane wejściowe jako tokeny (części). Jest w stanie oddać ci określone części bezpośrednio jako int, string, decimal, itp. Zobacz też wszystkie metody nextXxx() w klasie Scanner.
  • Czytanie = dumb streaming. Ciągle oddaje Ci wszystkie znaki, które z kolei musisz ręcznie sprawdzić, czy chcesz dopasować lub skomponować coś użytecznego. Ale jeśli i tak nie musisz tego robić, wystarczy czytanie.
 157
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-25 00:58:15

Zobacz ten link , poniżej cytuję:

BufferedReader to prosta klasa przeznaczona do efektywnego odczytu z underling stream. Generalnie każde żądanie odczytu złożone przez czytelnika jak FileReader powoduje wysłanie odpowiedniego żądania odczytu do / align = "left" / Każde wywołanie read () lub readLine () może powoduje odczyt bajtów z pliku, konwersję na znaki i następnie zwrócony, co może być bardzo nieefektywne. Efektywność to Poprawiono zauważalnie, jeśli czytnik jest wypaczony w Bufferedreaderze.

BufferedReader jest zsynchronizowany, więc odczyt operacji na Bufferedreaderze można bezpiecznie wykonać z wielu wątków.

Skaner z drugiej strony ma dużo więcej serów wbudowanych w niego; to może zrobić wszystko, co może zrobić BufferedReader i na tym samym poziomie wydajność również. Jednak dodatkowo skaner może analizować podstawowy strumień dla typów prymitywnych i ciągów za pomocą regularnych wyrażenia. Może również tokenizować strumień bazowy za pomocą ogranicznik do wyboru. Może również wykonać skanowanie do przodu / align = "left" / linear

Skaner jednak nie jest bezpieczny, musi być zewnętrznie zsynchronizowane.

Wybór zastosowania Bufferedreadera lub skanera zależy od kodu piszesz, jeśli piszesz prosty czytnik logów buforowany czytelnik jest odpowiedni. Jednak jeśli piszesz skaner parsera XML jest bardziej naturalny wybór.

Nawet podczas odczytu wejścia, jeśli chcesz zaakceptować linię wejścia użytkownika przez linia i powiedzieć po prostu dodać go do pliku, BufferedReader jest wystarczająco dobry. Z drugiej strony, jeśli chcesz zaakceptować wejście użytkownika jako polecenie z wiele opcji, a następnie zamierza wykonać różne operacje na podstawie podanych poleceń i opcji skaner będzie pasował lepiej.

 75
Author: Jomoos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-25 11:02:08
  1. BufferedReader posiada znacznie większą pamięć buforową niż Skaner. Użyj BufferedReader, jeśli chcesz uzyskać długie ciągi ze strumienia, i użyj Scanner, jeśli chcesz przetworzyć określony typ tokenu ze strumienia.

  2. Scanner może używać tokenize za pomocą niestandardowego ogranicznika i parsować strumień na prymitywne typy danych, podczas gdy {[0] } może tylko odczytywać i przechowywać ciąg znaków.

  3. BufferedReader jest synchroniczne, podczas gdy Scanner nie jest. Użyj BufferedReader jeśli pracujesz z wieloma nici.

  4. Scanner ukrywa IOException podczas gdy BufferedReader rzuca go natychmiast.

 35
Author: Sujith PS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-01 08:18:11

Proponuję użyć BufferedReader do czytania tekstu. Scanner ukrywa IOException podczas gdy BufferedReader rzuca go natychmiast.

 17
Author: Evgeniy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-12 07:18:30
  • BufferedReader jest synchroniczne, podczas gdy Scanner nie jest.
  • BufferedReader powinien być używany, jeśli pracujemy z wieloma wątkami.
  • BufferedReader ma znacznie większą pamięć bufora niż Scanner.
  • Scanner ma mały bufor (1KB bufor char) w przeciwieństwie do BufferedReader (bufor 8kB bajtów), ale to więcej niż wystarcza.
  • BufferedReader jest nieco szybszy w porównaniu do Scanner Ponieważ Scanner czy parsowanie danych wejściowych i BufferedReader po prostu odczytuje sekwencję z postaci.

========================================================================

 10
Author: jsroyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-12 07:10:15

Klasa Scanner jest uzupełnieniem klasy Formater (używanej do konwersji danych binarnych na sformatowany tekst). Skaner odczytuje sformatowane wejście i konwertuje je do postaci binarnej. Chociaż zawsze można było odczytać sformatowane dane wejściowe, wymagało to większego wysiłku niż większość programistów wolałaby. Dzięki dodaniu skanera można teraz łatwo odczytać wszystkie typy wartości liczbowych, ciągi znaków i inne typy danych, niezależnie od tego, czy pochodzą one z pliku na dysku, z klawiatury, czy inne źródło. Skaner może być używany do odczytu danych wejściowych z konsoli, pliku, łańcucha znaków lub dowolnego innego źródła implementującego czytelny interfejs lub ReadableByteChannel. Na przykład za pomocą skanera można odczytać liczbę z klawiatury i przypisać jej wartość do zmiennej.

Z drugiej strony BufferedReader jest klasą i/O strumienia znaków. Strumienie znaków zapewniają wygodny sposób wprowadzania i wyprowadzania znaków (Unicode). BufferedReader jest używany głównie do pobieranie danych z konsoli, System.in. Przyjmuje obiekt InputStreamReader jako argument.

 7
Author: UrsinusTheStrong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-14 03:37:27

Główne Różnice:

  1. Skaner

  • prosty skaner tekstu, który może analizować prymitywne typy i ciągi znaków za pomocą wyrażeń regularnych.
  • Skaner dzieli Dane wejściowe na tokeny za pomocą wzorca ogranicznika, który domyślnie pasuje do białych znaków. Powstałe tokeny mogą być następnie konwertowane na wartości różnych typów przy użyciu różnych metod następnych.

Przykład

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

Drukuje następujące wyjście:

 1
 2
 red
 blue 

To samo wyjście może być wygenerowane za pomocą tego kodu, który używa wyrażenia regularnego do analizy wszystkich czterech tokenów jednocześnie:

 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:

    • Odczytuje tekst ze strumienia wprowadzania znaków, buforując znaki, aby zapewnić wydajny odczyt znaków, tablic i linii.

    • Można określić rozmiar bufora lub użyć domyślnego rozmiaru. Wartość domyślna jest wystarczająco duża dla większości cele.

Ogólnie rzecz biorąc, każde żądanie odczytu wykonane przez czytnik powoduje odpowiednie żądanie odczytu podstawowego znaku lub strumienia bajtów. Dlatego zaleca się owinięcie Bufferedreadera wokół dowolnego czytnika, którego operacje read() mogą być kosztowne, takie jak FileReaders i InputStreamReaders. Na przykład,

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

Buforuje dane wejściowe z podanego pliku. Bez buforowania każde wywołanie read() lub readLine () może spowodować, że bajty będą odczytywane z pliku, konwertowane na znaki, a następnie zwracane, co może być bardzo nieefektywne. Programy wykorzystujące strumienie DataInputStreams do wprowadzania tekstu mogą być zlokalizowane poprzez zastąpienie każdego strumienia Datainputstreams odpowiednim Bufferedreaderem.

Źródło: Link

 6
Author: Shivanandam Sirmarigari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-22 03:28:50

Poniżej przedstawiono różnice między BufferedReader i Scanner

  1. BufferedReader tylko odczytuje dane, ale skaner również przetwarza dane.
  2. możesz czytać tylko String używając BufferedReader, ale możesz czytać int, długie lub pływające za pomocą skanera.
  3. BufferedReader jest starszy od Scannera, istnieje od jdk 1.1, podczas gdy Scanner został dodany w wersji JDK 5.
  4. rozmiar bufora BufferedReader jest duży (8KB) w porównaniu do 1KB skanera.
  5. BufferedReader jest bardziej odpowiedni do odczytu pliku z długim łańcuchem podczas gdy skaner jest bardziej odpowiedni do odczytu małych danych użytkownika z wiersz polecenia.
  6. BufferedReader jest zsynchronizowany, ale skaner nie, co oznacza, że ty nie można udostępnić skanera między wieloma wątkami.
  7. BufferedReader jest szybszy od skanera, ponieważ nie spędza czasu on parsing
  8. BufferedReader jest nieco szybszy w porównaniu ze skanerem.]}
  9. BufferedReader jest z java.io pakiet i skaner pochodzi z Javy.pakiet util na podstawie punkty możemy wybrać nasz wybór.

Thanks

 6
Author: dhS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-14 07:44:24

Różnica między BufferedReader i Scanner jest następująca:

  1. BufferedReader jest zsynchronizowany , ale skaner nie jest zsynchronizowany .
  2. BufferedReader jest bezpieczny dla wątków (thread safe), ale skaner nie jest bezpieczny dla wątków (thread safe) (thread safe) (thread safe) (thread safe) (thread safe) (thread safe) (thread safe).
  3. BufferedReader ma większą pamięć bufora , ale Skaner ma mniejszą pamięć bufora .
  4. BufferedReader jest szybszy ale Skaner jest wolniejszy w wykonanie .
  5. Kod do odczytu linii z konsoli:

    BufferedReader :

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

    Skaner :

    Scanner sc= new Scanner(System.in);
    String st= sc.nextLine();
    
 5
Author: Raman Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-01 08:52:02

Istnieją różne sposoby pobierania danych wejściowych w Javie, takie jak:

1) BufferedReader 2) Skaner 3) Argumenty Linii Poleceń

BufferedReader odczytuje tekst ze strumienia wprowadzania znaków, buforując znaki tak, aby zapewnić wydajny odczyt znaków, tablic i linii.

Gdzie Scanner jest prostym skanerem tekstu, który może analizować prymitywne typy i ciągi znaków za pomocą wyrażeń regularnych.

Jeśli piszesz prosty czytnik dzienników, wystarczy buforowany czytnik. jeśli piszesz skaner parsera XML jest bardziej naturalnym wyborem.

Aby uzyskać więcej informacji, zobacz:

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

 3
Author: manisha mulchandani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-18 16:12:34

Odpowiedź poniżej pochodzi z odczytu z konsoli: JAVA Scanner vs BufferedReader

Podczas odczytu danych wejściowych z konsoli, istnieją dwie opcje, aby to osiągnąć. Pierwsze użycie Scanner, drugie użycie BufferedReader. Oba mają różne cechy. Oznacza to różnice w sposobie korzystania z niego.

Skaner traktował dane wejście jako token. BufferedReader odczytuje tylko linię po linii podanej jako string. Scanner it self zapewnia możliwości parsowania, podobnie jak nextInt(), nextFloat().

Ale, jakie są inne różnice między?

  • Skaner traktował dane wejście jako token. BufferedReader as stream line / String
  • Skaner tokenizował dane wejście za pomocą regex. Korzystanie z BufferedReader musi napisać dodatkowy kod
  • BufferedReader szybszy niż Skaner * punkt nr 2
  • skaner nie jest zsynchronizowany, bufferedreader zsynchronizowany

Skaner jest dostępny od wersji JDK 1.5 wyższej.

Kiedy należy używać skanera lub Buforowany Czytnik?

Spójrz na główne różnice między nimi, jeden za pomocą tokenized, Inne za pomocą stream line. Gdy potrzebujesz możliwości parsowania, użyj skanera. Ale czuję się bardziej komfortowo z BufferedReader. Gdy chcesz odczytać z pliku, użyj BufferedReader, ponieważ jest to użycie bufora podczas odczytu pliku. Lub możesz użyć BufferedReader jako wejście do skanera.

 1
Author: KNU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-01 09:34:26

Lista kilku...

java.util.Scanner class jest prostym skanerem tekstu, który może analizować prymitywne typy i ciągi znaków. Wewnętrznie używa wyrażeń regularnych do odczytu różnych typów.

Java.io.BufferedReader klasa odczytuje tekst ze strumienia wprowadzania znaków, buforując znaki tak, aby zapewnić wydajny odczyt sekwencji znaków

1) BufferedReader jest synchroniczne, podczas gdy Scanner nie jest. BufferedReader powinny być używane, jeśli pracujemy z wieloma wątkami.

2)BufferedReader ma znacznie większa pamięć buforowa niż Scanner. Scanner ma mały bufor (bufor 1KB znaków) w przeciwieństwie do BufferedReader (bufor 8kB bajtów), ale to więcej niż wystarcza.

3)BufferedReader jest nieco szybszy w porównaniu do Scanner ponieważ Scanner parsuje dane wejściowe, a BufferedReader po prostu odczytuje sekwencję znaków.

 1
Author: roottraveller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-06 13:07:10
  1. BufferedReader prawdopodobnie da ci lepszą wydajność (ponieważ Scanner bazuje na InputStreamReader, look sources). ups, do odczytu z plików używa nio. Kiedy testowałem wydajność NIO z wydajnością Bufferedreadera dla dużych plików nio pokazuje nieco lepszą wydajność.
  2. do odczytu z pliku spróbuj Apache Commons IO.
 0
Author: Roman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-09 18:22:09

Wolę Scanner, ponieważ nie wyrzuca sprawdzonych wyjątków i dlatego jego użycie skutkuje bardziej usprawnionym kodem.

 0
Author: thisismydesign,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 12:40:03