位元組流 字元流 概述 阿新 • • 發佈:2018-12-12 IO的概念和分類:1.什麼是IO流?2.什麼是輸入?3.什麼是輸出?4.IO流有哪些分類?(1.)IO流就是 讀入,寫出流。(2.)輸入就是讀取檔案內容FileInputStream fis = new FileInputStream(檔案地址\\檔名.檔案型別);(3.)輸出就是輸出指定內容到制定路徑下的檔案中FileOutputStream fos = new FileOutputStream(檔案地址\\檔名.檔案型別)(4.)IO流有 位元組流,字元流 位元組流:位元組輸入流: java.io.InputStream 抽象類 位元組輸出流: java.io.OutputStream 抽象類 字元流:字元輸入流: java.io.Reader 抽象類字元輸出流: java.io.Writer 抽象類5.位元組輸出流: OutputStream和FileOutputStreamOutputStream是抽象類 有哪些共性方法?OutputStream的共性方法有.close .flushFileOutputStream是普通類 可以做什麼? C:/Users/win/AppData/Local/YNote/data/qq51705C22557BC4566B6FB12F9448BCB0/4c609a6d49cb404baf09ca6b86113349/clipboard.png java.io.OutputStream抽象類: 位元組輸出流 (頂層類) // 成員方法 void close() :釋放資源 void flush() :重新整理緩衝區(對於位元組流來說沒有作用) // 寫位元組的成員方法 abstract void write(int b): 一次寫一個位元組 (引數int便於傳遞byte的整數不用強轉) void write(byte[] b): 一次寫一個位元組陣列 void write(byte[] b, int offset, int len): 一次寫一個位元組陣列的一部分 java.io.FileOutputStream類: 檔案位元組輸出流 (向檔案寫資料) // 構造方法 FileOutputStream(String name): 通過檔案路徑建立檔案位元組輸出流 FileOutputStream(File file): 通過File物件建立檔案位元組輸出流 構造方法的作用: 1. 建立一個FileOutputStream物件 2. 根據構造方法傳遞的路徑, 在磁碟上建立一個空檔案 ("如果檔案存在則會清空資料") 3. 將建立的FileOutputStream物件指向這個磁碟上的檔案 位元組輸出流: 一次寫一個位元組到檔案 瞭解Java程式將資料寫入檔案的原理 FileOutputStream寫資料到檔案需要哪3步 寫資料的原理: Java程式 -> JVM虛擬機器 -> OS作業系統 -> OS呼叫寫資料的方法 -> 將資料寫入檔案 使用位元組輸出流寫資料到檔案的步驟: 1. 建立物件: 建立FileOutputStream物件, 構造方法中傳遞檔案路徑 2. 寫入資料: 使用FileOutputStream物件呼叫 write(int b) 方法, 將位元組寫入檔案 3. 釋放資源: 使用FileOutpu 5分鐘練習: 使用FileOutputStream寫資料到檔案 需求: 建立FileOutputStream物件, 路徑傳遞當前模組下的testOutputStream1.txt檔案 "day09\\testOutputStream1.txt" write() 寫入 97, 98, 99 close() 釋放資源 開啟檔案檢視 public class Test { public static void main(String[] args) throws IOException { // 為了學習IO流時不讓try catch打亂程式碼結構, 我們先throws宣告丟擲 // 1. 建立檔案位元組輸出流物件 FileOutputStream fos = new FileOutputStream("day09\\testOutputStream1.txt"); // 2. 寫資料 fos.write(97); fos.write(98); fos.write(99); // 3. 釋放資源 fos.close(); } } 檔案儲存原理和記事本開啟檔案的原理 向檔案中寫入位元組資料時, 寫入的是什麼進位制的資料 寫入檔案的是數字, 但文字編輯器開啟後為什麼會顯示為字元 向檔案中寫入位元組資料時, 十進位制的數字會被轉換為"二進位制"的數字寫入檔案 文字編輯器開啟文字檔案時, 會先查詢編碼表, 將二進位制數字轉換為對應的字元進行顯示 0-127: 查詢ASCII碼錶 -128~127 其他: 查詢系統預設碼錶 Windows簡體中文系統的程式開啟是按 GBK 碼錶 IDEA中使用的是 UTF-8 碼錶 ASCII編碼表: 1個byte就是一個字元 97 a 位元組輸出流: 一次寫多個 如何一次性寫入多個byte 如何獲取一個字串對應的byte String -> byte "abc" -> byte byte byte 補充: java.lang.String類: byte[] getBytes(): 使用平臺的預設字符集將此String編碼為byte陣列 java.io.FileOutputStream類: 檔案位元組輸出流 (向檔案寫資料) void write(byte[] b): 一次寫一個位元組陣列 void write(byte[] b, int off, int len): 一次寫一個位元組陣列的一部分 Java中, byte的範圍是 -128 ~ 127 共256個數值 編碼表中字元範圍是 0 ~ 255 共256個數值 寫多個位元組時: 如果第一個位元組是正數中的 0~127, 則記事本會查詢 ASCII碼錶 顯示字元 如果第一個位元組是負數中的:-128~-1, 則記事本會查詢 GBK碼錶 顯示字元.(將兩個連續的byte組合為一箇中 文) FileOutputStream fos = new FileOutputStream(new File("09_IOAndProperties\\b.txt")); byte[] bytes2 = "你好".getBytes(); System.out.println(Arrays.toString(bytes2));//[-28, -67, -96, -27, -91, -67] fos.write(bytes2); //釋放資源 fos.close(); 位元組輸出流: 續寫, 換行 如何在檔案已有內容之後, 接著寫入內容 (續寫)? 如何在檔案中寫入換行, Windows系統的換行符號是什麼? java.io.FileOutputStream類: 檔案位元組輸出流 // 帶有 續寫 功能的構造方法, 不會清空檔案 FileOutputStream(String name, boolean append): 通過檔案路徑建立流, true可以續寫 FileOutputStream(File file, boolean append): 通過File物件建立流, true可以續寫 換行符: Windows系統: "\r\n" Linux系統: "\n" MacOS系統: "\r" 位元組輸入流: 一次讀取一個位元組原理: C:/Users/win/AppData/Local/YNote/data/qq51705C22557BC4566B6FB12F9448BCB0/ab90326e7d45490fa723573579a5c6eb/clipboard.png 如何一次讀取多個byte 一次讀取多個byte是如何實現的, 相比於一次讀取一個byte效率上哪個更高 補充: java.lang.String類: String(byte[] bytes): 使用平臺預設字符集解碼將byte陣列轉換為String String(byte[] bytes, int offset, int length): 使用平臺預設字符集將陣列一部分轉換為String 總結: java.io.InputStream抽象類: 位元組輸入流 (頂層類) int read(byte[] b): 一次讀一個位元組陣列 引數 byte[] b 作用: 儲存每次讀到的位元組, 起到緩衝作用 返回值作用: 每次讀到的位元組個數, 讀到檔案末尾返回-1 // 示例程式碼 FileInputStream fis = new FileInputStream("模組名\\檔名"); byte[] bytes = new byte[1024]; // 定義位元組陣列, 用於儲存每次讀取到的資料 int len; // 定義int變數, 用於儲存每次讀取到的長度 while ((len = fis.read(bytes)) != -1) { String s = new String(bytes, 0, len); // 將讀取到的位元組轉換為字串, 讀到多少個就轉換多少個 System.out.print(s); } fis.close(); // 釋放資源 C:/Users/win/AppData/Local/YNote/data/qq51705C22557BC4566B6FB12F9448BCB0/76f05812ef5b4885b93835544477710a/clipboard.png 字元輸出流: Writer和FileWriter Writer類有哪些共性方法 FileWriter類可以做什麼 建立FileWriter物件時有哪3個作用 java.io.Writer抽象類: 字元輸出流 (頂層類) 'a''b' 緩衝區 97 98 // 常用成員方法 abstract void close(): 重新整理緩衝區並釋放資源 abstract void flush() :重新整理緩衝區 // 寫 void write(int c): 寫一個字元 (int型別為了程式碼編寫方便) void write(char[] cbuf): 寫一個字元陣列 abstract void write(char[] b, int off, int len): 寫一個字元陣列的一部分 void write(String str): 寫一個字串 void write(String str, int off, int len): 寫一個字串的一部分 注意: write()方法只是將資料寫到記憶體緩衝區, 最後必須呼叫flush()或close()才能將資料真正寫入磁碟 java.io.FileWriter類: 檔案字元輸出流 // 構造方法 FileWriter(File file): 通過File物件建立檔案字元輸出流 FileWriter(String fileName): 通過檔案路徑建立檔案字元輸出流 作用: 1. 建立FileWriter物件 2. 根據構造方法中的路徑, 在磁碟上建立檔案 ("如果檔案已存在, 則清空檔案內容") 3. 將FileWriter物件指向磁碟上的檔案 字元輸出流: flush與close區別 區別: flush(): 重新整理緩衝區 (將資料從記憶體中寫入到磁碟) close(): 重新整理緩衝區, 並釋放資源. 關閉流後不能再用同一個流物件操作 flush() 可以省略, 只用 close()來 重新整理並釋放資源 字元輸出流: 其他方法 寫的其他方法: void write(char[] cbuf): 寫一個字元陣列 abstract void write(char[] b, int off, int len): 寫一個字元陣列的一部分 void write(String str): 寫一個字串 void write(String str, int off, int len): 寫一個字串的一部分 Properties Properties儲存資料和 Properties雙列集合: 鍵和值都是 String 型別 java.util.Properties類: 屬性集, 屬於Map的雙列集合, 繼承自Hashtable // 構造方法 Properties(): 建立一個Properties集合 // 可以使用Map介面中的方法 // 特有成員方法 Object setProperty(String key, String value): 儲存/替換鍵值對 String getProperty(String key): 通過鍵獲取值. 鍵不存在返回null Set<String> stringPropertyNames(): 返回鍵的集合 void store(OutputStream out, String comments): 將集合用位元組流寫入檔案(不能中文),並寫入註釋 void store(Writer writer, String comments): 將集合用字元流寫入檔案(可以中文),並寫入註釋 void load(InputStream inStream): 從配置檔案中通過位元組流載入資料到Properties集合(不能中文) void load(Reader reader): 從配置檔案中通過字元流載入資料到Properties集合(可以中