Почему мой Java BufferedReader читает нули в начале и конце файла?

У меня возникли проблемы с пониманием того, что не так с кодом ниже. Он выводит нули, когда их нет.

вывод: null This is one. This is two. This is three. This is four five six. seven? null

Содержимое файла:

This is one.
This is two.
This is three.
This is four
five
six.
seven?

Любая помощь по этому вопросу будет принята с благодарностью!

try (BufferedReader br = new BufferedReader(new FileReader(filename))) {

    String cLine="";
    while ((cLine = br.readLine()) != null) {
        content+= cLine;

    }
} catch (IOException e) {
    e.printStackTrace();
}

System.out.println(content);

person L337BEAN    schedule 28.02.2013    source источник
comment
Покажите, как инициализируется содержимое, вероятно, установлено значение null   -  person Mike Q    schedule 01.03.2013
comment
Кроме того, предпочтительнее использовать StringBuilder для многократного объединение строк.   -  person Alan Krueger    schedule 01.03.2013


Ответы (3)


Я подозреваю, что content для начала имеет значение null (а не пустое), что объясняет первый null. По общему признанию, это не объясняет последнее... Я предполагаю, что вы действительно исправили ошибку, так как видели вывод с null в конце. Либо так, либо ваш файл на самом деле имеет null в конце. (Я протестировал его с content, инициализированным как "", и все в порядке.)

Знаете ли вы, что вы удаляете все разрывы строк и не заменяете их каким-либо разделителем? Таким образом, файл со строками «x», «y» и «z» станет просто «xyz».

Кроме того, рассмотрите возможность использования StringBuilder, а не конкатенации строк — это будет более эффективно, поскольку не нужно будет постоянно копировать строку.

person Jon Skeet    schedule 28.02.2013
comment
просто интересно, насколько мне известно, вернет ли BufferedReader значение null, если обнаружит возврат каретки? Итак, возможно, 2-й нуль - это пустая строка под «семеркой»? - person Chris; 01.03.2013
comment
@ChristopherDay: Нет, вместо пустой строки будет возвращена пустая строка. Он только возвращает null в конце потока. - person Jon Skeet; 01.03.2013
comment
Спасибо, что нашли время ответить на этот вопрос. Я знаю, что это не по теме из основного вопроса. - person Chris; 01.03.2013
comment
Спасибо, Джон, ты был прав. Второй нуль был вызван system.out в свернутом методе. - person L337BEAN; 11.03.2013

Просто комментарий...

Я не знал этого синтаксиса try. Сначала я подумал, что это опечатка, но обнаружил, что это действительно работает (я скомпилировал его и запустил код).

Я думал, что всегда так: try { .... .... .... } catch() {}

при дальнейшем чтении обнаружил, что это новая функция Java 7, «попробуйте с ресурсом» (из Специальный синтаксис блока java try catch)

person GJ13    schedule 28.02.2013

Если вы начинаете с Java, я предлагаю что-то более простое... например, вместо этого использовать сканер для файла. Подумайте над следующим:

Scanner fileRead = new Scanner(fileName);

while ( fileRead.hasNextLine() ) {
    System.out.println( fileRead.nextLine() );
}

Мое предложение в любом случае.

person ObedMarsh    schedule 28.02.2013
comment
Если он новичок в Java, проще начать с более простых способов, это просто предложение. Если речь идет о том, чтобы он учился, а не просто получал ответ, я бы счел это полезным. - person ObedMarsh; 01.03.2013