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();
}

然后我有一个解析器迭代整个字符串一次

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

这极大地浪费了 CPU 周期。我循环遍历Read. 然后我循环遍历Parse. 我可以/* parsing action */将 while 循环放在Read方法中,它会被找到,但我不想到处复制相同的代码。

如何在一次迭代中解析文件的内容,并且仍然有单独的解析和读取方法?

在 C# 中,我知道有某种收益返回的东西,但我被 Java 锁定了。

我在 Java 中有哪些选择?

4

1 回答 1

2

这极大地浪费了 CPU 周期。我遍历 Read 中的所有内容。然后我遍历 Parse 中的所有内容。我可以将 /* 解析操作 */ 放在 Read 方法中的 while 循环下,这可以找到,但我不想到处复制相同的代码。

这比大量浪费 CPU 周期更糟糕。将整个文件读入一个字符串是一种巨大的内存浪费,如果您只打算使用它一次并且使用是一次查看一个字符,如您的代码所示。如果你的文件很大,你会耗尽内存。

您应该在阅读时进行解析,并且永远不要一次将整个文件加载到内存中。

如果需要从多个位置调用解析操作,请将其设为函数并调用它,而不是到处复制相同的代码。复制单行函数调用很好。

于 2012-06-30T21:25:56.437 回答