我的 Java 7 代码中的漏洞在哪里?这是误报吗? (使用FileChannel写了一个771kb的ByteBuffer(fileFinal)

Where is the leak in my Java 7 code? Is it a false positive? (Using FileChannel to write a 771kb ByteBuffer (fileFinal)

我正在用 eclipse 编写一个 Java 7 兼容程序,我写的部分代码说存在内存泄漏。这是我的代码:

FileChannel output1 = 
    -->new FileOutputStream(System.getProperty("user.home")+"\Desktop\file\output\data.bin")<--
    .getChannel();
output1.write(fileFinal);
output1.close();
FileChannel output2 =
    -->new FileOutputStream(System.getProperty("user.home")+"\Desktop\file\output\data0.bin")<--
    .getChannel();
output2.write(fileFinal);
output2.close();
FileChannel output3 =
    -->new FileOutputStream(System.getProperty("user.home")+"\Desktop\file\output\data1.bin")<--
    .getChannel();
output3.write(fileFinal);
output3.close();
FileChannel output4 =
    -->new FileOutputStream(System.getProperty("user.home")+"\Desktop\file\output\data2.bin")<--
    .getChannel();
output4.write(fileFinal);
output4.close();

箭头之间的部分给我一个错误 ("Resource leak: '(opencaret)unassigned Closeable value(closecaret)' is never closed")。请注意我是如何在写入后立即关闭 data.bin(output1)和 data0.bin 到 data2.bin(output2 到 output4)的。这里发生了什么?这是误报,还是有更多技术因素在起作用?

注意:我用 (opencaret) 和 (closecaret) 替换了错误中的插入符号,因为消息编辑器认为它是 HTML,并且不会显示插入符号或其内容。我能理解为什么你们会首先阻止 HTML(恶意代码注入),但必须有一种更优雅的方法来检测它,而不会完全阻止插入符之间的任何内容。

我在 Windows 10 Pro 上 运行ning eclipse 2019-06 (4.12.0) JDK 1.8.0_221 和 JRE 1.8.0_221 已安装,并且该项目正在使用 Java 1.7 编译器合规性(为了与旧的 Java 安装兼容,因为某些系统 运行 这可能只能 运行 .jars 作为浏览器中的小程序,大多数浏览器禁用了 NPAPI 插件支持,从而阻止了 Java 浏览器插件更新)。

编辑:我的程序终于可以运行了。这是工作代码:

            try (FileOutputStream fos1 = new FileOutputStream(System.getProperty("user.home")+"\Desktop\file\output\data.bin");
                FileChannel output1 = fos1.getChannel())
            {
                output1.write(fileFinal);
                output1.close();
            }
            catch (IOException i)
            {
            }
            fileFinal.position(0);
            try (FileOutputStream fos2 = new FileOutputStream(System.getProperty("user.home")+"\Desktop\file\output\data0.bin");
                FileChannel output2 = fos2.getChannel())
            {
                output2.write(fileFinal);
                output2.close();
            }
            catch (IOException j)
            {
            }
            fileFinal.position(0);
            try (FileOutputStream fos3 = new FileOutputStream(System.getProperty("user.home")+"\Desktop\file\output\data1.bin");
                FileChannel output3 = fos3.getChannel())
            {
                output3.write(fileFinal);
                output3.close();
            }
            catch (IOException k)
            {
            }
            fileFinal.position(0);
            try (FileOutputStream fos4 = new FileOutputStream(System.getProperty("user.home")+"\Desktop\file\output\data2.bin");
                FileChannel output4 = fos4.getChannel())
            {
                output4.write(fileFinal);
                output4.close();
            }
            catch (IOException l)
            {
            }

感谢@holger 的修复。

想到正常情况的同时,还要担心写入文件内容出现异常时会发生什么

可以无错误地打开一个文件,然后在写入时得到一个 "ioException: out of disk space"

要处理这些情况下的关闭,最好尝试使用资源:

try (FileChannel output1 = new FileOutputStream(System.getProperty("user.home")+"\Desktop\file\output\data0.bin") .getChannel()) {
     output2.write(fileFinal);
}