我在尝试创建对象Frame的ArrayList时遇到了问题.在一个循环中,我总是创建一个Integers的ArrayList,然后使用此命令将新的Frame添加到ArrayList packetList.
packetList.add(new Frame(tempFrameList, size, count));
Run Code Online (Sandbox Code Playgroud)
我的问题是,我总是得到一个具有正确帧数的数组,但是每个帧都完全相同,包含最后添加的帧的值.
我认为问题不在于如何读取文件,因为当我将println添加到循环中时,我将元素添加到数组中,值是正确的.
这是我向ArrayList添加元素的代码:
public class OpenFile {
static Pcap pcap;
static PcapPacket packet = new PcapPacket(JMemory.POINTER);
static List<Frame> packetList = new ArrayList<Frame>();
public void init(){
final StringBuilder errbuf = new StringBuilder(); // For any error msgs
final String file = "trace-1.pcap";
int count = 0;
int size;
List<Integer> tempFrameList;
pcap = Pcap.openOffline(file, errbuf);
while (pcap.nextEx(packet) == Pcap.NEXT_EX_OK) {
tempFrameList = new ArrayList<Integer>();
count++;
size = packet.size();
for (int i = 0; i < size; i++) {
tempFrameList.add(packet.getUByte(i));
}
//here is my problem
packetList.add(new Frame(tempFrameList, size, count));
}
pcap.close();
}
}
Run Code Online (Sandbox Code Playgroud)
以下是Frame类的代码:
public class Frame{
private static List<Integer> frame = new ArrayList<Integer>();
private static int size;
private static int serialNum;
public Frame(List<Integer> data, int newSize, int num) {
Frame.frame = data;
Frame.size = newSize;
Frame.serialNum = num;
}
}
Run Code Online (Sandbox Code Playgroud)
这是你的问题:
public class Frame{
private static List<Integer> frame = new ArrayList<Integer>();
private static int size;
private static int serialNum;
Run Code Online (Sandbox Code Playgroud)
Frame的成员不应该是静态的,因为静态成员在类的所有实例之间共享.删除static关键字.
还要相应地更改构造函数:
public class Frame {
private List<Integer> frame = new ArrayList<Integer>();
private int size;
private int serialNum;
public Frame(List<Integer> data, int newSize, int num) {
this.frame = data;
thus.size = newSize;
this.serialNum = num;
}
}
Run Code Online (Sandbox Code Playgroud)