0

BufferedInputStream のみが与えられ、読み取られるファイルに関する他の情報が与えられない関数があります。残念ながら、アクセスできないコードによってメソッド定義が呼び出されるため、メソッド定義を変更することはできません。以下のコードを使用してファイルを読み取り、その内容を文字列に配置しました。

public String[] doImport(BufferedInputStream stream) throws IOException, PersistenceException {
    int bytesAvail = stream.available();
    byte[] bytesRead = new byte[bytesAvail];
    stream.read(bytesRead);
    stream.close();
    String fileContents = new String(bytesRead);
    //more code here working with fileContents
}

私の問題は、大きなファイル (> 2Gb) の場合、このコードにより、プログラムが実行されているコンピューターに応じて、プログラムの実行が非常に遅くなるか、データが切り捨てられることです。この状況で大きなファイルを処理する方法に関する推奨事項はありますか?

4

2 に答える 2

1

available()ファイルのサイズを返すと仮定しています。そうではありません。読み取り可能なバイト数を返します。これは、ファイルのサイズ以下の任意の数値です。

残念ながら、ファイル データの長さに関する他の情報源がなければ (つまり、 を呼び出すことによってjava.io.File.length())、必要なことを 1 回のショットで実行する方法はありません。代わりに、複数の読み取りから蓄積する必要がある可能性があります。1 つの方法は、を使用することByteArrayOutputStreamです。固定の有限サイズの配列に読み取り、読み取ったデータを に書き込みますByteArrayOutputStream。最後に、バイト配列を引き出します。各呼び出しでバッファに読み取られたバイト数を正確に把握できるように、 read()andの 3 つの引数形式を使用write()し、 の戻り値を確認する必要があります。read()

于 2013-05-01T01:36:33.997 に答える
0

行ごとに読めないと思う理由がわかりません。BufferedInputStream基になるストリームにアクセスする方法のみを説明し、最終的にストリームからデータを読み取る方法に制限を課しません。他の と同じように使用できますInputStream

つまり、行ごとに読み取るには、次のことができます

InputStreamReader streamReader = new InputStreamReader(stream);
BufferedInputReader lineReader = new BufferedInputReader(streamReader);
String line = lineReader.readLine();
...

[編集] この応答は、入力ファイルを 1 行ずつ読み取る方法を具体的に尋ねた質問の元の文言に対するものです。

于 2013-05-01T01:42:45.100 に答える