2015-06-23 3 views
1

Я хотел бы прочитать и распечатать текстовый файл в консоль, так что я сделал это с ниже кодНеправильный выход при попытке чтения текстового файла

File file = new File("G:\\text.txt"); 
FileReader fileReader = new FileReader(file); 
int ascii = fileReader.read(); 

while (ascii != -1) 
{ 
result = result + (char) ascii; 
ascii = fileReader.read(); 
} 
System.out.println(result); 

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

Hello to every one 

Для того, чтобы иметь текстовый файл, я использовал блокнот, и, когда я изменить режим кодирования я буду получать странный вывод из моего кода.

Анси: Привет каждый один

Unicode: ÿþh ellotoeveryone

Unicode большой Endian: Thy hellotoeveryone

UTF-8: ï »¿привет каждый

Почему я получить эти странные результаты? Есть ли проблемы с моим кодом? Или есть другие причины

+2

Из-за режима кодирования? Вы уже упоминали, что это происходит, когда вы меняете режим кодирования. – Gosu

+0

@Gosu: да, как вы можете видеть, когда я изменил режим кодирования, я получаю разные результаты. –

+0

Вместо этого используйте InputStreamReader вместе с правильным режимом кодирования? – Gosu

ответ

5

Ваш файл начинается с byte-order mark (U + FEFF). Это должно происходить только в первом символе файла - оно не очень широко используется, но различные инструменты Windows включают его, включая Блокнот. Вы можете просто снять его с начала первой строки.

Как в стороне, я настоятельно рекомендую не с использованием FileReader - он не позволяет указать кодировку. Я бы использовал Files.newBufferedReader и либо задал кодировку, либо по умолчанию использовал UTF-8 (а не системную по умолчанию кодировку, которую использует FileReader). Когда вы используете BufferedReader, вы можете просто прочитать строку в то время, с readLine() тоже:

String line; 
while ((line = reader.readLine()) != null) { 
    System.out.println(line.replace("\uFEFF", "")); 
} 

Если вы действительно хотите читать посимвольно, это стоит того, чтобы в привычку использовать a StringBuilder вместо повторной конкатенации строк в цикле. Также обратите внимание, что ваше имя переменной ascii вводит в заблуждение: на самом деле это блок кода UTF-16, который может быть или не быть символом ASCII.

Кодировка, которую вы указываете, должна соответствовать кодировке, используемой для записи файла, - в этот момент вы должны увидеть правильный вывод вместо дополнительного символа между каждым «реальным» символом при использовании Юникода и Юникода большого конца.

+0

кажется, что ваш ответ верен, не могли бы вы составить правильный способ использования 'Files.newBufferedReader'?! –

+1

@ElyasHadizadeh: Вы посмотрели документацию и попытались сами ее использовать? Очень важно иметь возможность проводить собственные исследования. –

+0

да, вы полностью верны, спасибо за ваши советы и ответы ;-) –