Я не понимаю, почему первый вариант работает, а второй - нет.
BufferedReader reader = new BufferedReader(new InputStreamReader(in, charsetName));
try {
char[] buffer = new char[4096];
reader.read(buffer, 0, 4096);
return new String(buffer);
} finally {
reader.close();
}
BufferedReader reader = new BufferedReader(new InputStreamReader(in, charsetName));
try {
int size = 0;
int ch=0;
while ((ch=reader.read())!=-1){
size++;
}
char[] buffer = new char[size];
reader.read(buffer, 0, size);
return new String(buffer);
} finally {
reader.close();
}
BufferedReader
использует указатель в файле для определения местоположения, из которого он должен читать, этот указатель изменяется всякий раз, когда мы вызываем метод read (*). поэтому в вашем случае второе желание ничего не будет читать, потому что указатель достигнет конца файла.
file.length()
. если нет, то попробуйте преобразовать InputStream в ByteArrayInputStream, проверьте это
Во-первых, оба ваших фрагмента нарушены. Вы как раз призвание read
без принятия какого - либо уведомления возвращаемого значения. Может быть больше данных для чтения, и он может очень не заполнить буфер... но вы все равно используете весь буфер.
Затем ваш второй фрагмент кода читает до конца контента... и затем пытается прочитать больше контента. Это не сработает.
Я настоятельно рекомендую отказаться от этого делать самостоятельно и использовать что-то вроде Files.toString(File, Charset)
из Guava. Здесь нет необходимости изобретать колесо здесь, и если вы хотите его повторно изобретать, вам нужно будет изменить довольно много своего кода. (Я бы, наверное, начинал с нуля...)
read
. Вам нужно перемотать файл в исходное положение.