經常問到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的具體實現類傳進去就可以了.起到修飾的功能; 這就是裝飾模式的精髓.