java - InputStream 对象在声明后关闭

标签 java inputstream xstream

代码在XStream的帮助下读取和写入对象。

在从XML文件读取对象的 block 中,InputStream对象在声明后关闭。这会导致线上发生异常 java.io.IOException: Stream Closed

ObjectInputStream objectIn = stream.createObjectInputStream(in)

编译时。

import java.io.*;
import java.util.*;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class PlayersXStreamIO
{
    public static void main(String... args) throws IOException, ClassNotFoundException
    {
        XStream stream = new XStream(new DomDriver());
        stream.setMode(XStream.ID_REFERENCES);

        if(args.length == 1)
        {
            try(OutputStream out = new FileOutputStream(args[0]);
                    ObjectOutputStream objectOut = stream.createObjectOutputStream(out))
            {
                Player max = new Player("max");
                max.setScore(5);
                Player moritz = new Player("moritz");
                moritz.setScore(3);
                objectOut.writeObject(max);
                objectOut.writeObject(moritz);
            }
        }
        else
        {
            try(InputStream in = new FileInputStream(args[0]);
                    ObjectInputStream objectIn = stream.createObjectInputStream(in))
            { // in.closed = true;
                List<Player> players = new ArrayList<>();
                while(in.available() > 0)
                {
                    players.add((Player) objectIn.readObject());
                }
                System.out.println(Arrays.toString(players.toArray()));
            }
        }
    }
}

堆栈跟踪是:

Exception in thread "main" java.io.IOException: Stream Closed
    at java.io.FileInputStream.available(Native Method)
    at capitel02.PlayersXStreamIO.main(PlayersXStreamIO.java:39)

最佳答案

我猜想,在包装 FileInputStream 以创建 ObjectInputStream 时,实现已经解析了完整的文件并关闭它。因此,您会收到流结束异常。解决方案是不访问文件输入流本身,而仅访问由 objectIn 变量引用的创建的 ObjectInputStream

关于java - InputStream 对象在声明后关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20829025/

相关文章:

java - 从 OutputStream 创建 InputStream 的最有效方法

java - 清理 HttpURLConnection 的正确方法

android - 为什么使用 inputStream 不读取外来字符?

java - 如何使用 Derby SQLState 常量

java - XML 解析抛出 java.lang.OutOfMemoryError : GC overhead limit exceeded

java - XStream:将部分 XML 保留为 XML

java - 使用 xstream 的自定义转换器

java - Web服务获取股票报价?

java - 我可以在普通 Java 应用程序中使用 gwt GUI 吗?

java - 如何处理同一域模型的多个 'views'?