Java从入门到放弃之 IO (三)
Java从入门到放弃之 IO (三)
装饰器模式
在上一篇我们引入了装饰器模式的定义。那么这一章我们进一步,装饰器模式解决什么问题? 以及为什么Java IO要使用装饰器模式。
问题背景
我们现在都知道inputstream是基类,有很多继承这个基类的派生类。比如FileInputstream 还有下面一些等等的类
如果现在我们需要给FileInputstream加上缓冲功能,怎么做呢?
BufferedFileInputStream extends FileInputStream
增加一个这样的类 继承自FileInputStream即可,这样可以达到我们的目的,没问题。
那如果再需要增加一个加密功能?
EncodeFileInputStream extends FileInputStream
只需要再增加一个这样的类,也可以达成我们的目的。
那如果我们需要增加一个缓冲加上加密呢?
又要增加一个这样的类
BufferedEncodeFileInputStream extends FileInputStream
这样下去的话,我们每增加一个功能就要增加很多子类,因为不光要增加对应功能的子类,还要考虑功能组合的子类;还有一个问题我们增加的这些功能很多是通用的对于IO来说,其他的InputStream的子类可能也有类似的需求,这样的话,其实我们需要加的子类就更多了。
解决方案就是引入装饰器模式
对于Java IO来说,我们将InputStream分为两大类,一类提供基础的数据,一类提供额外功能。
提供基础数据的InputStream
- SocketInputStream
- FileInputStream
- 。。。
提供额外功能的InputStream
- BufferedInputStream
- DigestInputStream
- 。。。
这样我们首先使用提供基础数据的InputStream提供数据流来源,然后在使用我们需要的额外功能的InputStream包装InputStream。
而且提供额外功能的InputStream 也是可以被InputStream引用。
** 代码使用案例**
InputStream file = new FileInputStream("test.txt");
InputStream buffered = new BufferedInputStream(file );
InputStream digest = new DigestInputStream(buffered );
Java中有很多装饰类,有两个基类:过滤器输入流FilterInputStream和过滤器输出流FilterOutputStream。过滤类只是增加功能不改变原有类型(就像上面这句话额外功能的InputStream包装InputStream,而且提供额外功能的InputStream 也是被InputStream所引用)
- 缓冲装饰的子类是BufferedInputStream和BufferedOutputStream。
- 可以将基本类型、对象输出为其字符串表示的子类有PrintStream。
IO流关闭问题
我们知道我们通过JavaIO读取或者写入数据。比如数据在硬盘上,Java程序没有办法操作硬盘,所以需要操作系统的支持。所以当我们使用JavaIO的时候,不关JVM做了特定的处理,操作系统 也做了对应的支持。用完IO之后,JVM的内存,有垃圾回收器进行回收,但是JVM是运行在操作系统上的,它没有权限回收操作系统的内存资源。所以使用完IO之后,我们一定要记得调用close方法。
代码案例一
OutputStream output = null;
try{
output = new FileOutputStream("hello.txt");
String data = "hello, world";
byte[] bytes = data.getBytes(Charset.forName("UTF-8"));
output.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
代码案例二
JDK 1.7为了简化这种代码结构,引入了trywithresources的新特性
try (InputStream inputStream = Test9.class.getResourceAsStream("/application.yml")) {
if (inputStream == null) {
System.out.println("null");
}else {
Properties properties = new Properties();
properties.load(inputStream);
System.out.println(properties);
}
} catch (Exception e) {
} finally {
System.out.println("finally");
};
标签:私信,功能,Java,子类,InputStream,-------,IO,装饰
From: https://blog.csdn.net/Zongkunxue/article/details/143944341