在一种方法中循环遍历 ObjectInputStream 并在 main 方法中打印整个文件,但遇到 EOF 不工作或错误的问题

Looping through a ObjectInputStream in one method and print entire file in the main method, but having problems with EOF not working or erroring

所以我在一个方法中有一个有效的 ObjectOutputStream,我首先调用 main 中的方法。然后我需要读取它创建的文件并打印出其中的所有 5 个对象。现在我只打印出第一个对象。

public static AccountSerializable serializReadObject() throws ClassNotFoundException, IOException {
        AccountSerializable read = null;
        try { // Create an input stream for file accounts.ser
            ObjectInputStream input = new ObjectInputStream(new FileInputStream("accounts.ser"));
            read = (AccountSerializable) input.readObject();
            input.close();
        } catch (IOException i) {
            throw i;
        }catch(ClassNotFoundException c){
            throw c;
            
        }
        return read;

    }

    public static void main(String[] args) {

        try {
            System.out.println(serializReadObject());
        } catch (ClassNotFoundException | IOException e) {
            System.out.println("Class not found");
            e.printStackTrace();
        }
    }

我试过

boolean eof = false;
while(!eof){
try{
//read data
}catch(EOFException e){
eof = true;
}
}

在 serializReadObject 中循环它,我也尝试在 main 中捕获它,但我不断收到一条错误消息,指出“EOFException 无法访问捕获块,它已由捕获块处理” 然后我试图带走 IOException 并只是放置 EOFEception 但遗憾的是它一直迫使我用 IOException 包围我的阅读。还有其他方法可以用 EOF 循环吗?

您只获得第一个对象,因为您在每次调用时打开和关闭流。有很多方法可以实现你想要的。一种方法是使用 List<AccountSerializable>:

public static List<AccountSerializable> serializeReadObjects() throws IOException, ClassNotFoundException {
    // create an input stream for file accounts.ser
    // this line will throw an IOException if something goes wrong 
    // we don't need to catch it in this method though
    ObjectInputStream input = new ObjectInputStream(new FileInputStream("accounts.ser"));
    
    // create list to hold read in accounts
    List<AccountSerializable> accounts = new ArrayList<>();

    // keep reading until EOFException is thrown
    boolean keepReading = true;
    while(keepReading) {
        
        try {
            // read in serialized account
            AccountSerializable read = (AccountSerializable) input.readObject();
            // add read in serialized account to the list
            accounts.add(read);

        } catch(EOFException eofe) {
            // we are at the end of file, so stop reading
            keepReading = false;
            input.close();

        } catch(IOException ioe) {
            // input stream error other than EOF, not sure what to do
            input.close();
            throw ioe;
        } catch(ClassNotFoundException cnfe) {
            // not sure what to do in this case, so close input
            input.close();
            throw cnfe;
        }

    }
    
    return accounts;
}

public static void main(String[] args) {
    List<AccountSerializable> accounts = null;
    
    try {
        // get list of read in accounts
        accounts = serializeReadObjects();
    } catch (ClassNotFoundException | IOException e) {
        e.printStackTrace();
    }
    
    // iterate over list of read in accounts and output them to stdout
    for(AccountSerializable account : accounts) {
        System.out.println(account);
    }
}