首页 > 解决方案 > 读取文件时永远不会在正文错误中引发 EOFException

问题描述

我必须读入一个特定的网络文件并对数据求和。我正在使用用于 Java 的 pcap4j 库,并使用该库的 github 主机中的示例来读取数据包文件。我正在使用无限 for 循环来读取数据,提取每个数据包的协议,然后当到达 EOF 时,抛出一个打破循环的异常,但是我得到一个编译错误,即 EOFException 永远不会在相应的尝试体中抛出陈述。

句柄之前已分配给以下内容: for 循环是我读取文件和数据包的开始。

finalPcapHandle handle;
handle = Pcaps.openOffline("final-name.pcap");




for(;;) {
     try {
        Packet packet = handle.getNextPacket();
        IpV4Packet ipv4 = packet.get(IpV4Packet.class);
        IpNumber prot = ipv4.getHeader().getProtocol();

        String comp = prot.toString();

        if(comp.contains("UDP")) {
              udp++; //variable to count
         } else if (comp.contains("TCP")) {
              tcp++; //variable to count
         } else {
              all++; //variable to count
         }

      } catch (EOFException e) {
         System.out.println("End of file");
         break;
      }
  }

  tot = udp + tcp + all;
  System.out.println("TCP: " + tcp);
  System.out.println("UDP: " + udp);
  System.out.println("All: " + all);

标签: javanetwork-programmingpcap

解决方案


这里唯一与 EOF 有任何关系的方法是读取下一个数据包的方法,即getNextPacket. 从文档中可以看到getNextPacket行为方式:

public Packet getNextPacket() throws NotOpenException
...
使用数据包工厂从捕获的数据包创建的数据包对象。可能为 null

这意味着函数不会抛出一个,EOFException而是可以null在没有更多数据包的情况下返回。

还有另一种方法 - getNextPacketEx

public Packet getNextPacketEx() 抛出 PcapNativeException, EOFException , TimeoutException, NotOpenException
...
EOFException - 如果正在从 pcap 文件中读取数据包并且没有更多数据包可从该文件中读取。

此方法被明确定义为不返回null,而是EOFException在文件末尾抛出一个。


推荐阅读