質問

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

  • する Scanner 同様にパフォーマンスします BufferedReader?
  • なぜ選ぶのですか Scanner 以上 BufferedReader それともその逆ですか?
役に立ちましたか?

解決

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

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

他のヒント

現在の最新の JDK6 リリース/ビルド (b27) では、 Scanner バッファが小さい (1024文字) とは対照的に、 BufferedReader (8192文字)、でも十分すぎるほどです。

選択に関しては、 Scanner あなたがしたい場合は、 解析する ファイルを使用するには、 BufferedReader あなたがしたい場合は、 読む ファイルを一行ずつ。前にリンクされている API ドキュメントの紹介文も参照してください。

  • 解析中 = 指定された入力をトークン (部分) として解釈します。特定の部分を int、string、10 進数などとして直接返すことができます。それらもすべて参照してください nextXxx() のメソッド Scanner クラス。
  • 読む = ダムストリーミング。すべての文字が返され続けるため、有用なものを一致させたり合成したりする場合は、手動で検査する必要があります。しかし、とにかくそれをする必要がない場合は、読むだけで十分です。

以下が引用され、このリンクを参照してください。そこから:

  

A BufferedReaderのは、効率的に読むことを意味する単純なクラスです   下っ端ストリーム。一般的に、各読み出し要求は次のようにリーダーで作られました   FileReaderのは、対応するリード要求がに行われたことになり   基本となるストリーム。各読み取りの呼び出し()またはのreadLine()ができました   原因は、ファイルから読み込まれるバイト文字に変換され、   その後、非常に非効率的であることができる、返されました。効率が改善されています   ReaderはBufferedReaderのに反っているかなります。

     

をBufferedReaderが同期されるので、BufferedReaderの上で操作を読みます   安全に複数のスレッドから行うことができます。

     

一方、スキャナは、それに組み込まれた多くのチーズを持っています。それ   BufferedReaderのを行うことができますすべてを行うとの同じレベルのことができます   効率にも。しかし、ほかにスキャナを解析することができます   定期的に使用してプリミティブ型および文字列のための基本となるストリーム   表現。また、との基本となるストリームをトークン化することができます   お好みの区切り。それはまたの前方スキャンを行うことができます   区切り文字を無視して基本となるストリーム!

     

スキャナはしかし、スレッドセーフではありません、それが外部である必要があります   同期ます。

     

BufferedReaderのか、スキャナを使用しての選択は、コードに依存します   あなたはバッファシンプルなログリーダーを書いている場合は、書いています   読者は十分です。しかし、あなたはXMLパーサスキャナを作成している場合   より自然な選択である。

     

でもすることにより、ユーザの入力行を受け入れるようにしたい場合は、入力を読みながら   単にファイルに追加し、BufferedReaderのは十分ですラインと言います。   一方、あなたが持つコマンドとして、ユーザー入力を受け付けるようにしたい場合   その後、複数のオプション、およびさまざまな操作を実行しようとします   指定されたコマンドとオプションに基づいて、スキャナが合います   より良います。

  1. BufferedReader Scanner よりも大幅に大きいバッファ メモリを備えています。使用 BufferedReader ストリームから長い文字列を取得して使用したい場合は、 Scanner ストリームから特定のタイプのトークンを解析する場合。

  2. Scanner カスタム区切り文字を使用してトークン化を使用し、ストリームをプリミティブ型のデータに解析できます。 BufferedReader 文字列の読み取りと保存のみが可能です。

  3. BufferedReader 同期中です Scanner ではありません。使用 BufferedReader 複数のスレッドを使用している場合。

  4. Scanner IOException を非表示にします。 BufferedReader すぐに投げます。

私はテキストを読むためBufferedReaderを使用することをお勧めします。 ScannerはすぐにそれをスローしながらIOExceptionBufferedReaderを隠します。

との差 バッファリーダー そして スキャナー 次のとおりです:

  1. BufferedReader は 同期した しかしスキャナーは 同期されていない.
  2. BufferedReader は スレッドセーフ しかしスキャナーは スレッドセーフではありません.
  3. バッファリーダー バッファメモリが大きい でもスキャナー バッファメモリが小さい.
  4. BufferedReader は もっと早く しかしスキャナーは 実行が遅くなる.
  5. コンソールから行を読み取るコード:

    バッファリーダー:

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

BufferedReader と Scanner の違いは次のとおりです。

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

ありがとう

主な違い:

  1. スキャナー

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

 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. バッファリーダー:

    • 文字入力ストリームからテキストを読み取り、文字、配列、行を効率的に読み取ることができるように文字をバッファリングします。

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

一般に、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の読み取り文字入力ストリームからテキスト、文字、配列、行の効率的な読み取りを提供するように文字をバッファリングする。

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

あなたは、単純なログリーダーバッファリーダーを作成している場合は十分です。あなたがXMLパーサスキャナを作成している場合は、より自然な選択である。

詳細については参照してください。

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

以下の回答はから引用しました コンソールからの読み取り:JAVA スキャナーと BufferedReader の比較

コンソールから入力を読み取る場合、それを実現するための 2 つのオプションがあります。初めて使用する Scanner, 、別の使用法 BufferedReader. 。両者は異なる特性を持っています。それは使い方の違いを意味します。

スキャナーは、指定された入力をトークンとして処理しました。BufferedReader は、文字列として入力された場合に 1 行ずつ読み取るだけです。スキャナー自体は、nextInt()、nextFloat() と同様の解析機能を提供します。

しかし、他のものとの違いは何でしょうか?

  • スキャナーは、指定された入力をトークンとして処理しました。ストリームライン/文字列としての BufferedReader
  • スキャナーは正規表現を使用して指定された入力をトークン化しました。BufferedReader を使用するには追加のコードを記述する必要がある
  • BufferedReader は Scanner よりも高速です *ポイント no.2
  • スキャナは同期されていませんが、BufferedReader は同期されています

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

スキャナーまたはバッファー リーダーを使用する必要があるのはどのような場合ですか?

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

  1. BufferedReader の方がおそらくパフォーマンスが向上します (Scanner は InputStreamReader に基づいているため、ソースを参照してください)。 ファイルからの読み取りには nio を使用します。大きなファイルに対して nio のパフォーマンスを BufferedReader のパフォーマンスと比較してテストしたところ、nio の方が若干優れたパフォーマンスを示しました。
  2. ファイルからの読み取りには、Apache Commons IO を試してください。

私はそれがチェック例外をスローしませんので、Scannerを好むので、それは、使用の結果は、より合理コードでいます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top