0

文字列に読み込んでいるログファイルがあります

public static String read (String path) throws IOException {
   StringBuilder sb = new StringBuilder();
   FileInputStream fs = new FileInputStream(path);
   InputStream in = new BufferedInputStream(fs);

   int r;
   while ((r = in.read()) != -1) {
       sb.append((char)r);
   }

   fs.close();
   in.close();

   return sb.toString();
}

次に、文字列全体を1回繰り返すパーサーがあります

void parse () {
   String con = read("log.txt");
   for (int i = 0; i < con.length; i++) {
       /* parsing action */
   }
}

これはCPUサイクルの無駄です。のすべてのコンテンツをループしますRead。次に、のすべてのコンテンツをループしますParse/* parsing action */メソッドのwhileループの下に配置することReadもできますが、同じコードをあちこちにコピーしたくありません。

内容に対して1回の反復でファイルを解析し、解析と読み取りに別々のメソッドを使用するにはどうすればよいですか?

C#では、ある種のyield returnが存在することは理解していますが、Javaにロックされています。

Javaでの私のオプションは何ですか?

4

1 に答える 1

2

これはCPUサイクルの無駄です。Readのすべてのコンテンツをループします。次に、Parseのすべてのコンテンツをループします。/*解析アクション*/をReadメソッドのwhileループの下に配置するだけで済みます。これは検出されますが、同じコードをあちこちにコピーしたくありません。

これは、CPUサイクルの膨大な浪費よりも悪いことです。コードが示すように、ファイル全体を1回だけ使用し、一度に1文字ずつ使用する場合、ファイル全体を文字列に読み込むのはメモリの大きな浪費です。また、ファイルが大きい場合は、メモリを使い果たします。

読みながら解析する必要があり、ファイル全体を一度にメモリにロードしないでください。

解析アクションを複数の場所から呼び出す必要がある場合は、同じコードをあちこちにコピーするのではなく、関数にして呼び出します。単一行の関数呼び出しをコピーすることは問題ありません。

于 2012-06-30T21:25:56.437 に答える