最初に文字列に変換せずに、BufferedReaderを使用してByteBufferを読み取る方法はありますか?かなり大きなByteBufferをテキスト行として読みたいのですが、パフォーマンス上の理由から、ディスクへの書き込みは避けたいと思います。結果の文字列が大きすぎるため、ByteBufferでtoStringを呼び出すことはできません(java.lang.OutOfMemoryError:Javaヒープスペースがスローされます)。APIに適切なリーダーでByteBufferをラップする何かがあると思っていたのですが、適切なものが見つからないようです。
これが私がしていることを示す省略されたコードサンプルです):
// input stream is from Process getInputStream()
public String read(InputStream istream)
{
ReadableByteChannel source = Channels.newChannel(istream);
ByteArrayOutputStream ostream = new ByteArrayOutputStream(bufferSize);
WritableByteChannel destination = Channels.newChannel(ostream);
ByteBuffer buffer = ByteBuffer.allocateDirect(writeBufferSize);
while (source.read(buffer) != -1)
{
buffer.flip();
while (buffer.hasRemaining())
{
destination.write(buffer);
}
buffer.clear();
}
// this data can be up to 150 MB.. won't fit in a String.
result = ostream.toString();
source.close();
destination.close();
return result;
}
// after the process is run, we call this method with the String
public void readLines(String text)
{
BufferedReader reader = new BufferedReader(new StringReader(text));
String line;
while ((line = reader.readLine()) != null)
{
// do stuff with line
}
}