1. IO流概述
IO,即in和out,也就是輸入和輸出,指應用程序和外部設備之間的數據傳遞,常見的外部設備包括文件、管道、網絡連接。
流(Stream),是一個抽象的概念,是指一連串的數據(字符或字節),是以先進先出的方式發送信息的通道。
關於流的特性有下面幾點:
1.先進先出:最先寫入輸出流的數據最先被輸入流讀取到。
2.順序存取:可以一個接一個地往流中寫入一串字節,讀出時也將按寫入順序讀取一串字節,不能隨機訪問中間的數據。(RandomAccessFile除外)
3.只讀或只寫:每個流只能是輸入流或輸出流的一種,不能同時具備兩個功能,輸入流只能進行讀操作,對輸出流只能進行寫操作。在一個數據傳輸通道中,如果既要寫入數據,又要讀取數據,則要分別提供兩個流。
-
IO流的分類
-
按照數據的流向
- 輸入流:讀數據
- 輸出流:寫數據
-
按照數據類型來分
-
字節流
- 字節輸入流
- 字節輸出流
-
字符流
- 字符輸入流
- 字符輸出流
-
-
-
IO流的使用場景
- 如果操作的是純文本文件,優先使用字符流
- 如果操作的是圖片、視頻、音頻等二進制文件。優先使用字節流
- 如果不確定文件類型,優先使用字節流。字節流是萬能的流
2. File類
File類介紹
- 它是文件和目錄路徑名的抽象表示
- 文件和目錄是可以通過File封裝成對象
- 對於File而言,其封裝的並不是一個真正存在的文件,僅僅是一個路徑名而已。它可以是存在的,也可以是不存在的。將來是要通過具體的操作把這個路徑的內容轉換為具體存在的
構造方法
方法名 | 説明
-
File(String pathname) 通過將給定的路徑名字符串轉換為抽象路徑名來創建新的 File實例 File(String parent, String child) 從父路徑名字符串和子路徑名字符串創建新的 File實例 File(File parent, String child) 從父抽象路徑名和子路徑名字符串創建新的 File實例
File創建與刪除功能
方法名 | 説明
-
public boolean createNewFile() 當具有該名稱的文件不存在時,創建一個由該抽象路徑名命名的新空文件。—— 父路徑必須存在,否則會報“系統找不到指定的路徑” public boolean mkdir() 創建由此抽象路徑名命名的目錄 public boolean mkdirs() 創建由此抽象路徑名命名的目錄,包括任何必需但不存在的父目錄 public boolean delete() 刪除此File表示的文件或目錄(只能刪除空目錄)
3. 字節流
-
字節流抽象基類
- InputStream:這個抽象類是表示字節輸入流的所有類的超類
- OutputStream:這個抽象類是表示字節輸出流的所有類的超類
- 子類名特點:子類名稱都是以其父類名作為子類名的後綴
字節輸出流
- 父類:OutputStream(抽象類)
- 子類:FileOutputStream;文件輸出流用於將數據寫入文件
使用字節輸入流寫數據的步驟
1、創建字節輸出流對象(調用系統功能創建了文件,創建字節輸出流對象,讓字節輸出流對象指向文件):FileOutputStream(String name) ,(name表示文件路徑)
2、調用字節輸出流對象的寫數據方法:void write(int b)
3、釋放資源(關閉此文件輸出流並釋放與此流相關聯的任何系統資源):void close()
寫入數據的三種方式
方法名 | 説明
-
void write(int b) 將指定的字節寫入此文件輸出流一次寫一個字節數據 void write(byte[ ] b) 將b.length字節從指定的字節數組寫入此文件輸出流一次寫一個字節數組數據 void wirte(byte[ ] b,int off,int len) 將len字節從指定的字節數組開始,從偏移量off開始寫入此文件輸出流一次寫一個字節數組的部分數據
字節流寫數據加異常處理
- finally:在異常處理時提供finally塊來執行所有清除操作。比如説O流中的釋放資源
- 特點:被finally控制的語句一定會執行,除非JVM退出
字節輸入流
- 父類:
InputStream(抽象類) - 子類:
FileInputStream(實現類:從文件系統中的文件獲取輸入字節)
構造方法
| 方法名 | 説明 |
|---|---|
| public FileInputStream(File path) | 創建一個字節輸入流管道與源文件對象接通 |
| public FileInputStream(String pathName) | 創建一個字節輸入流管道與文件路徑對接 |
讀取方法
| 方法名 | 説明 |
|---|---|
| public int read() | 每次讀取一個字節返回!讀取完畢會返回 -1 |
| public int read(byte[] buffer) | 從字節輸入流中讀取字節到字節數組中去,返回讀取的字節數量,沒有字節可讀返回 -1 |
-
使用字節輸入流讀數據的步驟
- 1、創建字節輸入流對象
- 2、調用字節輸入流對象的讀數據方法
- 3、釋放資源
字節緩衝流
BufferedInputStream:創建BufferedInputStream將創建一個內部緩衝區數組。 當從流中讀取或跳過字節時,內部緩衝區將根據需要從所包含的輸入流中重新填充,一次填充字節
BufferedOutputStream:該類實現緩衝輸出流。通過設置這樣的輸出流, 應用程序可以向底層輸出流寫入字節。
構造方法
| 方法名 | 説明 |
|---|---|
| BufferedOutputStream(OutputStream out) | 創建字節緩衝輸出流對象 |
| BufferedInputStream(InputStream in) | 創建字節緩衝輸入流對象 |
4. 字符流
-
字符流抽象基類
- Reader:字符輸入流的抽象類
- Writer:字符輸出流的抽象類
字符流概述
由於字節流操作中文不是特別的方便,所以Java就提供字符流
字符流 = 字節流 + 編碼表
漢字在存儲的時候,無論選擇哪種編碼存儲,第一個字節都是負數
編碼規則:
128個US-ASCII字符,只需一個字節編碼
拉丁文等字符,需要二個字節編碼
大部分常用字(含中文),使用三個字節編碼
其他極少使用的Unicode輔助字符,使用四字節編碼
字符串中的編碼解碼問題
| 方法名 | 説明 |
|---|---|
| byte[] getBytes() | 使用平台的默認字符集將該 String編碼為一系列字節 |
| byte[] getBytes(String charsetName) | 使用指定的字符集將該 String編碼為一系列字節 |
| String(byte[] bytes) | 使用平台的默認字符集解碼指定的字節數組來創建字符串 |
| String(byte[] bytes, String charsetName) | 通過指定的字符集解碼指定的字節數組來創建字符 |
字符流中的編碼解碼問題
-
InputStreamReader:是從字節流到字符流的橋樑
它讀取字節,並使用指定的編碼將其解碼為字符
它使用的字符集可以由名稱指定,也可以被明確指定,或者可以接受平台的默認字符集
-
OutputStreamWriter:是從字符流到字節流的橋樑
是從字符流到字節流的橋樑,使用指定的編碼將寫入的字符編碼為字節
它使用的字符集可以由名稱指定,也可以被明確指定,或者可以接受平台的默認字符集
構造方法
方法名 | 説明
-
InputStreamReader(InputStream in) 使用默認字符編碼創建InputStreamReader對象 InputStreamReader(InputStream in,String chatset) 使用指定的字符編碼創建InputStreamReader對象 OutputStreamWriter(OutputStream out) 使用默認字符編碼創建OutputStreamWriter對象 OutputStreamWriter(OutputStream out,String charset) 使用指定的字符編碼創建OutputStreamWriter對象
字符輸出流
方法名 | 説明
-
void write(int c) 寫一個字符 void write(char[] cbuf) 寫入一個字符數組 void write(char[] cbuf, int off, int len) 寫入字符數組的一部分 void write(String str) 寫一個字符串 void write(String str, int off, int len) 寫一個字符串的一部分 關閉和刷新的方法
| 方法名 | 説明 |
|---|---|
| flush() | 刷新流,之後還可以繼續寫數據 |
| close() | 關閉流,釋放資源,但是在關閉之前會先刷新流。一旦關閉,就不能再寫數據 |
字符緩衝流
BufferedReader:從字符輸入流讀取文本,緩衝字符,以提供字符,數組和行的高效讀取,可以指定緩衝區大小,或者可以使用默認大小。默認值足夠大,可用於大多數用途
BufferedWriter:將文本寫入字符輸出流,緩衝字符,以提供單個字符,數組和字符串的高效寫入,可以指定緩衝區大小,或者可以接受默認大小。默認值足夠大,可用於大多數用途
構造方法
| 方法名 | 説明 |
|---|---|
| BufferedWriter(Writer out) | 創建字符緩衝輸出流對象 |
| BufferedReader(Reader in) | 創建字符緩衝輸入流對象 |
字符緩衝流特有功能
BufferedWriter:
| 方法名 | 説明 |
|---|---|
| void newLine() | 寫一行行分隔符,行分隔符字符串由系統屬性定義 |
字符緩衝流特有功能
BufferedWriter:
| 方法名 | 説明 |
|---|---|
| void newLine() | 寫一行行分隔符,行分隔符字符串由系統屬性定義 |
5. IO流小結
6. 特殊流
標準輸入輸出流
標準輸入流
System類中有兩個靜態的成員變量:
public static final InputStream in:標準輸入流,通常該流對應於鍵盤輸入或由主機環境或用户指定的另一個輸入源
public static final PrintStream out:標準輸出流,通常該流對應於顯示輸出或由主機環境或用户指定的另一個輸入源
標準輸出流
-
輸出語句的本質:是一個標準的輸出流
- PrintStream ps = System.out;
- PrintStream類有的方法,System.out都可以使用
打印流
-
打印流分類:
- 字節打印流:
PrintStream
- 字節打印流:
- 字符打印流:
PrintWriter -
打印流特點:
- 只負責輸出數據,不負責讀取數據
- 有自己特有方法
對象操作流
對象序列化:就是將對象保存到磁盤中,或者在網絡中傳輸對象
這種機制就是使用一個字節序列表示個對象,該字節序列包含:對象的類型、對象的數據和對象中存儲的屬性等信息字節序列寫到文件之後,相當於文件中持久保存了一個對象的信息
反之,該字節序列還可以從文件中讀取回來,重構對象,對它進行反序列化
-
要實現序列化和反序列化就要使用對象序列化流和對象反序列化流:
- 對象序列化流: ObjectOutputStream
- 對象反序列化流:ObjectInputStream