繁体   English   中英

如何使用 ObjectInputStream 读取 java 中的多个对象?

[英]How to read multiple objects in java using ObjectInputStream?

import java.util.*;
import java.io.*;
class Person implements Serializable
{
    String name;
    int age;
}
public class Main
{
    public static void main(String[] args) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        FileOutputStream fos = new FileOutputStream("Hello.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        System.out.println("Enter number of data:");
        int n = sc.nextInt();
        sc.nextLine();
        Person voter = new Person();
        for(int i=0;i<n;i++)
        {
            System.out.println("Enter name:");
            voter.name = sc.nextLine();
            System.out.println("Enter age:");
            voter.age = sc.nextInt();
            sc.nextLine();
            oos.writeObject(voter);
        }
        oos.close();
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Hello.txt"));
        Person buffer = null;
        while((buffer = (Person)ois.readObject())!=null)
        {
            if(buffer instanceof Person)
            {
                if(buffer.age<18)
                {
                    System.out.println(buffer.name+" is unable to vote.");
                }
                else
                {
                    System.out.println(buffer.name+" is able to vote.");
                }
            }
        }
    }
}

我正在尝试在 txt 文件中写入和读取多个对象,写入部分有效,但读取部分无效。 每个循环只读取第一个 object,如何读取下一个 object?

我收到此错误:

Exception in thread "main" java.io.EOFException
    at java.base/java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3062)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1561)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
    at Main.main(Main.java:31)

我认为您将 BufferedReader 功能与 ObjectInputStream 功能混淆了。

BufferedReader.readLine 的文档说:

回报:
包含行内容的字符串,不包括任何行终止字符,或者 null 如果在没有读取任何字符的情况下到达 stream 的末尾

但是,ObjectInputStream并非如此。 当到达 stream 的末尾时,它不会返回 null。 事实上,没有内置方法可以知道您何时处于 stream 的末尾; 你将不得不采取措施来表示结束。

由于您正在检查 null,因此最简单的方法是在关闭 ObjectOutputStream 之前自己编写null值:

oos.writeObject(null);
oos.close();

旁注:请注意,一次又一次地编写相同的 Person object 可能不会达到您的预期。 ObjectOutputStream 跟踪先前已写入 stream 的对象,因此不会重复它们。 您可以通过两种方式解决此问题:

  • 移动Person voter = new Person(); 你的 for 循环体内,因此每次都会写入一个新的 Person object。
  • 使用writeUnshared(voter)而不是 writeObject。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM