Почему этот код Java не пропускает строки с #? - PullRequest
6 голосов
/ 13 января 2011

Я немного новичок, но я пытаюсь разрешить внешнему .txt файлу, который читается скриптом Java, иметь возможность оставлять комментарии в начале файла, чтобы другие могли легко редактировать и добавлятьбольше к этому.Но если файл содержит # (знак, обозначенный для строки, которая является комментарием), он просто возвращает ошибку о том, что существует «Ошибка формата в файле» (исключение IOException - так что он проходит этот первый «IF» ...) Может кто-нибудь помочь?

Вот часть кода, которая имеет дело со строками комментариев из файла .txt, вызываемого ранее в сценарии:

   while ((line = br.readLine()) != null) {
    line = line.trim();
    if (line.length() < 1 || line.charAt(0) == '#') { // ignore comments
     continue;
    }
    final String[] parts = line.split("=");
    if (parts.length != 2) {
     throw new IOException("Format error in file "
       + JLanguageTool.getDataBroker().getFromRulesDirAsUrl(getFileName())
       + ", line: " + line);
    }

Файл input.txt разрываетсяэто в первой строке:

#This is a Test
ឲ្យ|ឱ្យ=អោយ
កំពស់=កម្ពស់
កម្នាញ់=កំណាញ់

А вот фактическая ошибка:

Caused by: java.io.IOException: Format error in file

file: / D: / Documents ....... / coherency.txt, строка: # Это тест в rules.km.KhmerSimpleReplaceRule.loadWords (KhmerSimpleReplaceRule.java:165) в rules.km.KhmerSimpleReplaceRule.loadWords (KhmerSimpleReplaceRule.java:82)далее

И ошибка трассировки стека:

Причина: java.io.IOException: Ошибка формата в файле [Ljava.lang.StackTraceElement; @ 1cb2795 в км.KhmerSimpleReplaceRule.loadWords (KhmereSimpleReplaceRule.java: 169)

Ответы [ 5 ]

9 голосов
/ 13 января 2011

Может быть знак порядка байтов UTF-8 перед вашим первым видимым символом. Большинство редакторов не будут отображать эти символы, поскольку только они предсказывают кодировку содержимого, а Java не удаляет метку порядка байтов UTF-8 (в отличие от UTF-16 и 32). Если действительно существует спецификация UTF-8, вам придется удалить эти три байта самостоятельно.

Подробнее см. Java-Bug 6378911 .

4 голосов
/ 13 января 2011

Это должно было сработать, если нет пробелов Вы можете попробовать этот код.

if (line.trim().startsWith("#") { // ignore comments
   continue;
}
2 голосов
/ 13 января 2011

Это должно работать, если # на самом деле не является первым непробельным символом в строке (или если у вас есть строка без комментариев где-либо, где нет или больше, чем один = в ней).

Я могу только предложить вам показать нам полное исключение, которое будет включать в себя фактическую оскорбительную строку. Вы также можете сделать это:

+ ", line: [" + line + "]");

так что вы уверены нет пробелов в начале или в конце. Кроме того, выведите line.codePointAt(0) в исключительной ситуации - это может быть проблема с языком / неправильным кодом Unicode.

Вы также можете подумать о том, чтобы сделать свой код более гибким, чтобы в нем также можно было оставлять комментарии в конце строк. Это простой вопрос удаления всего, начиная с первого # до конца строки перед тримом, и позволяет такие вещи, как:

password = xyzzy # super sekrit sauce from zork
1 голос
/ 13 января 2011

Попробуйте:

    line.indexOf('#') == 0

Или вы можете попробовать:

     line.substring(0,0).equals("#")

Или показать трассировку стека и найти фактический ответ.

1 голос
/ 13 января 2011

Ваш код на первый взгляд кажется правильным ... Я вижу несколько вариантов:

  1. Вы можете правильно прочитать файл свойств , если это действительно файл свойств.
  2. У вас ошибка в строке после комментария.
  3. # не является первым символом данной строки.

Может помочь трассировка стека и входной файл ...

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