?
輸入流和輸出流相對于內存設備而言.
將外設中的數據讀取到內存中:輸入
將內存的數寫入到外設中:輸出。
字符流的由來:
其實就是:字節流讀取文字字節數據后,不直接操作而是先查指定的編碼表。獲取對應的文字。
在對這個文字進行操作。簡單說:字節流+編碼表
---------------------------------------
字節流的兩個頂層父類:
1,InputStream 2,OutputStream.
字符流的兩個頂層父類:
1,Reader 2,Writer
這些體系的子類都以父類名作為后綴。
而且子類名的前綴就是該對象的功能。
?
?
就從熟悉的文字開始字符流,
//需求:將一些文字存儲到硬盤一個文件中。
記住;如果要操作文字數據,建議優先考慮字符流。
而且要將數據從內存寫到硬盤上,要使用字符流中的輸出流。Writer
硬盤的數據基本體現是文件。 希望找到一個可以操作文件的Writer.
找到了FileWriter
?
//需求:讀取一個文本文件。將讀取到的字符打印到控制臺.
同上,找到了FileReader
?
?
?
==========================
字符流緩沖區:
BufferedWriter
:newLine();
BufferedReader:
: readLine();
使用緩沖區復制一個文本文件。
?
裝飾設計模式:
對一組對象的功能進行增強時,就可以使用該模式進行問題的解決。
裝飾和繼承都能實現一樣的特點:進行功能的擴展增強。
有什么區別呢?
首先有一個繼承體系。
Writer
|--TextWriter:用于操作文本
|--MediaWriter:用于操作媒體。
想要對操作的動作進行效率的提高。
按照面向對象,可以通過繼承對具體的進行功能的擴展。
效率提高需要加入緩沖技術。
Writer
|--TextWriter:用于操作文本
|--BufferTextWriter:加入了緩沖技術的操作文本的對象。
|--MediaWriter:用于操作媒體。
|--BufferMediaWriter:
到這里就哦了。但是這樣做好像并不理想。
如果這個體系進行功能擴展,有多了流對象。
那么這個流要提高效率,是不是也要產生子類呢?是。這時就會發現只為提高功能,進行的繼承,
導致繼承體系越來越臃腫。不夠靈活。
重新思考這個問題?
既然加入的都是同一種技術--緩沖。
前一種是讓緩沖和具體的對象相結合。
可不可以將緩沖進行單獨的封裝,哪個對象需要緩沖就將哪個對象和緩沖關聯。
class Buffer{
Buffer(TextWriter w)
{}
Buffer(MediaWirter w)
{
}
}
class BufferWriter extends Writer{
BufferWriter(Writer w)
{
}
}
Writer
|--TextWriter:用于操作文本
|--MediaWriter:用于操作媒體。
|--BufferWriter:用于提高效率。
裝飾比繼承靈活。
特點:裝飾類和被裝飾類都必須所屬同一個接口或者父類。
?
--------------------------------------
字節流:
InputStream
OutputStream
字節流:
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOutputStream
字符流:
Writer Reader
FileReader
FileWriter
BufferedReader
BufferedWriter