java 马士兵 io 代码分析_学习笔记-马士兵java- (IO初步)流
1. Java 流式輸入/輸出原理:
a. 在JAVA程序中,對于數據的輸入/輸出操作以“流”(stream)方式進行;J2SDK 提供了各種各樣的“流”類,用以獲取不同類的數據;程序中通過標準的方法輸入或輸出數據。
2. JAVA 流類的分類:
a.??java.io 包中定義了多個流類型(類或抽象類)來實現輸入/輸出功能。可從不同角度對其進行分類:
① 按數據流的方向不同:輸入流、輸出流。
② 按處理數據單位不同:字節流、字符流。
③ 按功能不同:節點流、處理流。
b. J2SDK 所提供的所有流類型位于包 java.io 內都分別繼承自一下四種抽象流類型。
字節流 字符流
輸入流 InputStream ?? Reader
輸出流 OutputStream Writer
c. 節點流和處理流:
① 節點流:可以從一個特定的數據源(節點)讀寫數據(如:文件、內存)。(直接與數據源相連)
② 處理流:“連接”在已存在的流(節點流或處理流)之上,通過對數據的處理為程序提供更為強大的讀寫功能。
3. 輸入/輸出流類:
補充說明:管道為線程與線程之間的通信。
a. InputStream:繼承自 InputStream 的流是用于向程序中輸入數據,且數據的單位為字節(8bit):
⑴ FileInputStream(節點流) // 從文件讀數據
⑵ PipedInputStream(節點流) // 從管道讀數據(管道:線程和線程的通信)
⑶ FilterInputStream(處理流) //
① LineNumberInputStream(處理流) //
② DataInputStream(處理流) //
③ BufferedInputStream(處理流) //
④ PushbackInputStream(處理流) //
⑷ ByteArrayInputStream(節點流) // 從字節數據讀數據
⑸ SequenceInputStream(處理流) //
⑹ StringBufferInputStream(節點流) // 從字符串讀數據
⑺ ObjectInputStream(處理流) // 對象的序列化
b. InputStream 的基本方法:
⑴ int read() throws IOException // 讀取一個字節并以證書的形式返回(0~255),如果返回 -1 已到輸入流的末尾。
⑵ int read(byte[] buffer) throws IOException // 讀取一系列字節并存儲到一個數組 buffer,返回實際讀取的字節數,如果讀取前已經到輸入流的末尾返回 -1。
⑶? int read(byte[] buffer, int offset, int length) throws IOException // 讀取 length 個字節,并存儲到一個字節數組 buffer,從 length 位置開始,返回實際讀取的字節數,如果讀取前以到輸入流的末尾返回 -1。
⑷ void close() throws IOException // 關閉流,釋放內存資源。
⑸ long skip(long n) throws IOException // 跳過 n 個字節不讀,返回實際跳過的字節數。
c. OutputStream: 繼承自 OutputStream 的流是用于程序中輸入數據,且數據的單位為字節(8bit):
⑴ FileOutputStream(節點流)
⑵ PipedOutputStream(節點流)
⑶ FilterOutputStream(處理流)
① DataOutputStream(處理流)
② BufferedOutputStream(處理流)
③ PrintStream(處理流)
⑷ ByteArrayOutputStream(節點流)
⑸ ObjectOutputStream(處理流)
d. OutputStream 的基本方法:
⑴ void write(int b) throws IOException // 向輸出流中寫入一個字節數據,該字節數據為參數 b 的低 8 位。
⑵ void write(byte[] b) throws IOException // 將一個字節類型的數組中的數據寫入輸出流。
⑶ void write(byte[] b, int off, int len) throws IOException // 將一個字節類型的數組中的從指定位置(off)開始的 len 個字節寫入到輸出流。
⑷ void close() throws IOException // 關閉流,釋放內存資源。
⑸ void flush() throws IOException // 將輸出流中的緩沖的數據全部寫出到目的地。
e. Reader:繼承自 Reader 的流都是用于向程序中輸入數據,且數據的單位為字符(16bit):
⑴ BufferedReader(處理流)
① LineNumberReader(處理流)
⑵ CharArrayReader(節點流)
⑶ InputStreamReader(處理流)
① FileReader(節點流)
⑷ FilterReader(處理流)
① PushbackReader(處理流)
⑸ PipedReader(節點流)
⑹??StringReader(節點流)
f. Reader 的基本方法:
⑴ int read() throws IOException // 讀取一個字符,并以證書的形式返回(0~255),如果返回 -1 已到輸入流的末尾。
⑵ int read(char[] cbuf) throws IOException // 讀取一系列字符并存儲到一個數組 buffer,返回實際讀取的字符數,如果讀取前已經到輸入流的末尾返回 -1.
⑶ int read(char[] cbuf, int offset, int length) throws IOException // 讀取 length 個字符,并存儲到一個數組 buffer,從 length 位置開始,返回實際讀取的字符數,如果讀取前已到輸入流的末尾,返回 -1。
⑷ void close() throws IOException // 關閉流,釋放內存資源。
⑸ long skip(long n) throws IOException // 跳過 n 個字符不讀,返回實際跳過的字節數。
g. Write:繼承自 Writer?的流都是用于程序中輸出數據,且數據的單位為字符(16 bit):
⑴ BufferedWriter(處理流)
⑵ CharArrayWriter(節點流)
⑶ OutputStreamReader(處理流)
① FileWriter(節點流)
⑷ FilterWriter(處理流)
⑸ PipedWriter(節點流)
⑹ StringWriter(節點流)
⑺ FilterWriter(處理流)
h. Write 的基本方法:
⑴ void write(int c) throws IOException // 向輸出流中寫入一個字符數據,該字節數為參數 b 的低16位。
⑵ void write(char[] cbuf) throws? IOException // 講一個字符類型的數據中的數據吸入輸出流。
⑶ void write(char[] cbuf, int offset, int length) throws IOException // 將一個字符類型的數組中的從指定位置(offset)開始的 length 個字符寫入到輸出流。
⑷ void write(String string) throws IOException // 將一個字符串中的字符寫入到輸出流
⑸ void write(String string, int offset, int length) throws IOException // 將一個字符串從 offset 開始的 length 個字符寫入到輸出流。
⑹ void close() throws IOException // 關閉流,釋放內存資源。
⑺ void flush() throws IOException // 將輸出流中緩沖的數據全部寫出到目的地。
4. 常見的節點流和處理流:
a. 節點流類型:
b. 訪問文件:
① FileInputStream 和 FileOutputStream 分別繼承自 InputStream 和 OutputStream 用于向文件中的輸入和輸出字節。
② FileInputStream 和 FileOutputStream 的常用構造方法:
⑴ FileInputStream(String name) throws FileNotFoundException
⑵ FileInputStream(File file) throws FileNotFoundException
⑶ FileOutputStream(String name) throws FileNotFoundException
⑷ FileOutputStream(File file) throws FileNotFoundException
⑸ FileOutputStream(File file, boolean append) throws FileNotFoundException
③ FileInputStream 和 FileOutputStream 類支持其父類 InputStream 和 OutputStream 所提供的數據讀寫方法。
④ 注意:
Ⅰ 在實例化 FileInputStream 和 FileOutputStream 流時要用 try - catch 語句以處理其可能拋出的 FileNotFoundException。
Ⅱ 在讀寫數據時也要用 try - catch 語句以處理可能拋出的 IOException。
Ⅲ FileNotFoundException 是 IOException 的子類。
c. 處理流類型:
5. 文件流:
a.
6. 緩沖流(處理流):
a. 緩沖流要“套接”在相應的節點流之上,對讀寫數據提供了緩沖的能力,提高了讀寫的效率,同時增加了一些新的方法。
b. J2SDK 提供了四棟緩存流,其常用的構造方法:
⑴ BufferedReader(Reader in)
⑵ BufferedReader(reader in, int sz) // sz 為自定義緩存區的大小
⑶ BufferedWriter(Writer out)
⑷ BufferedWriter(Writer out, int sz)
⑸ BufferedInputStream(InputStream in)
⑹ BufferedInputStream(InputStream in, int size)
⑺ BufferedOutputStream(OutputStream out)
⑻ BufferedOutputStream(OutputStream out, int size)
c. 緩沖輸入流支持其父類的 mark 和 reset 方法。
d. BufferedReader 提供了 readLine 方法用于讀取一行字符串(以 \r 或?\n 分隔)。
e. BufferedWriter 提供了 newLine 用于寫入一個"行分隔符"。
f. 對于輸出的緩沖流,寫出的數據會先在內存中緩存,使用 flush 方法將會使內存中的數據立刻寫出。
7. 數據流(先寫進去的先讀出來):
a. DataInputStream 和 DataOutputStream 分別繼承自 InputStream 和 OutPutStream,它屬于處理流,需要分別“套接”在 InputStream 和 OutputStream 類型的節點流上。
b. DataInputStream 和 DataOutputStream 提供了可以存取與機器無關的Java原始類型數據(如:int, double 等)的方法。
c. DataInputStream 和 DataOutputStream 的構造方法為:
① DataInputStream(InputStream in)
② DataOutputStream(OutputStream out)
8. 轉換流(字節流與字符流的轉換):
a. InputStreamReader 和 OutputStreamWriter 用與字節數據到字符數據之間的轉換。
b. InputStreamReader 需要和 InputStream “套接"。
c. OutputStreamWriter 需要和 OutputStream “套接"。
d. 轉換流在構造時可以指定其編碼集合,例如:
InputStream isr = new InputStreamReader(System in, "ISO8859_1")
9. Print 流:
a. PrintWriter 和 PrintStream 都屬于輸出流,分別針對與字符和字節。
b. PrintWriter 和 PrintStream 提供了重載的 print。
c. Println 方法用于多種數據類型的輸出。
d. PrintWriter 和 PrintStream 的輸出操作不會拋出異常,用戶通過檢測錯誤狀態獲取錯誤信息。
e.? PrintWriter 和 PrintStream 有自動 flush 功能。
f. PrintWriter常用構造方法:
⑴ PrintWriter(Writer out)
⑵ PrintWriter(Writer out,boolean autoFlush)
⑶ PrintWriter(OutputStream out)
⑷ PrintWriter(Outputstream out,boolean autoFlush)
⑸ PrintStream(OutputStream out)
⑹ PrintStream(OutputStream out, booleanautoFlush)
10. Object流(序列化):
a. 直接將Object 寫入或獨處
① transient 關鍵字(透明的,修飾成員變量,transient 修飾的成員變量在序列化的時候不予考慮)
② serializable 接口(可序列化,標記性接口,不用實現任何方法)
③ externalizable 接口(外部化,serializable的子接口,自己實現對象序列化):
⑴ readExternal(ObjectInput in) //? 讀對象 in
⑵ writeExternal(ObjectOutput out) // 寫對象 out
總結
以上是生活随笔為你收集整理的java 马士兵 io 代码分析_学习笔记-马士兵java- (IO初步)流的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java security 详解_Spr
- 下一篇: java正则表达式 引用_java –
