Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';不能从一个文件中读取多个对象_Java_File_Object_Objectinputstream - Fatal编程技术网

Java Can';不能从一个文件中读取多个对象

Java Can';不能从一个文件中读取多个对象,java,file,object,objectinputstream,Java,File,Object,Objectinputstream,我试图将(liue)对象放入ArrayList中,但在代码末尾,我的列表仍然是空的。我一直在网上寻找答案,但我所找到的只是“把你的物品写在一个收藏中,然后读这个收藏”。但是文件已经被写入,我需要找到一种方法将所有(liue)对象放在ArrayList中 以下是编写代码(我无法修改): available()不返回要读取的剩余数据量,而是返回可以在不阻塞的情况下读取的数据量(暂停以等待来自文件/套接字/数据库等的更多数据)。在某些情况下,当仍有应读取的字节时,这可能返回零-0表示现在有0个可用字

我试图将(liue)对象放入
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();
        }
    }