我正在尝试将(Lieu)对象放入ArrayList
,但是在代码的末尾,我的列表仍然是空的。我一直在网上寻找答案,但我找到的只是“将你的对象写在一个集合中然后阅读集合”。但是文件已经写好了,我需要找到一种方法将所有(Lieu)对象放在ArrayList中。
这是编写代码(我无法修改它):
public static void main(String[] args) {
Lieu<Double, String> p1;
Lieu<Double, String> p2;
Lieu<Double, String> p3;
SegmentGeo<String> e1;
SegmentGeo<String> e2;
SegmentGeo<String> e3;
Parcelle<String> p = new Parcelle<String>();
ArrayList<Mesure<Point<Double>, String>> segs;
p1 = new Lieu<Double, String>(45.573715, -73.900295, "p1");
p2 = new Lieu<Double, String>(45.573882, -73.899748, "p2");
p3 = new Lieu<Double, String>(45.574438, -73.900099, "p3");
e1 = new SegmentGeo<String>(p1, p2, "Parcelle test");
e2 = new SegmentGeo<String>(p2, p3, "Parcelle test");
e3 = new SegmentGeo<String>(p3, p1, "Parcelle test");
segs = new ArrayList<Mesure<Point<Double>, String>>();
segs.add(e1);
segs.add(e2);
segs.add(e3);
try {
p.setMesures(segs);
} catch (TrajectoireNonValideException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ObjectOutputStream ois = null;
try {
ois = new ObjectOutputStream(new FileOutputStream("essai.txt"));
ois.writeObject(p.informationCumulee());
ois.writeObject(p1);
ois.writeObject(p2);
ois.writeObject(p3);
} catch (EOFException ex) {
System.out.println("Fin de fichier atteinte.");
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
if (ois != null) {
ois.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
这就是我要做的事情:
public void actionPerformed(ActionEvent arg0) {
JFileChooser chooser = new JFileChooser();
int retour = chooser.showOpenDialog(getParent());
if(retour==JFileChooser.APPROVE_OPTION){
try{
FileInputStream fis = new FileInputStream(chooser.getSelectedFile().getName());
ObjectInputStream ois = new ObjectInputStream(fis);
champNom.setText((String) ois.readObject());//that's just to display the name
while (ois.available()!=0)
{
temp = (Lieu)ois.readObject();
l.add(temp);
}
ois.close();
System.out.print(l.size());//The size is 0
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
正如Joetjah所说,available()
并不像听起来那样有效。
一个不是超级优雅但效果出奇的解决方案就是抓住Exception
s,当没有任何东西可以阅读或其他例外时,它会被抛出:
try {
while (true)
l.add((Lieu<Double,String>)ois.readObject());
} catch (ClassNotFoundException | IOException e) {
//Expecting a EOFException here
} finally {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
每当阅读时抛出异常(并且在某些时候会有一个!),它将停止阅读。
答案 1 :(得分:0)
Available doesn't do what you think it does
available()不返回剩余要读取的数据量,而是返回可以无阻塞地读取的数据量(暂停等待来自文件/套接字/数据库等的更多数据)。在某些情况下,这仍然可以返回零,同时仍然有应该读取的字节 - 0表示现在有0个字节可用(没有阻塞)。这可能由于各种原因而发生 - 硬盘驱动器可能忙于重新定位其磁读取器,或者网络连接可能正忙,或者您可能正在等待某个用户在其信息可能被发送之前键入内容。或者可能是因为你正在阅读的文件确实没有额外的字节要读,因为你已经到了最后。使用available()你无法知道你是否应该尝试读取字节。
使用流复制文件的更正确的方法是检查文件结束值(-1)的读取返回值:
InputStream is = // some input
OutputStream os = // some output
byte buffer = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
当此代码完成时,您知道所有字节确实已被读取和复制,因为while循环不会完成,直到read()返回-1,表示输入结束。
现在,在你的情况下,我建议把它带到其他方向,如:
FileInputStream fis = new FileInputStream(chooser.getSelectedFile().getName());
ObjectInputStream ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
while (obj != null)
{
champNom.setText((String)obj);
if (obj instanceof Lieu<Double, String>)
l.add(obj);
obj = ois.readObject();
}
ois.close();
System.out.print(l.size());