Java 关于流API设计的建议

Java 关于流API设计的建议,java,Java,我需要设计一个以OutputStream为参数的API方法 关闭API方法内的流还是让调用方关闭流是一种好的做法 test(OutputStream os) { os.close() //??? } 我认为它应该是对称的 如果您没有打开该流(很可能是您的情况),通常也不应该关闭它。除非API的目的是“完成流”,否则您应该让调用者关闭。他首先拥有了它,他对它负责,他可能决定要为流编写一些API最初没有想到的东西。保持你的功能分离;它更具可组合性。让用户关闭它。当您在参数中使用OutputStr

我需要设计一个以OutputStream为参数的API方法

关闭API方法内的流还是让调用方关闭流是一种好的做法

test(OutputStream os) {

os.close() //???
}

我认为它应该是对称的


如果您没有打开该流(很可能是您的情况),通常也不应该关闭它。

除非API的目的是“完成流”,否则您应该让调用者关闭。他首先拥有了它,他对它负责,他可能决定要为流编写一些API最初没有想到的东西。保持你的功能分离;它更具可组合性。

让用户关闭它。当您在参数中使用OutputStream时,我们可以认为用户已经创建并打开了它。因此,如果你在你的方法接近,这将是不好的。如果您只是将新的OutputStream作为参数,并在方法中打开它,则无需将其作为参数,您也可以在方法中关闭它。

不同的用例需要不同的模式,例如,这取决于调用方在调用完成后是否需要读取或写入流

关键的API设计规则是,API应该指定关闭流是调用方的责任还是被调用方的责任

话虽如此,如果打开流的代码也负责关闭流,则通常更简单、更安全

考虑这样一种情况,
methodA
应该打开一个流并将其传递给
methodB
,但是在打开的流和进入最终负责关闭它的
try
/
语句之间抛出异常。您需要对其进行如下编码,以确保流不会泄漏:

    public void methodA() throws IOException {
        InputStream myStream = new FileInputStream(...);
        try {
            // do stuff with stream
            methodB(myStream);
        } finally {
            myStream.close();
        }
    }

    /**
     * @param myStream this method is responsible for closing myStream.
     */
    public void methodB(InputStream myStream) throws IOException {
        try {
            // do more stuff with myStream
        } finally {
            myStream.close();
        }
    }
这不会因为
methodA
methodB
中抛出的异常(或错误!)而泄漏开放流。(它适用于标准流类型,因为API指定对已关闭的流调用时,
close
无效。)