私が知っている限りでは、Javaでファイルから文字ベースのデータを読み取る2つの最も一般的な方法はScanner
またはBufferedReader
を使用することです。私はまた、BufferedReader
が物理ディスク操作を避けるためにバッファを使うことによって効率的にファイルを読むことを知っています。私の質問は:
Scanner
はBufferedReader
と同等のパフォーマンスを発揮しますか?Scanner
よりBufferedReader
を選ぶのでしょうか?Scanner
はストリームの内容からトークンを解析するために使用されますが、BufferedReader
はストリームを読み取るだけで、特別な解析は行いません。
実際には、解析する文字のソースとしてBufferedReader
をscanner
に渡すことができます。
現在の最新のJDK6リリース/ビルド(b27)では、 Scanner
( - とは対照的に、 BufferedReader
の方がバッファが小さくなります( 1024文字 )。 8192 chars )、しかしそれは十分すぎるほどです。
選択に関しては、ファイルを解析したい場合はScanner
を、したい場合はBufferedReader
を使用してください。ファイルを1行ずつ読み込む。それらの前述のAPIドキュメントの紹介文も参照してください。
Scanner
クラスのnextXxx()
メソッドもすべて参照してください。これを参照してください link 、そこから次のように引用されます:
BufferedReaderは、基礎となるストリームから効率的に読み取ることを目的とした単純なクラスです。一般に、FileReaderのようなReaderに対して行われた各読み取り要求は、対応する読み取り要求を基礎となるストリームに対して行わせます。 read()またはreadLine()を呼び出すたびに、ファイルからバイトが読み取られ、文字に変換されてから返される可能性があります。これは非常に非効率的な場合があります。 ReaderがBufferedReader内で歪められると、効率はかなり改善されます。
BufferedReaderは同期化されているため、BufferedReaderの読み取り操作は複数のスレッドから安全に実行できます。
一方、スキャナにはもっとたくさんのチーズが組み込まれています。それはBufferedReaderができることのすべてを同じレベルの効率でも行うことができます。ただし、さらにScannerは正規表現を使用して基本ストリームとプリミティブ型の文字列を解析することができます。基になるストリームを選択した区切り文字でトークン化することもできます。デリミタを無視して、基になるストリームを前方スキャンすることもできます。
ただし、スキャナはスレッドセーフではなく、外部で同期させる必要があります。
単純なログリーダーを作成している場合、BufferedReaderまたはScannerのどちらを使用するかは、作成しているコードによって異なります。バッファードリーダーで十分です。ただし、XMLパーサーを作成している場合は、Scannerがより自然な選択です。
入力を読み込んでいる間でも、1行ずつユーザー入力を受け入れてファイルに追加するだけの場合は、BufferedReaderで十分です。一方、ユーザー入力を複数のオプションを持つコマンドとして受け入れ、その後、指定されたコマンドとオプションに基づいてさまざまな操作を実行する場合は、Scannerの方が適しています。
BufferedReader
は、Scannerよりもかなり大きいバッファメモリを持っています。ストリームから長い文字列を取得する場合はBufferedReader
を使用し、ストリームから特定の種類のトークンを解析する場合はScanner
を使用します。
Scanner
はカスタム区切り文字を使用してtokenizeを使用し、ストリームをプリミティブ型のデータに解析することができますが、BufferedReader
はStringの読み取りと格納のみが可能です。
BufferedReader
は同期ですが、Scanner
は同期しません。マルチスレッドで作業している場合はBufferedReader
を使用してください。
Scanner
はIOExceptionを隠し、BufferedReader
は即座にそれをスローします。
私はテキストを読むためにBufferedReader
を使うことを勧めます。 Scanner
はIOException
を隠し、BufferedReader
は即座にそれをスローします。
BufferedReaderとScannerの違いは次のとおりです。
コンソールから行を読むためのコード:
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();
以下はBufferedReaderとScannerの違いです。
ありがとう
主な違い:
例
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(); `
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がより自然な選択です。
詳しくは以下を参照してください。
以下の答えは コンソールからの読み取り:Java Scanner vs BufferedReader から取られます。
コンソールから入力を読むとき、それを達成するために2つのオプションがあります。最初はScanner
を使用し、もう1つはBufferedReader
を使用します。どちらも特性が異なります。使い方の違いがあります。
スキャナは与えられた入力をトークンとして扱いました。 BufferedReaderは、入力として与えられた文字列を1行ずつ読み込むだけです。スキャナそれ自体はnextInt()、nextFloat()と同じように解析機能を提供します。
しかし、他の人との違いは何ですか?
スキャナーはJDKバージョン1.5以降から付属しています。
いつScanner、またはBuffered Readerを使うべきですか?
両者の主な違いを見てください。1つはトークン化を使用し、もう1つは流線を使用しています。解析機能が必要な場合は、代わりにScannerを使用してください。しかし、私はBufferedReaderに慣れています。ファイルから読み取る必要がある場合は、BufferedReaderを使用します。ファイルを読み取るときにバッファが使用されるためです。あるいは、BufferedReaderをScannerへの入力として使用することもできます。
Scanner
は、チェックされた例外をスローしないので、より合理化されたコードになります。