Я внедрил свой собственный класс для чтения pcap
файлов. (Двоичные файлы, т.е. ТСРйитр, Wireshark)Почему InputStream.available() так много времени?
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 Мб. И я также использую JVisualVM для профиля.
hasNext()
называют 1,7 миллиона раз, а время 7.7 секундnext()
называется такое же количество раз, а время 3.6 секунд
Мой главный вопрос поэтому hasNext()
занимает столько времени в абсолютной величине, чем next
?
Я бы избегал доступных() как вредителей - его сломал дизайн (возвращает int!) Для стартеров, и вы должны иметь дело с IOException при фактическом чтении данных в любом случае. Его очень редкая на самом деле * нужна * для использования доступных(). – Durandal