1

name=valueペアのエントリを含む Java プロパティ ファイルをjson文字列に変換する単純なパーサーを作成しています。以下はコードです。このコードでは、各エントリが新しい行にある必要があります。

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

プロパティ ファイルに余分な空の新しい行がある場合を除いて、関数は正常に動作します。(例: props ファイルに最後のエントリを書き込んでから 2 回入力すると、ファイルには最後のエントリの後に 2 つの空の改行が含まれます) . 期待される出力は ですが{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いて、それの前には何もないので、あなたの行は""because\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

次のコードは、空行の正規表現をチェックします。これも行う必要があります

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

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 に答える