经常问到IO,用到什么设计模式,手写IO 读取 写入 复制;
1. IO是什么? 为什么要这样操作?
答: IO是流, 是数据流,字节流, 视频流, Java操作这些流式从内核中读取的, 写入也是写到内核中,然后内核再将数据刷到磁盘上的.
就拿一个socket来的文件流来举例:
第一步: 网卡有文件流来的时候, 可以通过事件监听,去网卡上读取这些流到内核中, 也可以是内核定时去网卡中取数据到内核中来;
第二步: 用户将这些流从内核态读到用户态. 这就是为什么要定义 new byte[1024] 这个对象了. 这个时候就会在用户空间中了.
第三步: 拿到这些流,我们要干什么呢,? 写入到磁盘上; FileOutputStream 写入磁盘;
fileOutputStream.write() 这个操作是操作内核的东西的, 写入到内核buffer中, 然后内核 flush到磁盘上;
我之前都是背过一段操作数据流的程序,这样不知道具体怎么操作的, 但是只要理解内核的概念, 这些问题就迎刃而解
public static void fileTest2() throws IOException {
FileInputStream fileInputStream = new FileInputStream("/Users/IdeaProjects/esign-scf/service/src/test/java/com/finance/platform/esign/service/Test.java");
FileOutputStream fileOutputStream = new FileOutputStream("/Users/IdeaProjects/esign-scf/service/src/test/java/com/finance/platform/esign/service/aaaa.java");
byte[] bytes = new byte[50];
int len = 0;
while ((len = fileInputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
}
fileInputStream.close();
fileOutputStream.close();
}
按照上面的代码就能理出这样的逻辑
下面buffer的实例就是bufferInputStream已经帮我建立好了new byte[];
public static void main(String[] args) throws IOException {
InputStream filterInputStream = new BufferedInputStream(new FileInputStream("/Users/IdeaProjects/esign-scf/service/src/test/java/com/finance/platform/esign/service/Test.java"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("/Users/IdeaProjects/esign-scf/service/src/test/java/com/finance/platform/esign/service/aaaa.java"));
int read;
while ((read = filterInputStream.read()) != -1) {
bufferedOutputStream.write(read);
}
filterInputStream.close();
bufferedOutputStream.close();
}
第二个问题: IO设计中用到装饰模式,有怎么修饰的? 修饰了什么? 起到什么作用?
装饰模式有几个角色
1.抽象类 或者接口 InputStream
2 具体实现类:FilInputstream;
3 装饰抽象类: FilterInputStream, [这个地方也用到了组合模式,将InputStream集成到这个类中]
4 具体装饰类: BufferInputstream, 这个地方提供缓冲区功能;
怎么修饰的?
这个拿BufferInputstream来说,这个地方在read()方法中加入修饰功能[提供了buffer的功能] 这样后面要想用这个功能就直接可以将对象InputStream的具体实现类传进去就可以了.起到修饰的功能; 这就是装饰模式的精髓.