代码之家  ›  专栏  ›  技术社区  ›  PatPanda

如何正确关闭和发布新的ObjectInputStream()和ObjectInputStream.readObject()

  •  0
  • PatPanda  · 技术社区  · 1 年前

    我想关闭并释放 new ObjectInputStream() 同时安全使用 objectInputStream.readObject()

    查看这段代码:

    public Map<?, ?> getMap(String encoded) {
        try {
            var objectInputStream = new ObjectInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(encoded)));
            return (Map<?, ?>) objectInputStream.readObject();
        } catch (IOException | ClassNotFoundException | IllegalArgumentException e) {
        
            return Map.of();
        }
    }
    

    以上是用多个静态分析工具标记的。报告的问题是:

    定义并初始化ObjectInputStream对象。此对象 封装诸如打开的文件流之类的有限计算资源, 数据库连接或网络流。此资源不是 在任何情况下都应适当关闭和释放。

    具有

    从元素readObject获取用户输入。此元素值流 在没有经过适当消毒或验证的情况下通过代码,并且 最终用于编写审核日志。这可能会启用存储日志 锻造。

    如何正确使用 新的ObjectInputStream() objectInputStream.readObject() ?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Oleg Cherednik    1 年前

    所有流只有一条规则 正确地 释放所有资源是 尝试使用资源 :

    try (InputStream in = new ObjectInputStream()) {
       // TODO
    }
    

    public Map<?, ?> getMap(String encoded) {
        try (InputStream in = new ObjectInputStream(
                new ByteArrayInputStream(Base64.getDecoder().decode(encoded))) {
            return (Map<?, ?>) objectInputStream.readObject();
        } catch (IOException | ClassNotFoundException | IllegalArgumentException e) {
            return Map.of();
        }
    }