2015-06-01 5 views
3

У меня есть несколько файлов (на самом деле они также являются исходными файлами java, сохраненными в Eclipse на Ubuntu), которые мне нужно читать и обрабатывать по строкам. Я заметил, что я не могу прочитать один из файлов. Код, который я использую, нижеСканер Java hasNextLine возвращает false

try (Scanner scanner = new Scanner(file)) { 
    while (scanner.hasNextLine()) { 
     builder.append(scanner.nextLine()).append("\n"); 
    } 
} catch (FileNotFoundException ex) { 
    System.out.println("Error"); 
} 

Я проверял заранее, существует ли файл. И это так. Я могу даже переименовать его. Но я не могу прочитать ни одной строки. hasNextLine просто возвращает false. (Я даже пытаюсь hasNext).

В конце я просматриваю содержимое файла и обнаруживаю, что есть другой вид (который был в разделе комментариев java-файла). Это следующий символ.

¸ 

Когда я удаляю этот символ, я могу нормально прочитать файл. Однако это неприемлемо. Что я могу сделать, чтобы читать файлы даже с этим символом?

+0

что вы пытаетесь сделать здесь? builder.append (scanner.nextLine()) добавьте ("\ п");. ?? добавив новую строку почему? похоже, что вы добавляете еще одну «новую строку». одна пустая строка ??? –

+0

Чтобы быть ясным, характерный период? Также как вы извлекаете файл. –

+3

это расширенный символ ascii (cedilla: U + 00B8) и не должен давать никаких проблем; вы должны проверить (с помощью hexeditor), что такое предыдущий байт; и в любом случае «Сканер сканер = новый сканер (файл,« UTF-8 »)' –

ответ

2

Это, скорее всего, проблема с набором символов, вызванная тем, что на платформе, на которой выполняется ваш Java-код, по умолчанию используется другой набор; это всегда хорошая практика, чтобы определить ожидаемый/необходимый набор символов, которые будут использоваться при анализе, и с классом Scanner является лишь вопросом называя constructor как:

Scanner scanner = new Scanner(file, "UTF-8"); 

где второй параметр является набор символов буквальный или даже better:

Scanner scanner = new Scanner(file, StandardCharsets.UTF_8); 
Смежные вопросы