316

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

私の質問は次のとおりです。

  • Scanner同様に機能しBufferedReaderますか?
  • なぜあなたは選ぶScannerのですか、BufferedReaderまたはその逆ですか?
4

12 に答える 12

221

ScannerBufferedReaderストリームを読み取るだけで、特別な解析を行わずに、ストリームのコンテンツからトークンを解析するために使用されます。

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

于 2010-02-09T18:20:04.087 に答える
214

現在の最新のJDK6リリース/ビルド(b27)では、(8192文字)とは対照的にScanner、より小さなバッファ(1024文字)がありますが、それで十分です。BufferedReader

選択に関しては、ファイルScanner解析する場合はifを使用し、ファイルを1行ずつ読み取るBufferedReader場合はを使用します。前述のAPIドキュメントの紹介テキストも参照してください。

  • 解析=指定された入力をトークン(パーツ)として解釈します。int、string、decimalなどの特定の部分を直接返すことができます。クラスnextXxx()内のこれらすべてのメソッドも参照してください。Scanner
  • 読書=ダムストリーミング。それはあなたにすべてのキャラクターを返し続けます、そしてあなたが順番にあなたが何か有用なものを一致させたいか、または構成したいかどうか手動で検査しなければなりません。しかし、とにかくそれをする必要がなければ、読むだけで十分です。
于 2010-02-09T18:21:12.543 に答える
78

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

BufferedReaderは、基になるストリームから効率的に読み取ることを目的とした単純なクラスです。一般に、FileReaderなどのリーダーで作成された各読み取り要求により、対応する読み取り要求が基になるストリームに対して作成されます。read()またはreadLine()を呼び出すたびに、バイトがファイルから読み取られ、文字に変換されてから返される可能性がありますが、これは非常に非効率的です。リーダーがBufferedReaderでワープされると、効率が大幅に向上します。

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

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

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

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

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

于 2011-12-11T15:50:12.870 に答える
42
  1. BufferedReaderスキャナーよりも大幅に大きいバッファメモリを備えています。BufferedReaderストリームから長い文字列を取得する場合に使用し、ストリームから特定のタイプのトークンを解析する場合に使用しScannerます。

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

  3. BufferedReader同期していませんが、同期しScannerていません。BufferedReader複数のスレッドで作業している場合に使用します。

  4. ScannerIOExceptionを非表示BufferedReaderにして、すぐにスローします。

于 2014-02-11T09:39:21.110 に答える
19

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

于 2011-04-15T10:07:54.623 に答える
18

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();
       
// You can make the object InputStreamReader object inside the BufferReader method.
BufferReader br = new BufferedReader(InputStreamReader(System.in));
String st = br.readLine();

// You can even inspect the type of the input stream manually by using Parse method which accepts string parameter.
int x = Integer.parseInt(br.readLine());

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

スキャナー

Scanner sc = new Scanner(System.in);
String st = sc.nextLine();
于 2017-10-01T08:52:02.943 に答える
10

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

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

ポイントに基づいて、選択することができます。

読んでくれてありがとう!

于 2016-12-31T17:33:51.500 に答える
8

主な違い:

  1. スキャナー

  • 正規表現を使用してプリミティブ型と文字列を解析できるシンプルなテキストスキャナー。
  • Scannerは、デフォルトで空白と一致する区切り文字パターンを使用して、入力をトークンに分割します。結果のトークンは、さまざまな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:
  • 文字入力ストリームからテキストを読み取り、文字、配列、および行を効率的に読み取ることができるように文字をバッファリングします。

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

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

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

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

使用したソース: https ://docs.oracle.com

于 2016-11-30T16:34:22.383 に答える
3

Javaで入力を受け取るには、次のようなさまざまな方法があります。

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

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

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

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

詳細については、以下を参照してください。

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

于 2015-06-16T14:42:22.373 に答える
2

以下の答えは、コンソールからの読み取りから取得されます:JAVAスキャナーとBufferedReader

コンソールから入力を読み取る場合、それを実現するための2つのオプションがあります。最初にを使用しScanner、別のを使用しBufferedReaderます。どちらも特徴が異なります。使い方の違いを意味します。

Scanner与えられた入力をトークンとして扱いました。BufferedReader文字列として入力を指定して行ごとに読み取るだけです。それ自体は、、Scannerのような解析機能を提供します。nextInt()nextFloat()

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

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

Scannerそれ以降に付属していJDK 1.5ます。

いつスキャナーまたはバッファリーダーを使用する必要がありますか?

1つはトークン化されたものを使用し、他はストリームラインを使用するという、両方の主な違いを見てください。解析機能が必要な場合は、Scanner代わりに使用してください。しかし、私はより快適BufferedReaderです。ファイルからデータを読み取る必要がある場合は、を使用しますBufferedReader。これは、ファイルを読み取るときにバッファメモリを使用し、物理ドライブの使用量を削減するためです。BufferedReaderまたは、への入力として使用できますScanner

于 2014-03-01T09:34:26.650 に答える
0
  1. BufferedReaderを使用すると、パフォーマンスが向上する可能性があります(ScannerはInputStreamReaderに基づいているため、ソースを参照してください)。おっと、それが使用するファイルからデータを読み取るためにnio。大きなファイルのnioパフォーマンスに対してパフォーマンスをテストしたところ、パフォーマンスが少し向上しました。BufferedReadernio
  2. ファイルからデータを読み取るには、ApacheCommonsIOを試してください
于 2010-02-09T18:22:09.500 に答える
0

Scannerチェックされた例外をスローしないため、使用法によってコードがより合理化されるため、私は好みます。

于 2016-11-28T12:40:03.703 に答える