提要16 讀取轉換流17 寫入轉換流18 流操作規律-119 流操作規律-220 改變標準輸入輸出設備21 異常的日誌信息22 系統信息16 讀取轉換流字元流體系中的InputStreamReader,是位元組流通向字元流的橋梁:它使用指定的charset讀取位元組並將其解碼為字元。它使用的字元集可以由...
提要
16 讀取轉換流
17 寫入轉換流
18 流操作規律-1
19 流操作規律-2
20 改變標準輸入輸出設備
21 異常的日誌信息
22 系統信息
16 讀取轉換流
字元流體系中的InputStreamReader,是位元組流通向字元流的橋梁:它使用指定的charset讀取位元組並將其解碼為字元。
它使用的字元集可以由名稱指定或顯示給定,否則將接受平臺預設的字元集。
1 /*
2 通過上一小節15-讀取鍵盤錄入中鍵盤錄入一行數據並列印其大寫,發現就是讀一行數據的原理。
3 也就是readLine方法。
4 能不能直接使用readLine方法來完成鍵盤錄入一行數據的讀取呢?
5
6 readLine方法是字元流BufferedReader類中的方法。
7 而鍵盤錄入的read方法是位元組流InputStream的方法。
8
9 那麼能不能將位元組流轉換成字元流再去使用字元流緩衝區的readLine方法呢。
10
11 */
12 import java.io.*;
13 public class TransStreamDemo
14 {
15 public static void main(String[] args)throws IOException
16 {
17 //獲取鍵盤錄入對象
18 InputStream in=System.in;
19
20 //將位元組流轉換為字元流對象,使用轉換流InputStreamReader
21 InputStreamReader isr=new InputStreamReader(in);
22
23 //為了提高效率,將字元串送入緩衝區,使用BufferedReader
24 BufferedReader bufr=new BufferedReader(isr);
25
26 String line=null;
27 while((line=bufr.readLine())!=null)
28 {
29 if("over".equals(line))
30 break;
31 System.out.println(line.toUpperCase());
32 }
33 }
34 }
17 寫入轉換流
Writer的直接子類,OutputStreamWriter是字元流通向位元組流的橋梁,可使用指定的charset將寫入流中的字元編碼成位元組。
它使用的字元集可以由名稱指定或者顯示給定,否則將接受平臺預設的字元集。
源:鍵盤錄入(System.in)
目的:控制台(System.out)
1 /*寫入轉換流,把字元流轉換為位元組流*/
2 import java.io.*;
3 public class TransStreamDemo2
4 {
5 public static void main(String[] args) throws IOException
6 {
7 //InputStream in=System.in;
8 //InputStreamReader isr=new InputStreamReader(in);
9 //BufferedReader bufr=new BufferedReader(isr);
10 //可簡化為
11 //這是最常用的讀取鍵盤錄入
12 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
13
14 //OutputStream out=System.out;
15 //OutputStreamWriter osw=new OutputStreamWriter(out);
16 //BufferedWriter bufo=new BufferedWriter(osw);
17 //可簡化為
18 BufferedWriter bufo=new BufferedWriter(new OutputStreamWriter(System.out));
19
20 String line=null;
21 while((line=bufr.readLine())!=null)
22 {
23 if("over".equals(line))
24 break;
25 bufo.write(line.toUpperCase());
26 bufo.newLine();
27 //刷新
28 bufo.flush();
29 }
30
31 }
32 }
View Code
18 流操作規律-1
需求:想把鍵盤錄入的數據存儲到一個文件中
源:鍵盤
目的:文件
1 import java.io.*;
2 public class TransStreamDemo3
3 {
4 public static void main(String[] args)throws IOException
5 {
6 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
7
8 BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt")));
9
10 String line=null;
11 while((line=bufr.readLine())!=null)
12 {
13 if("over".equals(line))
14 break;
15 bufw.write(line.toUpperCase());
16 bufw.newLine();
17 bufw.flush();
18 }
19 }
20 }
View Code
需求:想要將一個文件的數據列印在控制臺上。
源:文件
目的:控制台
1 import java.io.*;
2 public class TransStreamDemo4
3 {
4 public static void main(String[] args)throws IOException
5 {
6 BufferedReader bufr=new BufferedReader(new InputStreamReader(new FileInputStream("ReadIn.java")));
7 BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
8
9 String line=null;
10 while((line=bufr.readLine())!=null)
11 {
12 if("over".equals(line))
13 break;
14 bufw.write(line);
15 bufw.newLine();
16 bufw.flush();
17 }
18
19 }
20 }
View Code
流操作的基本規律:
最痛苦的就是流對象有很多,不知道該用哪一個
通過三個明確來完成:
1.明確源和目的
源:輸入流,InputStream,Reader
目的:輸出流,OutputStream,Writer
2.操作的數據是否是純文本。
是:字元流
不是:位元組流
3.當體系明確後,再明確要使用哪個具體的對象。
通過設備來區分。
源設備:記憶體,硬碟,鍵盤
目的設備:記憶體,硬碟,控制台
例1:將一個文本文件中的數據存儲到另一個文本文件,即複製文件。
分析過程:
源:因為是源,所以使用讀取流。InputStream,Reader
是不是操作文本文件?
是!這時可以選擇Reader。
這樣體系就明確了。
接下來要明確使用該體系中的那個對象。
明確設備:硬碟上的一個文件
Reader體資中可以操作文件的對象是FileReader。
是否需要提高效率?是!加入Reader體系中的緩衝區,BufferedReader
FileReader fr=new FileReader("a.txt");
BufferedReader bufr=new BufferedReader(fr);
目的:因為是目的,所以使用寫入流。OutputStream,Writer
是否是純文本?
是!Writer
設備:硬碟,一個文件
Writer體系中可以操作文件的對象是FileWriter
是否需要提高效率?是!加入Writer體系中的緩衝區,BufferedWriter
FileWriter fw=new FileWriter("a.txt");
BufferedWriter bufw=new BufferedWriter(fw);
19 流操作規律-2
2.需求:將鍵盤錄入的數據保存到一個文件中
這個需求中,源和目的都存在。
那麼,分別分析。
源:InputStream Reader
是不是純文本? 是!用Reader。
設備:鍵盤,對應的對象是System.in
不是選擇Reader嗎?System.in對應的不是位元組流嗎?
為了操作鍵盤文本數據方便,轉換成字元流按照字元串操作是最方便的。
所以既然明確了Reader,那麼就將System.in轉換成Reader
用了Reader體系的轉換流,InputStreamReader。
InputStreamReader isr=new InputStreamReader(System.in);
需要提高效率嗎?需要!BufferedReader
BufferedReader bufr=new BufferedReader(isr);
目的:OutputStream Writer
是否是純文本文件?是!Writer
設備:硬碟,一個文件,使用FileWriter
FileWriter fw=new FileWriter("c.txt");
需要提高效率嗎?需要!
BufferedWriter bufw=new BufferedWriter(fw);
_____________________________________________
擴展一下,想要把錄入的數據按照指定的編碼表(utf-8)存到文件中。
目的:OutputStream Writer
是否是純文本文件?是!Writer
設備:硬碟,一個文件,使用FileWriter
但是存儲時,需要加入指定的編碼表,而編碼表只有轉換流可以指定。
所以要使用的對象是OutputStreamWriter。
而該轉換流對象要接受一個可以操作文件的位元組輸出流。FileOutputStream
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("d.txt"),"utf-8");
FileWriter fw=new FileWriter("c.txt");
需要提高效率嗎?需要!
BufferedWriter bufw=new BufferedWriter(fw);
1 import java.io.*;
2 public class TransStreamDemo5
3 {
4 public static void main(String[] args)throws IOException
5 {
6 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
7 BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8"));
8
9 String line=null;
10 while((line=bufr.readLine())!=null)
11 {
12 if("over".equals(line))
13 break;
14 bufw.write(line);
15 bufw.newLine();
16 bufw.flush();
17 }
18
19 }
20 }
View Code
同樣用鍵盤輸入“你好!”,使用預設的GBK編碼得到的文件大小是8個位元組。
指定UTF-8編碼得到的文件是11個位元組。
註:
GBK,全稱《漢字內碼擴展規範》,不論中英文均用雙位元組表示。
UTF-8:是用以解決國際上字元的一種多位元組編碼,它對英文使用8位(即一個位元組),中文使用24為(三個位元組)來編碼。UTF-8包含全世界所有國家需要用到的字元,是國際編碼,通用性強。
20 改變標準輸入輸出設備
java.lang包中的System類中有setIn和setOut方法,分別用來重新分配標準輸入流、輸出流。
1 import java.io.*;
2 public class TransStreamDemo5
3 {
4 public static void main(String[] args)throws IOException
5 {
6 //重新分配標準輸入流
7 System.setIn(new FileInputStream("PersonDemo.java"));
8
9 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
10 BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
11
12 String line=null;
13 while((line=bufr.readLine())!=null)
14 {
15 if("over".equals(line))
16 break;
17 bufw.write(line);
18 bufw.newLine();
19 bufw.flush();
20 }
21
22 }
23 }
View Code
21 異常的日誌信息
把拋出的異常信息寫入日誌文件。
1 import java.io.*;
2 import java.util.*;
3 import java.text.*;
4 public class ExceptionInfo
5 {
6 public static void main(String[] args)
7 {
8 try
9 {
10 int[] arr=new int[2];
11 System.out.println(arr[2]);
12 }
13 catch (Exception e)
14 {
15 try
16 {
17 Date d=new Date();
18 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
19 String s=sdf.format(d);
20
21 PrintStream ps=new PrintStream("exception.log");
22 ps.println(s);
23 System.setOut(ps);
24 }
25 catch (IOException ie)
26 {
27 throw new RuntimeException("異常文件創建失敗!");
28 }
29 e.printStackTrace(System.out);
30 }
31 }
32 }
View Code
但是,這樣寫比較麻煩,網上有一個專門為java做異常日誌的工具Log4j。
22 系統信息
把系統信息存入文件中。主要用到的方法:
1.System類中的getProperties方法,用來確定當前系統的屬性。
2.Properties類中的list(PrintStream out),將屬性類表輸出到指定的輸出流。
1 import java.io.*;
2 import java.util.*;
3 public class SystemInfo
4 {
5 public static void main(String[] args) throws IOException
6 {
7 Properties prop =System.getProperties();
8 prop.list(new PrintStream("sysinfo.txt"));
9 }
10 }
View Code