1

BufferedReader を使用してテキスト ファイルから読み込もうとしています。「#」と「*」を含む行をスキップしたいのですが、うまくいきます。ただし、空行では機能しません。私は line.isEmpty() を使用していますが、最初の出力のみが表示されます。

私のテキストファイルは次のようになります。

# Something something
# Something something


# Staff No. 0

*  0  0  1

1 1 1 1 1 1

*  0  1  1

1 1 1 1 1 1

*  0  2  1

1 1 1 1 1 1

私のコード:

StringBuilder contents = new StringBuilder();
    try {
      BufferedReader input =  new BufferedReader(new FileReader(folder));
      try {
        String line = null;
        while (( line = input.readLine()) != null){
          if (line.startsWith("#")) {
              input.readLine(); 
          }
          else if (line.startsWith("*")) {
              input.readLine(); 
          }
          else if (line.isEmpty()) { //*this
              input.readLine(); 
          }
          else {
          contents.append(line);
          contents.append(System.getProperty("line.separator"));
          System.out.println(line);
          }
        }
      }
      finally {
        input.close();
      }
    }
    catch (IOException ex){
      ex.printStackTrace();
    }

私が望む出力は次のようになります:

1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
4

2 に答える 2

5

への各呼び出しreadline()は、変数に割り当てられていない場合は 1 行をスキップします。これらの呼び出しを削除するだけです。これによりほとんどの if-else ブロックが空になるため、次のように簡略化できます。

// to be a bit more efficient
String separator = System.getProperty("line.separator");
while (( line = input.readLine()) != null)
{
    if (!(line.startsWith("#") || 
          line.startsWith("*") ||
          line.isEmpty() )) 
    {
        contents.append(line);
        contents.append(separator);
        System.out.println(line);
    }
}
于 2012-05-16T10:01:39.133 に答える
2

コードのフロー制御を見てください。

これを行うと、どこに行き着きますか?

else if (line.isEmpty()) { //*this
    input.readLine(); 
}

行を読み取ると、コードはループを続行します。

while (( line = input.readLine()) != null){

別の行を読みます。

したがって、空の行に遭遇するたびに、その次の行は無視されます。

おそらく次のようにする必要があります。

else if (line.isEmpty()) { //*this
  continue;
}
于 2012-05-16T10:03:28.933 に答える