Java 附加的代码是否可以防止打开文件泄漏

Java 附加的代码是否可以防止打开文件泄漏,java,file-io,Java,File Io,假设为Java6,此代码是否可以防止文件描述符泄漏: { InputStream in = fileObject.getReadStream(); // fileObject cleans it's internal state in case it throws exception try { // do whatever, possibly throwing exception } finally { try {

假设为Java6,此代码是否可以防止文件描述符泄漏:

{
    InputStream in = fileObject.getReadStream();
    // fileObject cleans it's internal state in case it throws exception
    try {
        // do whatever, possibly throwing exception
    } finally {
        try {
            in.close();
        } catch (Exception ex) {
            // failure to close input stream is no problem
        }
    }
}

编辑:为了让问题看起来不那么明显,换个说法,上面的代码是否等于这个较长的代码:

{
    InputStream in = null;
    try {
        in = fileObject.getReadStream();
        // fileObject cleans it's internal state in case it throws exception

        // do whatever, possibly throwing exception
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (Exception ex) {
                // failure to close input stream is no problem
            }
        }
    }
}

也就是说,对返回打开的流或抛出异常的方法的调用是在
try
之前,还是在
try
块内部,这有关系吗?

是的,很好。甚至不值得回答。一种变体(我较少使用)是:


我是一个不太熟悉Java的学生,但我希望我能帮你一点忙。 我认为这段代码不能避免文件描述符泄漏的问题。虽然您已经尝试过使用in.close方法,但是如果
in.close方法会引发一些异常。

为什么不捕获任何异常?
fileObject是什么?@NPE它一定不会影响相关代码的安全性。如果是这样,那么代码本身也不安全。只能假设fileObject没有bug。@NPE我添加了一条关于
fileObject
的注释,它应该会告诉我们关于它的相关信息(尽管我认为它有bug,或者至少是非常糟糕的API设计,如果它保持流打开,但没有返回它)@codeMan为什么我要捕获该代码中的任何异常?因为我们不知道
fileObject
是什么,所以
之后的任何内容都必须是猜测;)假设“文件描述符泄漏”只能在未调用close(并且程序继续)时发生(在solid软件中),那么在
try
中调用getReadStream应该是最后一个安全措施。但是@NPE是正确的,因为理论上fileObject的构造函数可能已经打开了流,而getReadStream只是一个getter。虽然这似乎不是问题的范围。你的变体显然是安全的,我想我可以在我的问题中包括这一点来澄清。根据您的回答提出的问题是:切换
try{
in=fileObject.getReadStream();
行的位置是否安全。我现在编辑了一下这个问题,您还会说这个问题不值得回答吗?直觉上答案是“是的,很好”,但直觉上打开的流应该在
try
内部,所以我要求而不是假设这两种直觉都是正确的。这取决于。FileInputStream.openInputStream只抛出FileNotFoundException。在这种情况下,文件不会打开,也不会泄漏。我将它放在try外部。Java 7将是一个不需要思考的问题。If
In.close()
抛出异常,然后整个事情就转移到JVM实现的领域。如果JVM允许操作系统文件描述符保持打开且有效地不可关闭(因为Java
close()
抛出异常),我会称之为JVM中的错误。不确定Java规范对此有何规定。@hyde dispose方法也会关闭。但随着泄漏,仍然会消耗太多的文件描述符。@JoopEggen你指的是什么“dispose”方法?@hyde,抱歉(我是如何完成“dispose”的?)。其中:
if(fd!=null){…close();}
InputStream in = null;
try {
    in = fileObject.getReadStream();
    // do whatever, possibly throwing exception
} finally {
    if (in  != null) {
        try {
           in.close();
        } catch (Exception ex) {
            // failure to close input stream is no problem if everything else was ok
        }
    }
}