Java迭代阅读&;解析

Java迭代阅读&;解析,java,performance,parsing,iterator,Java,Performance,Parsing,Iterator,我有一个正在读取字符串的日志文件 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.

我有一个正在读取字符串的日志文件

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 */
   }
}
void解析(){
字符串con=read(“log.txt”);
对于(int i=0;i
这是对cpu周期的极大浪费。我循环阅读
中的所有内容。然后我循环遍历
Parse
中的所有内容。我可以将
/*解析操作*/
放在
Read
方法中的while循环下,该方法可以找到,但我不想到处复制相同的代码

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

在C#中,我知道存在某种收益率回报,但我对Java非常着迷

我的Java选项是什么

这是对cpu周期的极大浪费。我循环阅读所有的内容。然后我循环解析中的所有内容。我可以将/*解析操作*/放在Read方法的while循环下,这将是find,但我不想到处复制相同的代码

这比浪费cpu周期更糟糕。将整个文件读入字符串是一种巨大的内存浪费,如果您只使用一次,并且使用的是向前看一个字符,正如代码所示。如果文件很大,则会耗尽内存

您应该在读取时进行解析,而不要将整个文件一次加载到内存中


如果需要从多个位置调用解析操作,请将其设置为函数并调用,而不是将同一代码复制到所有位置。复制一行函数调用是可以的。

有没有理由不在你读这行时立即进行复制,因为我理解了这个问题,我们可以在读这行之后立即进行模式匹配,还是我遗漏了什么?如果这真的是你读文本文件的方式,您需要解决的问题比内存和CPU使用率更重要。您读取的是字节而不是字符,每个字节都被读取为int,并且该int的字符串表示形式被附加到StringBuilder中。如果文件包含ASCII格式的ABC,则字符串为“656667”。我甚至没有提到你不关闭你的流,你不尊重Java命名约定。我可能会这样做,但是Java中有什么东西像收益回报,或者我应该忘记它吗?这可能很有用。