web-dev-qa-db-ja.com

スキャナとBufferedReader

私が知っている限りでは、Javaでファイルから文字ベースのデータを読み取る2つの最も一般的な方法はScannerまたはBufferedReaderを使用することです。私はまた、BufferedReaderが物理ディスク操作を避けるためにバッファを使うことによって効率的にファイルを読むことを知っています。私の質問は:

  • ScannerBufferedReaderと同等のパフォーマンスを発揮しますか?
  • なぜあなたはScannerよりBufferedReaderを選ぶのでしょうか?
259
Mads Mobæk

Scannerはストリームの内容からトークンを解析するために使用されますが、BufferedReaderはストリームを読み取るだけで、特別な解析は行いません。

実際には、解析する文字のソースとしてBufferedReaderscannerに渡すことができます。

187
Chandra Sekar

現在の最新のJDK6リリース/ビルド(b27)では、 Scanner ( - とは対照的に、 BufferedReader の方がバッファが小さくなります( 1024文字 )。 8192 chars )、しかしそれは十分すぎるほどです。

選択に関しては、ファイルを解析したい場合はScannerを、したい場合はBufferedReaderを使用してください。ファイルを1行ずつ読み込む。それらの前述のAPIドキュメントの紹介文も参照してください。

  • 構文解析=与えられた入力をトークン(部分)として解釈します。特定の部分をint、string、decimalなどとして直接返すことができます。ScannerクラスのnextXxx()メソッドもすべて参照してください。
  • Reading=ダムストリーミング。それはあなたにすべてのキャラクターを返し続けます、あなたが順番にあなたがマッチするか、何か有用なものを作りたいかどうか手動で調べなければなりません。しかし、あなたがとにかくそうする必要がなければ、読むことで十分です。
168
BalusC

これを参照してください link 、そこから次のように引用されます:

BufferedReaderは、基礎となるストリームから効率的に読み取ることを目的とした単純なクラスです。一般に、FileReaderのようなReaderに対して行われた各読み取り要求は、対応する読み取り要求を基礎となるストリームに対して行わせます。 read()またはreadLine()を呼び出すたびに、ファイルからバイトが読み取られ、文字に変換されてから返される可能性があります。これは非常に非効率的な場合があります。 ReaderがBufferedReader内で歪められると、効率はかなり改善されます。

BufferedReaderは同期化されているため、BufferedReaderの読み取り操作は複数のスレッドから安全に実行できます。

一方、スキャナにはもっとたくさんのチーズが組み込まれています。それはBufferedReaderができることのすべてを同じレベルの効率でも行うことができます。ただし、さらにScannerは正規表現を使用して基本ストリームとプリミティブ型の文字列を解析することができます。基になるストリームを選択した区切り文字でトークン化することもできます。デリミタを無視して、基になるストリームを前方スキャンすることもできます。

ただし、スキャナはスレッドセーフではなく、外部で同期させる必要があります。

単純なログリーダーを作成している場合、BufferedReaderまたはScannerのどちらを使用するかは、作成しているコードによって異なります。バッファードリーダーで十分です。ただし、XMLパーサーを作成している場合は、Scannerがより自然な選択です。

入力を読み込んでいる間でも、1行ずつユーザー入力を受け入れてファイルに追加するだけの場合は、BufferedReaderで十分です。一方、ユーザー入力を複数のオプションを持つコマンドとして受け入れ、その後、指定されたコマンドとオプションに基づいてさまざまな操作を実行する場合は、Scannerの方が適しています。

76
Jomoos
  1. BufferedReaderは、Scannerよりもかなり大きいバッファメモリを持っています。ストリームから長い文字列を取得する場合はBufferedReaderを使用し、ストリームから特定の種類のトークンを解析する場合はScannerを使用します。

  2. Scannerはカスタム区切り文字を使用してtokenizeを使用し、ストリームをプリミティブ型のデータに解析することができますが、BufferedReaderはStringの読み取りと格納のみが可能です。

  3. BufferedReaderは同期ですが、Scannerは同期しません。マルチスレッドで作業している場合はBufferedReaderを使用してください。

  4. ScannerはIOExceptionを隠し、BufferedReaderは即座にそれをスローします。

38
Sujith PS

私はテキストを読むためにBufferedReaderを使うことを勧めます。 ScannerIOExceptionを隠し、BufferedReaderは即座にそれをスローします。

17
Evgeniy

BufferedReaderScannerの違いは次のとおりです。

  1. BufferedReaderは同期ですが、Scannerは非同期です。
  2. BufferedReaderはスレッドセーフですが、Scannerはスレッドセーフではありませんです。
  3. BufferedReader より大きなバッファメモリを持つしかしScanner より小さなバッファメモリを持つ
  4. BufferedReaderは速いですが、Scannerは実行が遅いです。
  5. コンソールから行を読むためのコード:

    BufferedReader

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

    スキャナ

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

以下はBufferedReaderとScannerの違いです。

  1. BufferedReaderはデータを読み取るだけですが、スキャナもデータを解析します。
  2. あなたはBufferedReaderを使って文字列を読むことしかできませんが、あなたはScannerを使ってint、longまたはfloatを読むことができます。
  3. BufferedReaderはScannerよりも古く、JDK 5リリースでScannerが追加されたときのjdk 1.1から存在します。
  4. BufferedReaderのバッファサイズは、1KBのScannerと比べて大きい(8KB)。
  5. BufferedReaderは長い文字列を含むファイルの読み取りに適していますが、Scannerはコマンドプロンプトからの小さなユーザー入力の読み取りに適しています。
  6. BufferedReaderは同期されますがScannerは同期されません。つまり、Scannerを複数のスレッド間で共有することはできません。
  7. BufferedReaderは、解析に時間をかけないため、Scannerよりも高速です。
  8. BufferedReaderは、Scannerと比べて少し高速です。
  9. 選択したポイントに基づいて、BufferedReaderはJava.ioパッケージから、ScannerはJava.utilパッケージからとなります。

ありがとう

7
dhS

主な違い:

  1. スキャナ

  • 正規表現を使用してプリミティブ型と文字列を解析できる単純なテキストスキャナ。
  • スキャナは、デフォルトで空白と一致する区切りパターンを使用して、入力をトークンに分割します。結果のトークンは、次に、さまざまなnextメソッドを使用してさまざまなタイプの値に変換されます。

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

次のように出力します。

 1
 2
 red
 blue 

このコードでも同じ出力を生成できます。このコードでは、4つのトークンすべてを一度に解析するために正規表現を使用します。

 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:

    • 文字入力配列からテキストを読み取り、文字、配列、および行を効率的に読み取るために文字をバッファーに入れます。

    • バッファサイズを指定することも、デフォルトサイズを使用することもできます。デフォルトはほとんどの目的に十分な大きさです。

一般に、Readerに対して行われた各読み取り要求によって、対応する読み取り要求が基礎となる文字またはバイトストリームに対して行われます。そのため、FileReadersやInputStreamReadersなど、read()操作にコストがかかる可能性のあるすべてのReaderにBufferedReaderをラップすることをお勧めします。例えば、

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

指定されたファイルからの入力をバッファリングします。バッファリングがないと、read()またはreadLine()を呼び出すたびに、ファイルからバイトが読み取られ、文字に変換されてから返される可能性があり、非常に非効率的です。テキスト入力にDataInputStreamを使用するプログラムは、各DataInputStreamを適切なBufferedReaderに置き換えることによってローカライズできます。

出典: リンク

Javaで入力を取得する方法はいくつかあります。

1)BufferedReader 2)スキャナ3)コマンドライン引数

BufferedReader文字入力配列からテキストを読み取り、文字、配列、および行を効率的に読み取るために文字をバッファリングします。

Scannerは、正規表現を使用してプリミティブ型と文字列を解析できる単純なテキストスキャナです。

単純なログリーダーを作成している場合はバッファードリーダーで十分です。 XMLパーサーを書いているなら、Scannerがより自然な選択です。

詳しくは以下を参照してください。

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

3

以下の答えは コンソールからの読み取り:Java Scanner vs BufferedReader から取られます。

コンソールから入力を読むとき、それを達成するために2つのオプションがあります。最初はScannerを使用し、もう1つはBufferedReaderを使用します。どちらも特性が異なります。使い方の違いがあります。

スキャナは与えられた入力をトークンとして扱いました。 BufferedReaderは、入力として与えられた文字列を1行ずつ読み込むだけです。スキャナそれ自体はnextInt()、nextFloat()と同じように解析機能を提供します。

しかし、他の人との違いは何ですか?

  • スキャナは与えられた入力をトークンとして扱いました。ストリームライン/文字列としてのBufferedReader
  • スキャナは正規表現を使用して与えられた入力をトークン化しました。 BufferedReaderを使用すると、追加のコードを記述する必要があります。
  • スキャナよりも速いBufferedReader *ポイント番号。 2
  • スキャナが同期されていない、BufferedReaderが同期されている

スキャナーはJDKバージョン1.5以降から付属しています。

いつScanner、またはBuffered Readerを使うべきですか?

両者の主な違いを見てください。1つはトークン化を使用し、もう1つは流線を使用しています。解析機能が必要な場合は、代わりにScannerを使用してください。しかし、私はBufferedReaderに慣れています。ファイルから読み取る必要がある場合は、BufferedReaderを使用します。ファイルを読み取るときにバッファが使用されるためです。あるいは、BufferedReaderをScannerへの入力として使用することもできます。

1
KNU

Scannerは、チェックされた例外をスローしないので、より合理化されたコードになります。

0
thisismydesign
  1. BufferedReaderを使用すると、おそらくパフォーマンスが向上します(ScannerはInputStreamReaderをベースにしているため、ソースを参照してください)。 ups、ファイルから読み込むためにnioを使います。大きなファイルについてBufferedReaderのパフォーマンスと比較してnioのパフォーマンスをテストしたところ、nioのパフォーマンスは少し向上しています。
  2. ファイルから読み込むには、Apache Commons IOを試してください。
0
Roman