我已经实现了自己的类来读取pcap
文件。 (二进制文件,即tcpdump、wireshark)
public class PcapReader implements Iterator<PcapPacket> {
private InputStream is;
public PcapReader (File file) throws FileNotFoundException, IOException {
is = this(new DataInputStream(
new BufferedInputStream(
new FileInputStream(file))));
}
@Override
public boolean hasNext () {
try {
return (is.available() > 0);
} catch (IOException e) {
return false;
}
}
//pseudo code!
@Override
public PcapPacket next () {
is.read(header);
is.read(body);
return new PcapPacket(header, body);
}
//more code here
}
然后我这样使用它:
PcapReader reader = new PcapReader(file);
while (reader.hasNext()) {
PcapPacket pcapPacket = reader.next();
//process packet
}
测试中的文件有 190 Mb。我还使用 JVisualVM 进行分析。
hasNext()
被调用 170 万次,时间为 7.7 秒next()
被调用相同次数,时间为 3.6 秒
我的主要问题是为什么 hasNext()
在绝对值上如此耗时,并且比 next
长两倍?
最佳答案
当您在 hasNext()
方法中调用 is.available()
时,它会进入 FileInputStream.available()
实现。这是一种 native 方法,如 FileInputStream source code 中所示。 .
最后,这确实是一个耗时的操作,因为文件操作的操作系统实现必须提前检查是否有更多数据可供读取。因此,它实际上会执行读取操作,而不更新文件指针(或将其更新回原始位置),只是检查是否有“下一个”字节。
关于java - 为什么 InputStream.available() 如此耗时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15249491/