readLine()
メソッドがを返すまで、バッファリーダーを使用して入力ファイルを読み取るJavaコードがありますnull
。ファイルの内容を何度も使用する必要があります。このファイルを最初から読み直すにはどうすればよいですか?
9 に答える
閉じてから再度開くことができます。別のオプション:大きすぎない場合は、そのコンテンツをたとえばリストに入れます。
バッファリーダーは、バッファリングされたデータの位置へのreset()のみをサポートします。しかし、これはファイルの先頭に移動できません(そのファイルがバッファよりも大きいと仮定します)。
解決策: 1。
再度開く2.RandomAccessFileを使用
する
Reader
ファイルを読み取るには、シングルを1回使用する必要があります。ファイルをもう一度読みたい場合は、Reader
それに基づいて新しいファイルを作成します。
GuavaのIOユーティリティを使用すると、Files.newReaderSupplier(File、Charset)を使用して、ファイルを何度でも読み取ることができる優れた抽象化を作成できます。これにより、いつでも呼び出すことで新しいものを取得できるInputSupplier<InputStreamReader>が得られます。Reader
getInput()
さらに良いことに、Guavaにはsを直接利用する多くのユーティリティメソッドがありますInputSupplier
...これにより、提供されたものを自分で閉じることを心配する必要がなくなりReader
ます。CharStreamsクラスには、テキスト関連のIOユーティリティのほとんどが含まれています。簡単な例:
public void doSomeStuff(InputSupplier<? extends Reader> readerSupplier) throws IOException {
boolean needToDoMoreStuff = true;
while (needToDoMoreStuff) {
// this handles creating, reading, and closing the Reader!
List<String> lines = CharStreams.readLines(readerSupplier);
// do some stuff with the lines you read
}
}
を指定するとFile
、次のようにこのメソッドを呼び出すことができます。
File file = ...;
doSomeStuff(Files.newReaderSupplier(file, Charsets.UTF_8)); // or whatever charset
最初にすべての行をメモリに読み込まずに各行に対して何らかの処理を実行する場合は、代わりにLineProcessorreadLines
を使用するオーバーロードを使用することもできます。
これを実行したい場合は、ランダムアクセスファイルを検討することをお勧めします。これにより、位置を明示的に最初に戻し、そこから読み始めることができます。
コモンズライブラリの使用を提案します
http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html
別のアプローチかもしれないbyteArrayにファイルを読み込むための呼び出しがあると思います
BufferedReaderのとmark()
メソッドreset()
を検討したかどうかわからない
これは、ファイルのサイズが数MBしかない場合のオプションであり、ファイルの先頭にマークを設定し、ファイルの末尾に到達したらリセット()を続けることができます。また、同じファイルに対する後続の読み取りは、ディスクに移動することなく、バッファーから完全に提供されるようです。
これを行うには、これ以上行を読み取れないかどうかを確認した後、run()関数を再帰的に呼び出します。これがサンプルです。
// Reload the file when you reach the end (i.e. when you can't read anymore strings)
if ((sCurrentLine = br.readLine()) == null) {
run();
}
私は同じ問題に直面し、この質問に迷い込んだ。
1. mark()およびreset()メソッドの使用:
BufferedReaderは、FileReaderとFileInputStreamを使用して作成できます。FileReaderは、MarkメソッドとResetメソッドをサポートしていません。これを実行しようとしたときに例外が発生しました。FileInputStreamを試してみても、ファイルが大きいために実行できませんでした(あなたのファイルでもそうだと思います)。ファイルの長さがバッファよりも大きい場合、マークとリセットのメソッドは、FileReaderでもFileInputStreamでも機能しません。これについては、@jtahlbornによるこの回答で詳しく説明しています。
2.ファイルを閉じて再度開く
ファイルを閉じて再度開き、新しいBufferedReaderを作成すると、正常に機能しました。私が推測する理想的な方法は、ファイルを再度開いて、FileReaderまたはFileInputStreamをファイルの読み取りに1回だけ使用する必要があるため、新しいBufferedReaderを作成することです。
try {
BufferedReader br = new BufferedReader(new FileReader(input));
while ((line = br.readLine()) != null)
{
//do somethng
}
br.close();
}
catch(IOException e)
{
System.err.println("Error: " + e.getMessage());
}
}