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
类,调用该方法可以实现这一目的