1. 程式人生 > >位元組流 字元流 概述

位元組流 字元流 概述

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和FileOutputStream
OutputStream是抽象類 有哪些共性方法?
OutputStream的共性方法有.close  .flush
FileOutputStream是普通類 可以做什麼
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集合(可以中