为什么这个Java代码没有用#跳过?

时间:2011-01-13 08:37:29

标签: java file-io

我有点像新手,但我正在尝试允许Java脚本读取的外部.txt文件能够在文件开头有一些注释,以便其他人可以轻松编辑并添加更多的是它。 但是如果文件包含#(为一行注释指定的符号),它只返回错误,即文件中存在“格式错误”(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
     

文件:/ d:/文件....... / coherency.txt,   line:#This是一个测试       at rules.km.KhmerSimpleReplaceRule.loadWords(KhmerSimpleReplaceRule.java:165)       at rules.km.KhmerSimpleReplaceRule.loadWords(KhmerSimpleReplaceRule.java:82)       ......还有33个

堆栈跟踪错误:

  

引起:java.io.IOException:Format   文件中的错误   [Ljava.lang.StackTraceElement; @ 1cb2795   在   km.KhmerSimpleReplaceRule.loadWords(KhmereSimpleReplaceRule.java:   169)

5 个答案:

答案 0 :(得分:9)

在您的第一个可见角色前面可能有一个UTF-8字节顺序标记。大多数编辑器都不会显示这些字符,因为它只预测内容的编码,Java不会删除UTF-8字节顺序标记(与UTF-16和32不同)。如果确实存在UTF-8 BOM,则必须自行删除这三个字节。

有关详细信息,请参阅Java-Bug 6378911

答案 1 :(得分:4)

除非有空格,否则这应该有效。 你可以尝试这段代码。

if (line.trim().startsWith("#") { // ignore comments
   continue;
}

答案 2 :(得分:2)

这应该有效,除非#实际上不是该行上的第一个非空格字符(或者你的某个地方有一个非注释行,其中没有或多个= )。

我只能建议您向我们展示整个例外情况,其中包括其中的实际违规行。你可能也想做到:

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

所以你确定没有前导空格或尾随空格。此外,异常中的输出line.codePointAt(0) - 它可能是语言/错误的Unicode代码问题。

您也可以考虑让代码更灵活,以便在行尾添加注释。这是一个简单的问题,即从剪切前的第一个#到最后一行剥离所有内容,并允许以下内容:

password = xyzzy # super sekrit sauce from zork

答案 3 :(得分:1)

您的代码最初似乎正确... 我可以看到几个选项:

  1. 如果它实际上是属性文件,您可以read the Properties file正确。
  2. 评论后面的一行中有错误。
  3. #不是该给定行的第一个字符。
  4. 堆栈跟踪和输入文件可能有帮助......

答案 4 :(得分:1)

尝试:

    line.indexOf('#') == 0

或者你可以试试:

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

或显示堆栈跟踪并找到实际答案。