BufferedReader dla dużego ByteBuffera?
Czy istnieje sposób na odczyt ByteBuffera za pomocą BufferedReader bez konieczności zamieniania go najpierw w String? Chcę czytać dość duży ByteBuffer jako linie tekstu i ze względu na wydajność chcę uniknąć zapisywania go na dysku. Wywołanie toString w ByteBuffer nie działa, ponieważ wynikowy ciąg znaków jest zbyt duży (zgłasza java.lang.OutOfMemoryError: przestrzeń sterty Java). Pomyślałbym, że w interfejsie API znajdzie się coś, co mogłoby owinąć ByteBuffera w odpowiednim czytniku, ale nie mogę znaleźć niczego odpowiedniego.
Oto przykład skróconego kodu ilustrujący to, co robię):
// 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
}
}