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中有什么东西像收益回报,或者我应该忘记它吗?这可能很有用。