Java Can';不能从一个文件中读取多个对象
我试图将(liue)对象放入Java Can';不能从一个文件中读取多个对象,java,file,object,objectinputstream,Java,File,Object,Objectinputstream,我试图将(liue)对象放入ArrayList中,但在代码末尾,我的列表仍然是空的。我一直在网上寻找答案,但我所找到的只是“把你的物品写在一个收藏中,然后读这个收藏”。但是文件已经被写入,我需要找到一种方法将所有(liue)对象放在ArrayList中 以下是编写代码(我无法修改): available()不返回要读取的剩余数据量,而是返回可以在不阻塞的情况下读取的数据量(暂停以等待来自文件/套接字/数据库等的更多数据)。在某些情况下,当仍有应读取的字节时,这可能返回零-0表示现在有0个可用字
ArrayList
中,但在代码末尾,我的列表仍然是空的。我一直在网上寻找答案,但我所找到的只是“把你的物品写在一个收藏中,然后读这个收藏”。但是文件已经被写入,我需要找到一种方法将所有(liue)对象放在ArrayList中
以下是编写代码(我无法修改):
available()不返回要读取的剩余数据量,而是返回可以在不阻塞的情况下读取的数据量(暂停以等待来自文件/套接字/数据库等的更多数据)。在某些情况下,当仍有应读取的字节时,这可能返回零-0表示现在有0个可用字节(无阻塞)。这可能是由于各种原因造成的-硬盘驱动器可能正忙于重新定位其磁性读卡器,或者网络连接可能正忙,或者您正在某处等待用户键入某些内容,然后才可以发送其信息。或者这可能是因为您正在读取的文件实际上没有额外的字节可读取,因为您已到达末尾。使用available()无法知道是否应该尝试读取字节
使用流复制文件的更正确方法是检查read的返回值作为文件结束值(-1):
当这段代码完成时,您知道所有的字节实际上都已被读取和复制,因为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());
FileInputStream fis=newfileinputstream(chooser.getSelectedFile().getName());
ObjectInputStream ois=新ObjectInputStream(fis);
Object obj=ois.readObject();
while(obj!=null)
{
champNom.setText((字符串)obj);
如果(obj实例)
l、 添加(obj);
obj=ois.readObject();
}
ois.close();
系统输出打印(l.size());
正如Joetjah所说,它不像听起来那样工作
有一种解决方案虽然不是非常优雅,但效果却出人意料地好,那就是只捕获异常
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();
}
}
试试看{
while(true)
l、 添加((代替)ois.readObject());
}捕获(ClassNotFoundException | IOException e){
//这里需要一个EOFEException
}最后{
试一试{
ois.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
每当在读取时抛出异常时(在某些情况下会出现异常!),它都会停止读取。这是有问题的。首先,在这种情况下,由于一些原因,您的建议是不可编译的,但在IMO中也是错误的。空检查除了检查空对象之外,没有做任何事情。如果OPs文件中碰巧有一个为空的LIUE,它将无法读取文件的其余部分。这将在最后抛出一个EOFEException。
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);
}
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());
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();
}
}