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