redis.conf翻譯與配置(六)【redis6.0.6】
711
2025-03-31
轉換流
★轉換流功能1:充當字節流與字符流之間的橋梁
需求:模擬英文聊天程序,要求:
(1) 從鍵盤錄入英文字符,每錄一行就把它轉成大寫輸出到控制臺;
(2) 保存聊天記錄到字節流文件。
要求1的設計分析:
1)需要從鍵盤接收錄入,得用System.in,它是字節輸入流InputStream;
2)需要處理字符,可以自己把字節強轉成字符,也可以用字符流;
3)需要類似readLine的功能,而這個方法在字符流BufferedReader中有(而且該類有緩沖增速)。
綜上,采用轉換流把字節流轉成字符流處理比較合理,即使用InputStreamReader
要求2的設計分析:
1)需要把字符數據按行保存到字節流文件 ;
2)字符流采用BufferedWriter比較合適,因為它有newLine方法且能實現高效;
3)字節流文件,得采用FileOutputStream。
綜上,采用轉換流把字符流轉成字節流處理比較合理,即使用OutputStreamWriter
代碼實現:
package io.transfer; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; public class TranStreamDemo { public static void main(String[] args) throws IOException { //輸入 InputStream in = System.in; InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr); //輸出 OutputStream out = new FileOutputStream("chat.txt"); OutputStreamWriter osw = new OutputStreamWriter(out); BufferedWriter bw = new BufferedWriter(osw); String line = null; while( (line=br.readLine())!=null){ if("over".equals(line)){ //養成好的代碼習慣:調用String中的方法時,把常量字符串放在前面,防止變量為null而導致異常 break; } System.out.println( line.toUpperCase() ); bw.write(line); bw.newLine(); bw.flush();//字符流是帶緩沖的,必須刷緩沖 } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
轉換流
(InputStreamReader和OutputStreamWriter)
★轉換流功能2:字符編碼轉換
采用FileWriter以默認方式編碼
FileOutputStream+默認編碼表
采用轉換流以默認方式編碼
OutputStreamWriter + FileOutputStream + 默認編碼表
采用轉換流以指定編碼方式編碼
OutputStreamWriter + FileOutputStream +指定編碼表
采用轉換流以指定編碼方式解碼
InputStreamReader + FileInputStream +指定編碼表
代碼實現:
package io.transfer; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class TranStreamDemo2 { public static void main(String[] args) { try { //readTextDecoding1(); //readTextDecoding2(); writeTextEncoding(); } catch (IOException e) { e.printStackTrace(); } } private static void writeTextEncoding() throws IOException { //第一種: FileWriter+默認編碼表 FileWriter fw = new FileWriter("files\w_utf-8.txt");//該文件的編碼由平臺(如MyEclipse或dos窗口)定,不一定是utf-8 fw.write("每天進步一點點..."); fw.close(); //第二種: OutputStreamWriter+默認編碼表 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("files\w_utf-8_2.txt"));//該文件的編碼由平臺(如MyEclipse或dos窗口)定,不一定是utf-8 osw.write("第天進步一點點...");//牛耳 osw.close(); //第三種: OutputStreamWriter+指定編碼表 OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream("files\w_utf-8_3.txt"),"utf-8");//該文件的編碼一定是utf-8,因為是我們自己指定的 osw2.write("第天進步一點點..."); osw2.close(); } private static void readTextDecoding1() throws IOException { FileReader fr = new FileReader("files\utf-8.txt");//采用默認編碼表解碼 char[] cbuf = new char[10]; int len=0; while( (len=fr.read(cbuf))!=-1){ String str = new String(cbuf,0,len); System.out.print(str); } fr.close(); } private static void readTextDecoding2() throws IOException { //InputStreamReader isr = new InputStreamReader(new FileInputStream("files\gbk.txt"));//如果不指定編碼表,則是采用默認的 //用轉換流自己指定解碼表----只要文件的編碼表和這里指定的解碼表相同,就不會出現亂碼 //InputStreamReader isr = new InputStreamReader( new FileInputStream("files\gbk.txt"), "gbk"); //ok //InputStreamReader isr = new InputStreamReader( new FileInputStream("files\utf-8.txt"), "gbk");//亂碼 InputStreamReader isr = new InputStreamReader( new FileInputStream("files\utf-8.txt"), "utf-8");//ok char[] cbuf = new char[20]; int len = isr.read(cbuf); String str = new String(cbuf,0,len); System.out.println(str); isr.close(); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
打印流
★打印流的特點:
1)只有輸出沒有輸入。PrintStream是字節打印流,PrintWriter是字符打印流。
2)能夠方便地打印各種數據“值表示形式”,提供了一系列的打印功能(只有它有,其它流都沒有。)
3)和其他輸出流不同,它永遠不會拋出IOException異常(構造方法除外),異常內部解決且設置了內部標志。
4)可創建具有自動刷新的功能,可使用帶換行符的println()方法。
5)(在構造方法中)可以指定字符集編碼的。
★關于打印流的自動刷新
autoFlush - boolean 變量;如果為 true,則 println、printf 或 format 方法將刷新輸出緩沖區。
* —其實是因為這幾個方法中幫我們調用了out.flush()。
代碼實現:
//演示PrintStream類的自動刷新功能
package io.print; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; /** * * @author 陳浩翔 * * 2016-4-24 */ //演示PrintStream類的自動刷新功能 public class PrintStreamDemo { public static void main(String[] args) { try { demo1(); demo2(); for(int i=0;i<10;i++){ System.out.println(i); } //屏幕終端不會有輸出的,因為運行了demo2(); //把System.out的輸出目的地從屏幕更改到日志文件了 } catch (IOException e) { e.printStackTrace(); } } //把System.out的輸出目的地從屏幕更改到日志文件 private static void demo2() throws IOException { FileOutputStream font = new FileOutputStream("log.txt"); PrintStream out = new PrintStream(font,true); System.setOut(out); } private static void demo1() throws IOException { PrintStream out =new PrintStream("print.txt"); //out.write()只寫入一個字節(二進制的8位)的信息,如果參數大于一個字節的范圍, //那么實際上只會寫入最后一個字節的數據 out.write(97); out.write(353); //最后一個字節是97,因此寫入的是一個字符'a'----寫入的是值的表現形式 System.out.write(353);//輸出'a' System.out.flush(); out.println(345);//把參數轉換成字符串輸出 //上一句等價于out.write( String.valueOf(i) ) //※總之,PrintStream中用write()輸出的是字節數據且每次只輸出一個字節,而print()輸出的是數據的值的表現形式即轉換成字符串輸出。 //JSP中的out對象就是這種類型。要輸出字節數據如圖片聲明等二進制格式則必須用write(),而輸出頁面數據(字符)則要用print()或println() } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//演示PrintWriter類的自動刷新功能
package io.print; import java.io.IOException; import java.io.PrintWriter; /** * * @author 陳浩翔 * * 2016-4-24 */ //演示PrintWriter類的自動刷新功能 public class PrintStreamDemo2 { public static void main(String[] args) { demo1(); try { demo2(); } catch (IOException e) { e.printStackTrace(); } } private static void demo1() { //默認不自動刷新的 PrintWriter out =new PrintWriter(System.out); out.print("Hello World");//不會自動刷新 out.println("Hello World");//不會自動刷新 out.flush();//手動刷新 } private static void demo2() throws IOException { //設置自動刷新的 PrintWriter out = new PrintWriter(System.out,true); out.print("Hello World");//不會自動刷新 out.println("Hello World");//會----因為println()內部調用了out.flush() out.print("Hello3 \n");//不會 out.print("Hello3 \r\n");//不會 out.printf("%s", "Hello4");//會 /*總之: * autoFlush - boolean 變量;如果為 true,則 println、printf 或 format 方法將刷新輸出緩沖區。 * ---其實是因為這幾個方法中幫我們調用了out.flush()。 */ } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
IO包中的其他流
下面三個都是內存數組:
★字節數組流
ByteArrayInputStream與ByteArrayOutputStream
★字符數組流
CharArrayReader與CharArrayWriter
★字符串流
StringReader 與 StringWriter
1、用于操作字節數組的流對象,其實它們就是對應設備為內存的流對象。
2、該流的關閉是無效的,因為沒有調用過系統資源。
3、按照流的讀寫思想操作數組中元素。
★序列流
SequenceInputStream ——對多個流進行合并
1
將多個流進行邏輯串聯(合并變成一個流,操作起來很方便,因為多個源變成了一個源)
IO流知識點小結
流是用來處理數據的。
處理數據時,一定要先明確數據源與數據目的地(數據匯)。
數據源可以是文件、鍵盤或者其他流。
數據目的地可以是文件、顯示器或者其他流。
流只是在幫助數據進行傳輸,并對傳輸的數據進行處理,比如過濾處理、轉換處理等。
★ IO流體系
使用要點:看頂層(父類共性功能),用底層(子類具體對象)。
命名規律:
每個子類的后綴名都是所屬體系的父類的名稱,很容易區分所屬的體系。
而且每一個子類前綴名都是該子類對象的功能體現。
掌握IO流體系的要點和規律,開發時設計與查找相應的類就容易多了
Java 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。