私の知る限り、Javaでファイルから文字ベースのデータを読み取る最も一般的な2つの方法は、Scannerまたはを使用することBufferedReaderです。BufferedReaderまた、物理ディスクの操作を回避するためにバッファを使用してファイルを効率的に読み取ることも知っています。
私の質問は次のとおりです。
Scanner同様に機能しBufferedReaderますか?- なぜあなたは選ぶ
Scannerのですか、BufferedReaderまたはその逆ですか?
私の知る限り、Javaでファイルから文字ベースのデータを読み取る最も一般的な2つの方法は、Scannerまたはを使用することBufferedReaderです。BufferedReaderまた、物理ディスクの操作を回避するためにバッファを使用してファイルを効率的に読み取ることも知っています。
私の質問は次のとおりです。
Scanner同様に機能しBufferedReaderますか?Scannerのですか、BufferedReaderまたはその逆ですか?ScannerBufferedReaderストリームを読み取るだけで、特別な解析を行わずに、ストリームのコンテンツからトークンを解析するために使用されます。
実際、解析する文字のソースとしてaBufferedReaderをaに渡すことができます。scanner
現在の最新のJDK6リリース/ビルド(b27)では、(8192文字)とは対照的にScanner、より小さなバッファ(1024文字)がありますが、それで十分です。BufferedReader
選択に関しては、ファイルScannerを解析する場合はifを使用し、ファイルを1行ずつ読み取るBufferedReader場合はを使用します。前述のAPIドキュメントの紹介テキストも参照してください。
nextXxx()内のこれらすべてのメソッドも参照してください。Scannerこのリンクを参照してください、以下はそこから引用されています:
BufferedReaderは、基になるストリームから効率的に読み取ることを目的とした単純なクラスです。一般に、FileReaderなどのリーダーで作成された各読み取り要求により、対応する読み取り要求が基になるストリームに対して作成されます。read()またはreadLine()を呼び出すたびに、バイトがファイルから読み取られ、文字に変換されてから返される可能性がありますが、これは非常に非効率的です。リーダーがBufferedReaderでワープされると、効率が大幅に向上します。
BufferedReaderは同期されているため、BufferedReaderの読み取り操作は複数のスレッドから安全に実行できます。
一方、スキャナーにはさらに多くのチーズが組み込まれています。BufferedReaderが実行できるすべてのことを、同じレベルの効率で実行できます。ただし、さらにスキャナーは、正規表現を使用して、プリミティブ型と文字列の基になるストリームを解析できます。また、選択した区切り文字を使用して、基になるストリームをトークン化することもできます。また、区切り文字を無視して、基になるストリームの順方向スキャンを実行することもできます。
ただし、スキャナーはスレッドセーフではないため、外部で同期する必要があります。
BufferedReaderまたはScannerのどちらを使用するかは、作成するコードによって異なります。単純なログリーダーを作成する場合は、BufferedReaderで十分です。ただし、XMLパーサーを作成している場合は、スキャナーがより自然な選択です。
入力を読み取っているときでも、ユーザー入力を1行ずつ受け入れて、ファイルに追加するだけの場合は、BufferedReaderで十分です。一方、ユーザー入力を複数のオプションを持つコマンドとして受け入れ、指定されたコマンドとオプションに基づいてさまざまな操作を実行する場合は、スキャナーの方が適しています。
BufferedReaderスキャナーよりも大幅に大きいバッファメモリを備えています。BufferedReaderストリームから長い文字列を取得する場合に使用し、ストリームから特定のタイプのトークンを解析する場合に使用しScannerます。
Scannerカスタム区切り文字を使用してtokenizeを使用し、ストリームをプリミティブタイプのデータに解析BufferedReaderできますが、文字列の読み取りと保存のみが可能です。
BufferedReader同期していませんが、同期しScannerていません。BufferedReader複数のスレッドで作業している場合に使用します。
ScannerIOExceptionを非表示BufferedReaderにして、すぐにスローします。
BufferedReaderテキストを読むために使用することをお勧めします。すぐに投げながらScanner隠れます。IOExceptionBufferedReader
BufferedReaderとScannerの違いは次のとおりです。
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();
BufferedReaderとScannerの違いは次のとおりです。
int。JDK 1.1、ScannerJDK 5はリリース時に追加されました。java.ioパッケージからのものであり、Scannerはjava.utilパッケージからのものです。ポイントに基づいて、選択することができます。
読んでくれてありがとう!
主な違い:
例:
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();
文字入力ストリームからテキストを読み取り、文字、配列、および行を効率的に読み取ることができるように文字をバッファリングします。
バッファサイズを指定することも、デフォルトのサイズを使用することもできます。デフォルトは、ほとんどの目的に十分な大きさです。
一般に、リーダーで作成された各読み取り要求により、対応する読み取り要求が基になる文字またはバイトストリームで作成されます。したがって、FileReadersやInputStreamReadersなど、read()操作にコストがかかる可能性のあるReaderの周りにBufferedReaderをラップすることをお勧めします。例えば、
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
指定されたファイルからの入力をバッファリングします。バッファリングを行わないと、read()またはreadLine()を呼び出すたびに、バイトがファイルから読み取られ、文字に変換されてから返される可能性があり、これは非常に非効率的です。テキスト入力にDataInputStreamsを使用するプログラムは、各DataInputStreamを適切なBufferedReaderに置き換えることでローカライズできます。
使用したソース: https ://docs.oracle.com
Javaで入力を受け取るには、次のようなさまざまな方法があります。
1)BufferedReader 2)スキャナー3)コマンドライン引数
BufferedReader文字入力ストリームからテキストを読み取り、文字、配列、および行を効率的に読み取るために文字をバッファリングします。
ここで、Scannerは、正規表現を使用してプリミティブ型と文字列を解析できる単純なテキストスキャナーです。
単純なログリーダーを作成している場合は、バッファリーダーで十分です。XMLパーサーを作成している場合は、スキャナーがより自然な選択です。
詳細については、以下を参照してください。
以下の答えは、コンソールからの読み取りから取得されます:JAVAスキャナーとBufferedReader
コンソールから入力を読み取る場合、それを実現するための2つのオプションがあります。最初にを使用しScanner、別のを使用しBufferedReaderます。どちらも特徴が異なります。使い方の違いを意味します。
Scanner与えられた入力をトークンとして扱いました。BufferedReader文字列として入力を指定して行ごとに読み取るだけです。それ自体は、、Scannerのような解析機能を提供します。nextInt()nextFloat()
しかし、他の違いは何ですか?
Scannerそれ以降に付属していJDK 1.5ます。
いつスキャナーまたはバッファリーダーを使用する必要がありますか?
1つはトークン化されたものを使用し、他はストリームラインを使用するという、両方の主な違いを見てください。解析機能が必要な場合は、Scanner代わりに使用してください。しかし、私はより快適BufferedReaderです。ファイルからデータを読み取る必要がある場合は、を使用しますBufferedReader。これは、ファイルを読み取るときにバッファメモリを使用し、物理ドライブの使用量を削減するためです。BufferedReaderまたは、への入力として使用できますScanner。
nio。大きなファイルのnioパフォーマンスに対してパフォーマンスをテストしたところ、パフォーマンスが少し向上しました。BufferedReadernioScannerチェックされた例外をスローしないため、使用法によってコードがより合理化されるため、私は好みます。