Проблемы с получением числа символов в файле

1

Я не понимаю, почему первый вариант работает, а второй - нет.

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();
}
  • 1
    В вашей нерабочей версии указатель файла находится в конце файла после цикла read . Вам нужно перемотать файл в исходное положение.
Теги:
file

2 ответа

1
Лучший ответ

BufferedReader использует указатель в файле для определения местоположения, из которого он должен читать, этот указатель изменяется всякий раз, когда мы вызываем метод read (*). поэтому в вашем случае второе желание ничего не будет читать, потому что указатель достигнет конца файла.

  • 0
    я понял, но как узнать размер потока, не используя первое чтение?
  • 1
    если вы строите свой входной поток из файла, то вы можете получить сайт, вызвав file.length() . если нет, то попробуйте преобразовать InputStream в ByteArrayInputStream, проверьте это
3

Во-первых, оба ваших фрагмента нарушены. Вы как раз призвание read без принятия какого - либо уведомления возвращаемого значения. Может быть больше данных для чтения, и он может очень не заполнить буфер... но вы все равно используете весь буфер.

Затем ваш второй фрагмент кода читает до конца контента... и затем пытается прочитать больше контента. Это не сработает.

Я настоятельно рекомендую отказаться от этого делать самостоятельно и использовать что-то вроде Files.toString(File, Charset) из Guava. Здесь нет необходимости изобретать колесо здесь, и если вы хотите его повторно изобретать, вам нужно будет изменить довольно много своего кода. (Я бы, наверное, начинал с нуля...)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню