IO的概念及分類
什麼是流
流就是內存和存儲設備之間傳輸數據的通道或是管道
分類
按照方向 [以JVM內存爲參照物]
- 輸入流
將<存儲設備>中數據讀取到< jvm內存>中->讀操作(read) - 輸出流
將< jvm內存>中數據寫入到< 存儲設備>中->寫操作(write)
按照單位:
- 字節流
以字節爲單位,可以操作任意類型的文件 - 字符流
以字符爲單位,可以操作文本類型的文件
注意:文本類型的文件:能以 記事本打開而且不亂碼的文件,例如:.java / .txt / .c / .html 等文件都是文本文件,.class / .world / .ppt / .map4 等是非文本文件
按照功能:
- 節點流
只具有基本的讀寫功能 - 過濾流
在節點流的基礎上增強功能
字節流
字節流父類(抽象類)
InputStream
字節輸入流,對應的讀操作(read)
OutputStream
字節輸出流,對應的操作寫操作(write)
字節節點流
FileOutputStream:文件字節輸出流
常見的構造方法
- FileOutputStream fos = new FileOutputStream(“E:/test/a.txt”);
- 如果指定文件不存在,則JVM會自動的創建文件,但是如果指定文件夾不存在,則jvm報錯,錯誤信息爲: java.io.FileNotFoundException: (系統找不到指定的路徑)
- 絕對路徑
帶有盤符的路徑,盤符:/文件夾/文件
- FileOutputStream fos = new FileOutputStream(“a.txt”);
- 相對路徑:默認在當前項目的根目錄下查找所需要的的文件,如果有,直接使用,如果沒有則jvm自動創建此文件
- FileOutputStream fos = new FileOutputStream(“file/a.txt”);
- 開發時,通常在項目的根目錄下創建一個文件夾,用於存 儲項目中操作的文件,便於管理
- FileOutputStream fos = new FileOutputStream(“file/a.txt”,true);
- 參數說明
第一個參數:指定操作的文件路徑及文件名
第二個參數:boolean,是否在原有內容進行追加
true - 不覆蓋原有內容,直接追加,false - 覆蓋原有內容
- 參數說明
常用方法
- void write(int n):將一個字節的內容寫入到文件中
FileInputStream:文件字節輸入流
常用構造方法
- FileInputStream fis = new FileInputStream(“E:\Java2003\a.txt”);
- 參數代表
操作文件的路徑及文件名,指定的文件夾及文件 必須存在,否則運行報錯,報錯信息爲:java.io.FileNotFoundException: (系統找不到指定的文件)
- 參數代表
常用的方法
int read():一次性讀取一個字節的內容,讀取到的內容作爲 返回值返回,如果達到文件的尾部,則返回-1
字節過濾流
BufferedOutputStream/Bu fferedInputStream
- 緩衝流,提高IO的讀寫效率,減少訪問磁盤次數
- 數據存儲存儲在緩衝區,可以通過flush方法或是close方法將緩衝區內容一次性寫入到文件中,並清空緩衝區
- flush方法只是清空緩衝同將緩衝區的內容一次性寫入到文件中,但是流還是繼續可以使用;
- close方法關閉流的同時清空緩衝區,將緩衝區的內容一次性的寫入到文件中,流一旦關閉不能再繼續使用
注意:緩衝滿的時候,將緩衝區的內容一次性寫入到文件 中,同時清空緩衝區
PrintStream (輸出流)
- 緩衝流,提高IO的寫的效率
- 增強了操作基本數據類型的方法,同時還可以操作字符串 print(int n) / print(long l) / print(boolean b) / print(double d) / print(String str) —> 不自動換行
println(int n) / println(long l) / println(boolean b) / println(double d) / println(String str) --> 自動換行
ObjectOutputStream / ObjectInputStream(過濾流)
- 增強緩衝區,提高IO讀寫效率
- 增強了操作8中基本數據類型方法
- 對象序列化
- 概念
對象放在流上進行傳輸的過程 - 參與對象序列化的要求
參與對象序列化的對象對應的類必須實現 java.io.Serializable接口 - 對象的讀寫操作
void writeObject(Object obj):將指定的對象寫入到文件
Object readObject() :從文件中讀取對象 - 文件達到尾部的標記
java.io.EOFException - 如果對象的某一個屬性不想參與對象序列化,則屬性前面用transient修飾
- 如果參與對象序列的對象中有自定類型的屬性,該屬性也必須實現 java.io.Serializable 接口,否則運行報錯,錯誤信息爲:java.io.NotSerializableException(不可序列化的異常)
- 如果參與對象序列化的是集合對象,集合對應類在JDK提供時已經實現java.io.Serializable 接口,但是如果集合中存儲的是自定義類型的對象,則該對應對應類必須實現 java.io.Serializable接口
常見編碼方式
- 常見的編碼
ASCII碼值表
美國製定的第一個標準表,每一個標準表的前 0~255都是此標準內容
ISO8859-1
西歐編碼,底層佔用一個字節內容
GB2312
最早的中國漢字編碼表,6000多漢字
GBK
目前主流的中國漢字編碼表,2萬多漢字
GB18030
漢字的編碼表,7萬多的中國符號
Big5
中國繁體字,中國臺灣應用
UTF-8
萬國碼, 在UTF-8中底層採用是動態編碼,漢字佔用2~3字節
注意:編碼方式的書寫不區分大小寫,utf-8等價於UTF-8 - 編碼和解碼
編碼:將字符對應十進制轉換爲二進制的過程
解碼:將進制轉換爲十進制對應爲字符的過程
注意:只有當編碼方式和解碼方式統一,纔不會出現亂碼
字符流
字符流的父類
- Reader
字符輸入流 [對應的讀操作 - read] - Writer
字符輸出流 [對應的寫操作 - write]
節點流
FileWriter:文件字符輸出流
- 常用方法
void write(int n):將單個字符寫入到文件
void write(String str):將一個字符串寫入到文件中
FileReader:文件字符輸入流
- 常用方法
int read():一次性讀取單個字符內容,讀取的內容作爲返回值返回,如果達到文件的尾部,則返回-1
過濾流
BufferedReader
String readLine():一次性的讀取一個文本行的內容,返回值類型爲String,如果達到文件尾部則返回null.
PrintWriter:
- 可以操作8種基本數據和字符串
print(形參列表):將對應數據寫入到文件中,不換行
println(形參列表):將對應的數據寫入到文件中,自動換行 - 可以將對象對應內容寫入文件中
println(Object obj) :將對象的toString方法的返回值寫入到 文件中
橋轉換流
InputStreamReader / OutputStreamWriter
- 作用
字節流轉換爲字符流的通道,可以設置編解碼的方式 - 步驟總結
需要設置編解碼格式的時候,需要應用到橋轉換流
- 創建文件字節流作爲基礎流:
FileInputStream/FileOutputStream - 創橋轉換流:
將字節流轉換字符流,同時可以設置編解碼格式InputStreamReader / OutputStreamWriter - 包裝過濾流,目的:增強字符流的讀寫功能 BufferedReader/PrintWriter
- 讀寫操作
- 關閉流,關閉最層即可
File類
File 和 IO流的區別
- IO流:對文件的內容直接操作,讀文件或是往文件中寫入內容
- File:代表一個文件或是文件夾(目錄),利用File類中的一些方法對文件或是文件夾進行操作
常用的方法
- 構造方法
public File(String name):操作文件或是文件夾的路徑及名字 - 成員方法
方法名 | 含義 |
---|---|
boolean createNewFile() | 創建一個新的文件,成功- true;不成功-false(文件已經存在) |
boolean mkdir() | 創建一個新的文件夾 |
boolean delete() | 刪除一個文件或是文件夾,如果刪除文件夾,文件夾爲空,刪除成功;文件夾不爲空, 刪除失敗,如果刪除文件,不管文件中是否存在內容,刪除成功 |
String getName() | 獲取文件名,帶有後綴(文件類型,擴展名) a.txt;同時還可以獲取文件夾的名字 |
String getAbsolutePath() | 獲取絕對路徑 |
boolean exists() | 判斷一個文件或是文件夾是否存在, 存在-true;不存在-false |
File[] listFiles() | 獲取文件夾中所有爲文件夾和文件 |
boolean isFile() | 判斷指定的是否爲文件,是-true;不 是-false |
boolean isDirectory() | 判斷指定的是文件夾,是-true; 不是-false |
整理不易,喜歡請點個贊!
編者微信:1014961803,添加時請備註"CSDN"