Мой ввод - это InputStream, который содержит документ XML. Используемая в XML кодировка неизвестна и определяется в первой строке XML-документа.
Из этого InputStream я хочу, чтобы весь документ был в строке.
Для этого я использую BufferedInputStream, чтобы отметить начало файла и начать чтение первой строки. Я читаю эту первую строку для получения кодировки, а затем использую InputStreamReader для генерации строки с правильной кодировкой.
Похоже, что это не лучший способ достижения этой цели, поскольку он вызывает ошибку OutOfMemory.
Есть идеи, как это сделать?
public static String streamToString(final InputStream is) {
String result = null;
if (is != null) {
BufferedInputStream bis = new BufferedInputStream(is);
bis.mark(Integer.MAX_VALUE);
final StringBuilder stringBuilder = new StringBuilder();
try {
// stream reader that handle encoding
final InputStreamReader readerForEncoding = new InputStreamReader(bis, "UTF-8");
final BufferedReader bufferedReaderForEncoding = new BufferedReader(readerForEncoding);
String encoding = extractEncodingFromStream(bufferedReaderForEncoding);
if (encoding == null) {
encoding = DEFAULT_ENCODING;
}
// stream reader that handle encoding
bis.reset();
final InputStreamReader readerForContent = new InputStreamReader(bis, encoding);
final BufferedReader bufferedReaderForContent = new BufferedReader(readerForContent);
String line = bufferedReaderForContent.readLine();
while (line != null) {
stringBuilder.append(line);
line = bufferedReaderForContent.readLine();
}
bufferedReaderForContent.close();
bufferedReaderForEncoding.close();
} catch (IOException e) {
// reset string builder
stringBuilder.delete(0, stringBuilder.length());
}
result = stringBuilder.toString();
}else {
result = null;
}
return result;
}