有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java强化安全问题“未发布的资源流”

我在下面的代码中得到一个“未发布资源流”的强化查找

Resource[] l_objResource = resourceLoader.getResources(configErrorCode);
Properties l_objProperty = null;
for (int i = 0; i < l_objResource.length; i++) {
    l_objProperty = new Properties();
    l_objProperty.load(l_objResource[i].getInputStream());
}

BaseErrorParser.java中的函数loadErrorCode()有时无法释放由getInputStream();分配的系统资源

有人能解释这个发现或帮助解决这个问题吗


根据以下评论,但上下文不清楚(JW):

ObjectInputStream l_objObjInputStream = null;
Map l_mapRet = null;
try {
    l_objObjInputStream = new ObjectInputStream(new FileInputStream(p_objFilename));
    Object l_objTemp = l_objObjInputStream.readObject();
    l_mapRet = (Map) l_objTemp;
} finally {
    if (l_objObjInputStream != null) {
        l_objObjInputStream.close();
    }
}

共 (2) 个答案

  1. # 1 楼答案

    您没有关闭由以下代码行打开的输入流

    l_objResource[i].getInputStream();
    

    通常,如果有任何输入或输出流在使用后打开但未关闭,则fortify scanner会报告未释放的资源流问题。处理这些问题的理想方法是关闭finally block中所有打开的流,这样即使在异常情况下,它们也不会产生任何问题

    您可以对代码进行try-finally阻塞,并关闭流,如下所示

    Resource[] l_objResource = resourceLoader.getResources(configErrorCode);
    Properties l_objProperty = null;
    InputStream is = null;
    for (int i = 0; i < l_objResource.length; i++) {
        l_objProperty = new Properties();
        try {
              is = l_objResource[i].getInputStream();
              l_objProperty.load(is);
        } finally {
              if(is!=null) {
                  is.close();
              }
        }
    }
    

    请检查它是否适用于您的情况

  2. # 2 楼答案

    您可以使用这里的“试用资源”。这将自动关闭您的流

    Map l_mapRet = null;
    try (ObjectInputStream l_objObjInputStream = new ObjectInputStream(new FileInputStream(p_objFilename))){
        Object l_objTemp = l_objObjInputStream.readObject();
        l_mapRet = (Map) l_objTemp;
    } Catch(IOException E){
    // Handle exception
    }