elasticsearch入門系列">elasticsearch入門系列
596
2022-05-29
一、字符的讀取與寫入
1.為什么會出現字符流
字符流的介紹
由于字節流操作中文不是特別的方便,所以Java就提供字符流
字符流 = 字節流 + 編碼表
中文的字節存儲方式
用字節流復制文本文件時,文本文件也會有中文,但是沒有問題,原因是最終底層操作會自動進行字節拼接成中文,如何識別是中文的呢?
漢字在存儲的時候,無論選擇哪種編碼存儲,第一個字節都是負數
2.編碼表
什么是字符集
是一個系統支持的所有字符的集合,包括各國家文字、標點符號、圖形符號、數字等
l計算機要準確的存儲和識別各種字符集符號,就需要進行字符編碼,一套字符集必然至少有一套字符編碼。常見字符集有ASCII字符集、GBXXX字符集、Unicode字符集等
常見的字符集
ASCII字符集:
lASCII:是基于拉丁字母的一套電腦編碼系統,用于顯示現代英語,主要包括控制字符(回車鍵、退格、換行鍵等)和可顯示字符(英文大小寫字符、阿拉伯數字和西文符號)
基本的ASCII字符集,使用7位表示一個字符,共128字符。ASCII的擴展字符集使用8位表示一個字符,共256字符,方便支持歐洲常用字符。是一個系統支持的所有字符的集合,包括各國家文字、標點符號、圖形符號、數字等
GBXXX字符集:
GBK:最常用的中文碼表。是在GB2312標準基礎上的擴展規范,使用了雙字節編碼方案,共收錄了21003個漢字,完全兼容GB2312標準,同時支持繁體漢字以及日韓漢字等
Unicode字符集:
UTF-8編碼:可以用來表示Unicode標準中任意字符,它是電子郵件、網頁及其他存儲或傳送文字的應用 中,優先采用的編碼。互聯網工程工作小組(IETF)要求所有互聯網協議都必須支持UTF-8編碼。它使用一至四個字節為每個字符編碼
編碼規則:
128個US-ASCII字符,只需一個字節編碼
拉丁文等字符,需要二個字節編碼
大部分常用字(含中文),使用三個字節編碼
其他極少使用的Unicode輔助字符,使用四字節編碼
3.字符串中的編碼解碼問題
相關方法
代碼演示
public class StringDemo { public static void main(String[] args) throws UnsupportedEncodingException { //定義一個字符串 String s = "中國"; //byte[] bys = s.getBytes(); //[-28, -72, -83, -27, -101, -67] //byte[] bys = s.getBytes("UTF-8"); //[-28, -72, -83, -27, -101, -67] byte[] bys = s.getBytes("GBK"); //[-42, -48, -71, -6] System.out.println(Arrays.toString(bys)); //String ss = new String(bys); //String ss = new String(bys,"UTF-8"); String ss = new String(bys,"GBK"); System.out.println(ss); } }
4.字符流寫數據
介紹
Writer: 用于寫入字符流的抽象父類
FileWriter: 用于寫入字符流的常用子類
構造方法
成員方法
刷新和關閉的方法
代碼演示
public class OutputStreamWriterDemo { public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("myCharStream\a.txt"); //void write(int c):寫一個字符 // fw.write(97); // fw.write(98); // fw.write(99); //void writ(char[] cbuf):寫入一個字符數組 char[] chs = {'a', 'b', 'c', 'd', 'e'}; // fw.write(chs); //void write(char[] cbuf, int off, int len):寫入字符數組的一部分 // fw.write(chs, 0, chs.length); // fw.write(chs, 1, 3); //void write(String str):寫一個字符串 // fw.write("abcde"); //void write(String str, int off, int len):寫一個字符串的一部分 // fw.write("abcde", 0, "abcde".length()); fw.write("abcde", 1, 3); //釋放資源 fw.close(); } }
5.字符流讀數據
介紹
Reader: 用于讀取字符流的抽象父類
FileReader: 用于讀取字符流的常用子類
構造方法
成員方法
代碼演示
public class InputStreamReaderDemo { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("myCharStream\\b.txt"); //int read():一次讀一個字符數據 // int ch; // while ((ch=fr.read())!=-1) { // System.out.print((char)ch); // } //int read(char[] cbuf):一次讀一個字符數組數據 char[] chs = new char[1024]; int len; while ((len = fr.read(chs)) != -1) { System.out.print(new String(chs, 0, len)); } //釋放資源 fr.close(); } }
6.字符流用戶注冊案例
案例需求
將鍵盤錄入的用戶名和密碼保存到本地實現永久化存儲
實現步驟
獲取用戶輸入的用戶名和密碼
將用戶輸入的用戶名和密碼寫入到本地文件中
關流,釋放資源
代碼實現
public class CharStreamDemo8 { public static void main(String[] args) throws IOException { //需求: 將鍵盤錄入的用戶名和密碼保存到本地實現永久化存儲 //要求:用戶名獨占一行,密碼獨占一行 //分析: //1,實現鍵盤錄入,把用戶名和密碼錄入進來 Scanner sc = new Scanner(System.in); System.out.println("請錄入用戶名"); String username = sc.next(); System.out.println("請錄入密碼"); String password = sc.next(); //2.分別把用戶名和密碼寫到本地文件。 FileWriter fw = new FileWriter("charstream\\a.txt"); //將用戶名和密碼寫到文件中 fw.write(username); //表示寫出一個回車換行符 windows \r\n MacOS \r Linux \n fw.write("\r\n"); fw.write(password); //刷新流 fw.flush(); //3.關流,釋放資源 fw.close(); } }
7.字符緩沖流
字符緩沖流介紹
BufferedWriter:將文本寫入字符輸出流,緩沖字符,以提供單個字符,數組和字符串的高效寫入,可以指定緩沖區大小,或者可以接受默認大小。默認值足夠大,可用于大多數用途
BufferedReader:從字符輸入流讀取文本,緩沖字符,以提供字符,數組和行的高效讀取,可以指定緩沖區大小,或者可以使用默認大小。 默認值足夠大,可用于大多數用途
構造方法
代碼演示
public class BufferedStreamDemo01 { public static void main(String[] args) throws IOException { //BufferedWriter(Writer out) BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\bw.txt")); bw.write("hello\r\n"); bw.write("world\r\n"); bw.close(); //BufferedReader(Reader in) BufferedReader br = new BufferedReader(new FileReader("myCharStream\\bw.txt")); //一次讀取一個字符數據 // int ch; // while ((ch=br.read())!=-1) { // System.out.print((char)ch); // } //一次讀取一個字符數組數據 char[] chs = new char[1024]; int len; while ((len=br.read(chs))!=-1) { System.out.print(new String(chs,0,len)); } br.close(); } }
8.字符緩沖流特有功能
方法介紹
BufferedWriter:
BufferedReader:
代碼演示
public class BufferedStreamDemo02 { public static void main(String[] args) throws IOException { //創建字符緩沖輸出流 BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\bw.txt")); //寫數據 for (int i = 0; i < 10; i++) { bw.write("hello" + i); //bw.write("\r\n"); bw.newLine(); bw.flush(); } //釋放資源 bw.close(); //創建字符緩沖輸入流 BufferedReader br = new BufferedReader(new FileReader("myCharStream\\bw.txt")); String line; while ((line=br.readLine())!=null) { System.out.println(line); } br.close(); } }
9.9字符緩沖流操作文件中數據排序案例
案例需求
使用字符緩沖流讀取文件中的數據,排序后再次寫到本地文件
實現步驟
將文件中的數據讀取到程序中
對讀取到的數據進行處理
將處理后的數據添加到集合中
對集合中的數據進行排序
將排序后的集合中的數據寫入到文件中
代碼實現
public class CharStreamDemo14 { public static void main(String[] args) throws IOException { //需求:讀取文件中的數據,排序后再次寫到本地文件 //分析: //1.要把文件中的數據讀取進來。 BufferedReader br = new BufferedReader(new FileReader("charstream\\sort.txt")); //輸出流一定不能寫在這里,因為會清空文件中的內容 //BufferedWriter bw = new BufferedWriter(new FileWriter("charstream\\sort.txt")); String line = br.readLine(); System.out.println("讀取到的數據為" + line); br.close(); //2.按照空格進行切割 String[] split = line.split(" ");//9 1 2 5 3 10 4 6 7 8 //3.把字符串類型的數組變成int類型 int [] arr = new int[split.length]; //遍歷split數組,可以進行類型轉換。 for (int i = 0; i < split.length; i++) { String smallStr = split[i]; //類型轉換 int number = Integer.parseInt(smallStr); //把轉換后的結果存入到arr中 arr[i] = number; } //4.排序 Arrays.sort(arr); System.out.println(Arrays.toString(arr)); //5.把排序之后結果寫回到本地 1 2 3 4... BufferedWriter bw = new BufferedWriter(new FileWriter("charstream\\sort.txt")); //寫出 for (int i = 0; i < arr.length; i++) { bw.write(arr[i] + " "); bw.flush(); } //釋放資源 bw.close(); } }
總結
5G教育 Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。