nio java,java io裝飾類,Java IO 裝飾類新說

 2023-12-01 阅读 19 评论 0

摘要:我不知道各位是師弟師妹們學java時是怎樣的,就我的剛學java時的感覺,java.io包是最讓我感到一頭霧水的。所以現在這篇文,盡可能簡單地描述java.io包的結構,希望對java.io同樣一頭霧水的師弟師妹們有些幫助^_^我開始學java時,java.io的介紹

我不知道各位是師弟師妹們學java時是怎樣的,就我的剛學java時的感覺,java.io包是最讓我感到一頭霧水的。所以現在這篇文,盡可能簡單地描述java.io包的結構,希望對java.io同樣一頭霧水的師弟師妹們有些幫助^_^

我開始學java時,java.io的介紹是在《java編程思想》里看的。說實話,當時完全看不明白——“java.io的是用‘decorator模式’來構建的”——剛學java時,天知道啥玩意叫decorator……

不過要明白java.io,確實需要理解decorator設計模式,下面詳細介紹下。

所謂decorator,裝飾,其實可以說是一種設計的技巧,說白了沒什么難的,別看很多網上資料說的天花亂墜的(非常討厭有些文章總是把簡單的問題描述得跟兩頭豬的kiss問題一樣復雜……)。

decorator的結構如下:

nio java?MyInterface

|

_______|_______

|?????????????|

Myclass?????Decorator

____|_____

java抽象類繼承?|????????|

DecoratorA??????DecoratorB

decorator的目的是在不改變任何原有的類的基礎下,添加新的功能(你可以理解為書上說的靈活性)。其中Myclass是你要擴展的類,DecoratorA跟DecoratorB封裝了你要擴展的功能,并保存有一個MyInterface的引用。

考慮以下代碼:

public?static?void?main(Strings[]?arg){

myInterface?a?=?new?myClass();

java 泛型類,a.print();

}

myInterface?是myClass的接口,只聲明了一個方法print(),myClass實現了該方法:

public?void?print(){

System.out.println("hello");

}

java 線程池。那么假如我們要在不改變原來的myClass的基礎上,變成輸出“hello?world!”,要怎么做呢?

當然我們可以考慮直接寫個myClass的子類,helloClass之類,但是要是要求根據環境不同,輸出"hello?world!",my?hello?world","my?Hello"之類的組合呢?

用繼承的方式將不得不寫一堆類似的子類來。

decorator,裝飾模式的解決方法是,只實現基本的功能,把附加的功能抽出來放一邊。

例如以下代碼:

class?DecoratorA?implements?Decorator{

JAVA io?MyInterface?myObject;

DecoratorA(myInterface?myObject){

this.myObject?=?myObject;

}

public?void?print(){

myObject.print();

java中string?System.out.print("world!");

}

}

class?DecoratorB?implements?Decorator{

MyInterface?myObject;

DecoratorA(myInterface?myObject){

java.util,this.myObject?=?myObject;

}

public?void?print(){

System.out.print("my");

myObject.print();

}

java arraylist。}

DecoratorA和DecoratorB的功能分別是打印出world跟my。這時main函數要打印出my?hello?world可簡單變為:

public?static?void?main(Strings[]?arg){

MyInterface?a?=new?DecoratorA(new?DecoratorB(new?MyClass());

a.print();

}

java.lang,簡單吧?簡單的說,就是:

print(){

print("xxx");//可替換成你要添加的任何處理;

myObject.print();//調用基礎類的函數;

xxxx;????????//后續處理

}

java教程,Decorator的介紹就到此為止,接下來講java.io.

看到

MyInterface?a?=new?DecoratorA(new?DecoratorB(new?MyClass());

是不是覺得眼熟咧?這跟

BufferedInputStream?bis?=?new?BufferedInputStream(new?DataInpuStream(new?FileInputStream("xxx.txt")));

是不是很像?

java.io包中的抽象類有哪些、(畫外音加一個臭雞蛋扔上來:因為java.io就是用decorator模式組織的,當然像啦……)

java.io分Stream跟reader、writer兩大類,這里只詳細介紹Stream,并最后兩者間的關系。Stream又分inputStream、OutputStream,兩者基本是對稱的,這里也只介紹InputStream.

java.io.InputStream

|

_______________________|________________________

|?????????????????????????????????????????????|

Java implement。ByteArrayInputStream??????????????????????FilterInputStream

StringBufferInputStream???_____________________|____________________________

FileInputStream???????????|????????????????|????????????????????|??????????|

PipedInputStream??DataInputStream?BufferedInputStream??LineNumInpuStream?XXX

(注:xxx是PushbackInputStream,上面的圖放不下)

這個圖跟最初介紹的hello?world的圖很像吧?呵呵。

java泛型高級用法、基礎的流只有左邊4個,這些流代表了數據的來源,所有的流都必須從這四個中之一開始。(注,還有一個RandomAccessFile、File,這兩個不在本文介紹范圍)。

然后當我們需要什么添加功能,就從右邊中選擇一個裝飾。例如,我們需要緩存功能,那么需要bufferedInputStream裝飾:

BufferdInputStream?is?=?new?BufferedInputStream(new?FileInputStream("xxx.txt"));

假如再要DataInputStream的功能,只要在加一層:

DataInputStream?dis?=?new?DataInputStream(new?BufferdInputStream(new?FileInputStream));

(厄,我不甚明白這個類添加的功能是做什么用的,資料說是增加讀取java原生數據的功能,不甚明白,有清楚的來補充一下,pipeInputStream跟sequenceInputStream也沒用過,歡迎補充說明)

java裝飾者模式例子、這里你可以想象成,在基本的FileInputStream.readxxx()方法在BufferedInputStream的readxxx()方法調用,并添加相應的處理。

最后說說InputStream跟reader的區別:

老實說,我只知道一個支持字節流,一個支持unicode流,除此之外有啥米性能上的不同我還真不知道,哈哈。知道的快來補充補充~

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/187013.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息