1

我正在编写一个简单的解析器来将包含name=value成对条目的 java 属性文件转换为json字符串。下面是代码。该代码要求每个条目都在一个新行中:

      sCurrentLine = br.readLine();
        while ((sCurrentLine) != null)
        {                           
              config+=sCurrentLine.replace('=', ':');
              sCurrentLine = br.readLine()
              if(sCurrentLine!=null)
              config+=",";
        }
        config+="}";

该函数工作正常,除非属性文件中有额外的空新行。(例如:假设我在 props 文件中写入最后一个条目,然后按两次输入,该文件将在最后一个条目之后包含两个空的新行)。虽然预期的输出是{name1:value1,name2:value2},但在上述情况下,当存在额外的新行时,我得到的输出为{name1:value1,name2:value2,}. 尾随,的数量随着空新行的数量而增加。

我知道它是因为readLine()它在逻辑上不应该读取空行,但是我该如何更改呢?

4

3 回答 3

2

这可以使用该contains()方法解决。只需确保 a"="在您的行中存在..

while ((sCurrentLine) != null)
    {
          if(sCurrentLine.contains("=") {                           
              config+=sCurrentLine.replace('=', ':');
              sCurrentLine = br.readLine()
              if(sCurrentLine!=null)
                  config+=",";
          }
    }

例子

sCurrentLine = "name=dave"
if(sCurrentLine.contains("=")) // Evaluates to true.
      // Do logic.

sCurrentLine = ""
if(sCurrentLine.contains("=")) // Evaluates to false.
     // Don't do logic.

sCurrentLine = "\n"
if(sCurrentLine.contains("=")) // Evaluates to false.
     // Don't do logic.

我知道它是因为 readLine() 读取空行,而逻辑上它不应该读取空行,但我该如何更改呢?

readLine()读取所有内容\n。这就是它可以检查新行的方式。你已经得到\n并且之前什么都没有,所以你的行将包含""因为\n被省略。

轻微增强

如果您想确保您的行中肯定有一个名称和一个属性,那么您可以使用一些简单的正则表达式。

if(s.CurrentLine.matches("\\w+=\\w+"))
// Evaluates to any letter, 1 or moe times, followd by an "=", followed by letters.
于 2013-08-29T09:31:01.607 回答
1

一种方法是使用方法trim()检查当前行是否为空:

  sCurrentLine = br.readLine();
    while ((sCurrentLine) != null)
    {                           
          If ("".equals(sCurrentLine.trim()) == false)
          {
            config+=sCurrentLine.replace('=', ':');
            sCurrentLine = br.readLine()
            if(sCurrentLine!=null)
            config+=",";
          }
    }
    config+="}";
于 2013-08-29T09:33:30.823 回答
1

以下代码将检查正则表达式是否有空行。这也应该做

 if (sCurrentLine != null){
            if (!sCurrentLine.matches("^\\s*$"))  // matches empty lines
                    config += ",";
        }
于 2013-08-29T09:45:59.127 回答