Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以关闭底层outputstream并让装饰程序BufferedOutputStream未关闭吗_Java_Memory Management_Outputstream - Fatal编程技术网

Java 我可以关闭底层outputstream并让装饰程序BufferedOutputStream未关闭吗

Java 我可以关闭底层outputstream并让装饰程序BufferedOutputStream未关闭吗,java,memory-management,outputstream,Java,Memory Management,Outputstream,我有多个应用程序的实现 void convert(List< InputStream > list, OutputStream os) void转换(列表列表,输出流操作系统) 方法 给定的资源可以重用,因此不会被方法实现释放。但是,在某些情况下,我希望使用BufferedOutputStream来修饰给定的输出流 关闭decorator将导致关闭我想要避免的底层流 我的问题是:我能安全地让decorator打开,让调用方法管理底层流发布吗?装饰类通常不会打开系统资源(如操作系

我有多个应用程序的实现

 void convert(List< InputStream > list, OutputStream os)
void转换(列表<输入流>列表,输出流操作系统)
方法

给定的资源可以重用,因此不会被方法实现释放。但是,在某些情况下,我希望使用BufferedOutputStream来修饰给定的输出流

关闭decorator将导致关闭我想要避免的底层流


我的问题是:我能安全地让decorator打开,让调用方法管理底层流发布吗?

装饰类通常不会打开系统资源(如操作系统文件句柄),这些资源必须关闭以防止资源泄漏。给定的
OutputStream
参数必须关闭(因为它可能与开放系统资源关联),但正如您所提到的,这是调用者的责任

但是如果不关闭装饰类,则必须处理通常在
close()
方法中发生的方法调用。在的情况下,您可以看到在超类
close()
方法中调用了
flush()

要适应这些缺少的方法调用,请创建一个单独的
NonClosingBufferedOutputStream
类,该类扩展
BufferedOutputStream
,该类包含来自
FilterOutputStream
close()
方法的修改版本(只需注释掉行
out.close();
)。您现在可以将该类用作普通的
可关闭的
,并避免IDE/编译器发出警告

我本来打算推荐使用来自Apache commons io的,但是看看,似乎在
close()
方法中没有调用
flush()
。尽管存在这一缺点,但用a替换底层outputstream似乎是一个好主意:它将更快地显示编程错误

请注意,对于其他装饰类,如
GZIPOutputStream
,除了
flush()
之外的其他方法也可能是合适的。在
GZIPOutputStream
的情况下,使用修改的
close()
方法创建一个
nonclosingzipoutputstream
类,调用该方法可以实现这一目的