从文件读取对象时可选数据异常 false

问题描述 投票:0回答:1

我正在尝试从文件中读取对象以将它们显示在 jpanel 上,但我很难反序列化它们。

public static void saveFile(Screen screen)
{
    JFileChooser find = new JFileChooser();
    find.setCurrentDirectory(new File(System.getProperty("user.dir")));
    int result = find.showSaveDialog(find);
    if(JFileChooser.APPROVE_OPTION == result)
    {
        File file = find.getSelectedFile();
        try
        {
            FileOutputStream fo = new FileOutputStream(file);
            ObjectOutputStream os = new ObjectOutputStream(fo);
            os.writeInt(screen.getObjects().size());
            ImageIO.write(screen.getBackgroundImage(), "png", os);
            for(Item i : screen.getObjects())
            {
                i.removeImage();
                os.writeObject(i);
            }
            os.close();
            fo.close();
            for(Item i : screen.getObjects())
            {
                i.setImg();
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
public static Screen loadFile()
{
    JFileChooser find = new JFileChooser();
    find.setCurrentDirectory(new File(System.getProperty("user.dir")));
    int result = find.showOpenDialog(find);
    if(JFileChooser.APPROVE_OPTION == result)
    {
        File file = find.getSelectedFile();
        try
        {
            FileInputStream fi = new FileInputStream(file);
            ObjectInputStream is = new ObjectInputStream(fi);
            int items = is.readInt();
            BufferedImage background = ImageIO.read(is);
            Screen screen = new Screen();
            screen.setBackground(background);
            for(int i = 0; i <= items; i++)
            {
                Item object = (Item) is.readObject();
                object.setImg();
                screen.addObject(object);
            }
            is.close();
            fi.close();
            return screen;
        }
        catch(OptionalDataException e)
        {
            System.out.println(e.eof);
            e.printStackTrace();
            return null;
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
}

屏幕和项目对象都实现了可序列化,并且 eof 返回 false,并在背景图像后面显示整数。项目对象都有缓冲图像,我已将这些图像设置为可在 jpanel 上拖动。由于缓冲图像并不是真正可序列化的,因此我从对象中删除图像,然后将它们写入文件,然后在写入完成后重新添加它们以供继续使用,并在读入项目对象时尝试重新制作它们。

java jpanel objectinputstream optionaldataexception
1个回答
0
投票

我想通了。我将我正在写入的整个文件转换为 png 只是为了背景图像,这搞乱了之后的所有内容。我保存了包含背景图像的文件对象,这似乎有效。

© www.soinside.com 2019 - 2024. All rights reserved.