如何修复流关闭异常

Posted

技术标签:

【中文标题】如何修复流关闭异常【英文标题】:How to fix Stream Closed Exception 【发布时间】:2019-12-03 22:07:42 【问题描述】:

我正在编写一个小程序,我可以将列表写入 json 文件,因此我创建了 Dealer 类的两个实例,然后将其添加到“dealerList”中。

我尝试写入名为“Dealer.json”的 json 文件,所以我从名为“dealerList”的列表中读取对象,然后将其写入 json 文件。

public class Main 
    private static List<Dealer> dealerList = new ArrayList<>();

    public static void main(String[] args) 
            Dealer dearler = new Dealer("Chevrolet");
            dearler.addCartoDealer(new Cars("Camaro","Steve",11000));
            dearler.addCartoDealer(new Cars("Coverette","Jhon",22000));
            Dealer dearler1 = new Dealer("Ford");
            dearler1.addCartoDealer(new Cars("Ford1","Jessie",11000));
            dearler1.addCartoDealer(new Cars("Ford2","Smith",22000));
            dealerList.add(dearler);
            dealerList.add(dearler1);
            ObjectMapper mapper = new ObjectMapper();

            try(FileOutputStream newFile = new FileOutputStream("Dealer.json"))
               for(Dealer dealer:dealerList)
                  mapper.writeValue(newFile,dealer);
               
             catch (IOException e)
              e.printStackTrace();
            
    

我得到的堆栈:

java.io.IOException: Stream Closed
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:326)
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2093)
    at com.fasterxml.jackson.core.json.UTF8JsonGenerator.close(UTF8JsonGenerator.java:1137)
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3983)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:3245)
    at com.Ayoub.Main.main(Main.java:26)

我得到了 Stream 关​​闭异常

【问题讨论】:

【参考方案1】:

我认为 Jackson 在致电 writeValue 后会自动关闭您的直播。您可以通过以下方式关闭此功能:

MessagePackFactory messagePackFactory = new MessagePackFactory();
messagePackFactory.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
ObjectMapper objectMapper = new ObjectMapper(messagePackFactory);

不要忘记在某个时间点自己关闭流 ;-)

【讨论】:

MessagePackFactory 是 jackson 包的一部分,因为如果你能提供包,intellij 似乎不会导入它 @souid wejden 您也可以在默认的JsonFactory 上配置此功能,如下所示:objectMapper.getFactory().disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);。如果需要,您还可以使用任何其他 JsonFactory 实现,具体取决于您的需要。【参考方案2】:

刚刚发现应该添加:

JsonFactory jsonFactory = new JsonFactory();
jsonFactory.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET,false);
ObjectMapper mapper = new ObjectMapper(jsonFactory);

【讨论】:

以上是关于如何修复流关闭异常的主要内容,如果未能解决你的问题,请参考以下文章

如何修复关闭后插入的 XML 节点

innodb_force_recovery强制修复MySQL异常关闭问题

visual studio 菜单栏显示异常 插件安装异常 扩展异常修复

无法访问已处置的对象 - 如何修复?

电脑里的“HTTP协议”存在异常项,怎么修复?

安全手柄已关闭 - 修复的众多选项