時隔多久,我又回來寫博客了,最近忙於兩個課設,五周,搞得頭髮都不知道掉了多少根了,還沒成為程式員就開始掉了,等我成為一名程式員的時候豈不是要禿頭了,IT界的人會不會幫我當成大佬了,哈哈哈哈,希望我以後也可以成為一名IT界的大佬,雖然有點不現實,但是夢想還是要有的,萬一不經意間就實現了也說不定,加油~ ...
時隔多久,我又回來寫博客了,最近忙於兩個課設,五周,搞得頭髮都不知道掉了多少根了,還沒成為程式員就開始掉了,等我成為一名程式員的時候豈不是要禿頭了,IT界的人會不會幫我當成大佬了,哈哈哈哈,希望我以後也可以成為一名IT界的大佬,雖然有點不現實,但是夢想還是要有的,萬一不經意間就實現了也說不定,加油~
字元流
當使用位元組流讀取文本文件時,可能會有一個小問題。就是遇到中文字元時,可能不會顯示完整的字元,那是因為一個中文字元可能占用多個位元組存儲。所以Java提供一些字元流類,以字元為單位讀寫數據,專門用於處理文本文件
字元輸入流[Reader]
java.io.Reader 抽象類是表示用於讀取字元流的所有類的超類,可以讀取字元信息到記憶體中。它定義了字元輸入 流的基本共性功能方法
public void close() :關閉此流並釋放與此流相關聯的任何系統資源。
public int read() : 從輸入流讀取一個字元。
public int read(char[] cbuf) : 從輸入流中讀取一些字元,並將它們存儲到字元數組 cbuf中
FileReader類
java.io.FileReader 類是讀取字元文件的便利類。構造時使用系統預設的字元編碼和預設位元組緩衝區。
1. 字元編碼:位元組與字元的對應規則。Windows系統的中文編碼預設是GBK編碼表。 idea中UTF-8
2. 位元組緩衝區:一個位元組數組,用來臨時存儲位元組數據。
構造方法:
FileReader(File file) : 創建一個新的 FileReader ,給定要讀取的File對象。
FileReader(String fileName) : 創建一個新的 FileReader ,給定要讀取的文件的名稱。
讀取字元數據:
1. 讀取字元: read 方法,每次可以讀取一個字元的數據,提升為int類型,讀取到文件末尾,返回 -1 ,迴圈讀取
1 package demosummary.file.filereader;
2
3 import java.io.FileReader;
4
5 public class FileReader_02 {
6 public static void main(String[] args) throws Exception{
7 //使用文件名創建流對象
8 FileReader fr = new FileReader(".\\src\\demosummary\\file\\a.txt");
9 //定義變數,保存數據
10 int a;
11 //迴圈讀取
12 while ((a = fr.read())!= -1) {
13 System.out.println((char) a);
14 }
15 //釋放資源
16 fr.close();
17 }
18 /**
19 * 輸出結果
20 * 黑
21 * 馬
22 * 程
23 * 序
24 * 員
25 */
26 }
2. 使用字元數組讀取: read(char[] cbuf) ,每次讀取b的長度個字元到數組中,返回讀取到的有效字元個數, 讀取到末尾時,返回 -1
1 package demosummary.file.filereader;
2
3 import java.io.FileReader;
4
5 public class FileReader_03 {
6 public static void main(String[] args) throws Exception{
7 //創建流對象
8 FileReader fr = new FileReader(".//src//demosummary//file//a.txt");
9 //定義變數
10 int len;
11 //定義字元數組,作為裝字元的容器
12 char[] l = new char[2];
13 //迴圈讀取
14 while ((len = fr.read(l)) != -1) {
15 System.out.println(new String(l, 0, len));
16 }
17 fr.close();
18 }
19 /**
20 * 輸出結果
21 * 黑馬
22 * 程式
23 * 員
24 */
25 }
字元輸出流[writer]
java.io.Writer 抽象類是表示用於寫出字元流的所有類的超類,將指定的字元信息寫出到目的地。它定義了位元組 輸出流的基本共性功能方法
void write(int c) 寫入單個字元。
void write(char[] cbuf) 寫入字元數組。
abstract void write(char[] cbuf, int off, int len) 寫入字元數組的某一部分,off數組的開始索引,len 寫的字元個數。
void write(String str) 寫入字元串。
void write(String str, int off, int len) 寫入字元串的某一部分,off字元串的開始索引,len寫的字元個 數。
void flush() 刷新該流的緩衝。
void close() 關閉此流,但要先刷新它。
FileWriter類
java.io.FileWriter 類是寫出字元到文件的便利類。構造時使用系統預設的字元編碼和預設位元組緩衝區
構造方法
FileWriter(File file) : 創建一個新的 FileWriter,給定要讀取的File對象。
FileWriter(String fileName) : 創建一個新的 FileWriter,給定要讀取的文件的名稱
基本寫出數據
寫出字元: write(int b) 方法,每次可以寫出一個字元數據
1 package demosummary.file.filereader;
2
3 import java.io.FileWriter;
4
5 public class FileReader_04 {
6 public static void main(String[] args) throws Exception{
7 //創建流對象
8 FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//b.txt");
9 //寫入數據
10 fw.write(97);
11 fw.write('b');
12 fw.write('C');
13 fw.write(30000);
14 fw.write(40000);
15
16 //刷新緩衝
17 fw.flush();
18 //釋放資源
19 fw.close();
20 }
21 /**
22 * 輸出結果
23 * abC田鱀
24 */
25 }
註意:
1. 雖然參數為int類型四個位元組,但是只會保留一個字元的信息寫出。
2. 未調用close方法,數據只是保存到了緩衝區,並未寫出到文件中。
關閉和刷新
因為內置緩衝區的原因,如果不關閉輸出流,無法寫出字元到文件中。但是關閉的流對象,是無法繼續寫出數據 的。如果我們既想寫出數據,又想繼續使用流,就需要 flush 方法了。
flush :刷新緩衝區,流對象可以繼續使用。
close :先刷新緩衝區,然後通知系統釋放資源。流對象不可以再被使用了。
1 package demosummary.file.filereader;
2
3 import java.io.FileWriter;
4
5 public class FileReader_05 {
6 public static void main(String[] args) throws Exception{
7 //創建流對象
8 FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//c.txt");
9
10 //寫入數據並刷新
11 fw.write("刷");
12 fw.flush();
13 fw.write("新");
14 fw.flush();
15
16 //寫入數據,並關閉
17 fw.write("關");
18 fw.close();
19 fw.write("閉");//報錯(流已關閉): Stream closed
20 fw.close();
21
22 //釋放資源
23 fw.close();
24 }
25 /**
26 * 輸出結果
27 * 刷新關
28 */
29 }
註意:即便是flush方法寫出了數據,操作的後還是要調用close方法,釋放系統資源。
寫出其他數據
1. 寫出字元數組 : write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以寫出字元數 組中的數據,用法類似FileOutputStream
1 package demosummary.file.filereader;
2
3 import java.io.FileWriter;
4
5 public class FileReader_06 {
6 public static void main(String[] args) throws Exception{
7 //創建流對象
8 FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//d.txt");
9
10 char[] chars = "黑馬程式員".toCharArray();
11
12 fw.write(chars);//黑馬程式員
13
14 fw.write(chars,2,2);//程式
15 //釋放資源
16 fw.close();
17 }
18 /**
19 * 輸出結果
20 * 黑馬程式員
21 * 程式
22 */
23 }
2. 寫出字元串: write(String str) 和 write(String str, int off, int len) ,每次可以寫出字元串中的 數據,更為方便
1 package demosummary.file.filereader;
2
3 import java.io.FileWriter;
4
5 public class FileReader_07 {
6 public static void main(String[] args) throws Exception{
7 //創建流對象
8 FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//e.txt");
9
10 String string = "傳智播客";
11
12 fw.write(string);//傳智播客
13
14 fw.write(string,2,2);//播客
15 //釋放資源
16 fw.close();
17 }
18 /**
19 * 輸出結果
20 * 傳智播客播客
21 */
22 }
3. 續寫和換行:操作類似於FileOutputStream
1 package demosummary.file.filereader;
2
3 import java.io.FileWriter;
4
5 public class FileReader_08 {
6 public static void main(String[] args) throws Exception{
7 //創建流對象
8 FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//f.txt");
9
10 //寫入字元串
11 fw.write("黑馬");
12 //寫入換行
13 fw.write("\r\n");
14 //寫入字元串
15 fw.write("程式員");
16 //釋放資源
17 fw.close();
18 }
19 /**
20 * 輸出結果
21 * 黑馬
22 * 程式員
23 */
24 }
註意:字元流,只能操作文本文件,不能操作圖片,視頻等非文本文件。當我們單純讀或者寫文本文件時 使用字元流 其他情況使用位元組流