P74 拾壹. 基本輸入與輸出 一. 使用的物件 1.Java 的輸入與輸出會使用到 Java.lang 套件中的 System 類別與 Java.io 套件, 其中 Java.io 套件中以 Reader/Writer 與 InputStream/OutputStream 類別最 重要, 前者以字元 (Character) 為導向, 後者以位元組 (Byte) 為導向 2.System 類別中最主要宣告了三個類別物件,System.in 用於系統輸入位元組資料, 一 般指鍵盤而言,System.out 用於系統輸出位元組資料, 一般指螢幕而言, System.err 用於系統輸出錯誤訊息, 一般指螢幕而言 3. 輸入 / 輸出類別繼承的架構 java.lang.object +- java.io.inputstream +- java.io.fileinputstream +- java.io.datainputstream +- : +- java.io.outputstream +- java.io.fileoutputstream +- java.io.dataoutputstream +- Java.io.PrintStream +- : +- Java.io.Reader +- Java.io.BufferedReader +- Java.io.InputStreamReader +- Java.io FileReader +- : +- Java.io.Writer +- Java.io.Bufferedwriter +- Java.io.OutputStreamWriter +- Java.io FileWriter +- : 二. 字元輸入 1. 一般而言對 Reader 物件提出輸入要求時, 會引發另一輸入要求, 通常使用 InputStreamReader 物件 ( 自鍵盤輸入 ) 或 FileReader 物件 ( 自本文檔輸入 ), 而為了輸入的效率, 又用到使用緩衝區的 BufferedReader 子類別例 : 自鍵盤輸入 -- P74 --
InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); 或可將兩列合併寫成一列 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)) 接著就可用 BufferedReader 類別的方法輸入資料了例 : 自本文檔輸入 FileReader fr=new FileReader( test.txt ); BufferedReader br=new BufferedReader(fr); 或可將兩列合併寫成一列 BufferedReader br=new BufferedReader(new FileReader( test.txt )) 接著就可用 BufferedReader 類別的方法輸入資料了 P75 2.BufferedReader 類別常用的方法方法說明 BufferedReader(Reader in) 建構子, 使用 Reader 物件以預設緩衝區建立輸入資料流 int read()throws IOException 讀入一個字元, 以整數傳回 String readline()throws IOException 讀入一列本文, 以字串傳回, 一列本文以 \n, \r, 或 \r\n 結束 boolean ready()throws IOException 檢驗緩衝區是否有資料可讀, 傳回布林值 void close()throws IOException 關閉輸入資料流 三. 字元輸出 1. 一般而言對 Writer 物件提出輸出要求時, 會引發另一輸出要求, 通常使用 OutputStreamWriter 物件 ( 輸出至螢幕 ) 或 FileWriter 物件 ( 輸出至本文檔 ), 而為了輸出的效率, 又用到使用緩衝區的 BufferedWriter 子類別例 : 輸出至螢幕 OutputStreamWriter osw=new OutputStreamWriter(System.out); BufferedWriter bw=new BufferedWriter(osw); 或可將兩列合併寫成一列 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out)) 接著就可用 BufferWriter 類別的方法輸出資料了例 : 輸出至本文檔 FileWriter fw=new FileWriter( test.txt ); BufferedWriter bw=new BufferedWriter(fw); 或可將兩列合併寫成一列 BufferedWriter bw=new BufferedWriter(new FileWriter( test.txt )) -- P75 --
接著就可用 BufferedWriter 類別的方法輸出資料了 P76 2.BufferedWriter 類別常用的方法方法 BufferedWriter(Writer out) void write(int c) throws IOException write(string s) throws IOException void newline()throws IOException void flush()throws IOException void close()throws IOException 說明建構子, 使用 Writer 物件以預設緩衝區建立輸出資料流寫出一個整數值代表的字元寫出一個字串寫出一個新列符號, 一般為 \n 將輸出資料流中的資料強迫寫出關閉輸出資料流 // 輸入自鍵盤, 輸出至螢幕 2 public class ch11_1 6 String str; 7 InputStreamReader isr=new InputStreamReader(System.in); 8 BufferedReader br=new BufferedReader(isr); 9 OutputStreamWriter osw=new OutputStreamWriter(System.out); 10 BufferedWriter bw=new BufferedWriter(osw); 11 while(true) 12 { 13 System.out.print(" 從鍵盤輸入 :"); 14 str=br.readline(); 15 if(str.length()==0) break; 16 bw.write(str); 17 bw.newline(); 18 bw.flush(); 19 } 20 br.close(); 21 bw.close(); 22 } 23 } // 輸入自鍵盤, 輸出至本文檔 test.txt 2 public class ch11_2 -- P76 --
6 String str; 7 InputStreamReader isr=new InputStreamReader(System.in); 8 BufferedReader br=new BufferedReader(isr); 9 FileWriter fw=new FileWriter("test.txt"); 10 BufferedWriter bw=new BufferedWriter(fw); 11 while(true) 12 { 13 System.out.print(" 從鍵盤輸入 :"); 14 str=br.readline(); 15 if(str.length()==0) break; 16 bw.write(str); 17 bw.newline(); 18 } 19 br.close(); 20 bw.close(); 21 } 22 } P77 // 輸入自本文檔 test.txt, 輸出至螢幕 2 public class ch11_3 6 String str; 7 FileReader fr=new FileReader("test.txt"); 8 BufferedReader br=new BufferedReader(fr); 9 OutputStreamWriter osw=new OutputStreamWriter(System.out); 10 BufferedWriter bw=new BufferedWriter(osw); 11 while(br.ready()) 12 { 13 str=br.readline(); 14 bw.write(str); 15 bw.newline(); 16 } 17 br.close(); 18 bw.close(); 19 } 20 } -- P77 --
P78 // 輸入自本文檔 test.txt, 輸出至本文檔 test.bak 2 public class ch11_4 6 String str; 7 FileReader fr=new FileReader("test.txt"); 8 BufferedReader br=new BufferedReader(fr); 9 FileWriter fw=new FileWriter("test.bak"); 10 BufferedWriter bw=new BufferedWriter(fw); 11 while(br.ready()) 12 { 13 str=br.readline(); 14 bw.write(str); 15 bw.newline(); 16 } 17 br.close(); 18 bw.close(); 19 } 20 } // 計算本文檔 test.txt 內字母與單字個數 2 public class ch11_5 6 int ch; 7 int wdcount=0,chcount=0; 8 9 FileReader fr=new FileReader("test.txt"); 10 BufferedReader br=new BufferedReader(fr); 11 OutputStreamWriter osw=new -- P78 --
OutputStreamWriter(System.out); 12 BufferedWriter bw=new BufferedWriter(osw); 13 while(br.ready()) 14 { 15 ch=br.read(); 16 if(ch=='\r') continue; 17 if(ch==' ' ch=='\n') 18 { 19 bw.newline(); 20 wdcount++; 21 } 22 else 2 24 bw.write(ch); 25 chcount++; 26 } 27 } 28 bw.write(" 字母共 "+String.valueOf(chcount)); 29 bw.newline(); 30 bw.write(" 單字共 "+String.valueOf(wdcount)); 31 bw.newline(); 32 br.close(); 33 bw.close(); 34 } 35 } P79 四. 位元組的輸入與輸出 1.DataInputStream 類別與 DataOutputStream 類別因繼承的關係, 所以也能串接其它的資料流, 進而利用自己的方法來存取, 在存取時是以資料型態 byte 數的長度直接進出資料流 2.DataInputStream 類別常用的方法 方法 說明 DataInputStream(InputStream in) 建構子, 使用 InputStream 物件建立輸入資料流 int read(byte[] b,int off,int len) 讀入位元組陣列 b boolean readboolean() 讀入布林值 byte readbyte() 讀入位元組 -- P79 --
P80 char readchar() 讀入字元 int readint() 讀入整數 short readshort() 讀入短整數 long readlong() 讀入長整數 float readfloat() 讀入單精準數 double readdouble() 讀入倍精準數 String readutf() 讀入 UTF 格式字串 註 : 所謂 UTF 格式字串, 是一種為增加效率而編碼過的字串, 將一個字元 (2 Bytes) 依 特定的規則, 編成 1byte,2byte 或 3byte 不等的長度 3.DataOutputStream 類別常用的方法 方法 說明 DataOutputStream(OutputStream out) 建構子, 使用 OutputStream 物件建立輸入資料流 void write(byte[] b,int off,int len) 寫出位元組陣列 b void writeboolean(boolean v) 寫出布林值 void writebyte(byte v) 寫出位元組 void writebytes(string s) 以位元組方式寫出字串 void writechar(int v) 寫出字元 void writechars(string s) 以字元方式寫出字串 void writeint(int v) 寫出整數 void writeshort(short v) 寫出短整數 void writelong(long v) 寫出長整數 void writefloat(float v) 寫出單精準數 void writedouble(double v) 寫出倍精準數 void writeutf(string str) 寫出 UTF 格式字串 void flush() 將資料流中的資料寫出 五. 列印資料流 1.PrintStream 類別產生列印資料流, 我們常用的 System.out 是它的一個物件, 而 print() 與 println() 是該物件的方法, 可列印所有資料型態的資料 ( 布林值, 整數, 長整數, 浮點數, 倍精準浮點數字元, 字串, 物件等 ) 2.PrintStream 類別常用的方法方法 PrintStream(OutputStream out) void print(any data) void println(any data) void println() void write(int b) void write(byte[] buf,int off, int len) 說明建構子, 使用 OutputStream 物件建立輸出資料流寫出一個資料, 其中 any 可為 boolean, char, char[], int, long, float, double, String 寫出一個資料並換列, 其中 any 可為 boolean, char, char[], int, long, float, double, String 寫出一個換列寫出一個位元組寫出一個起頭位置為 off 長度為 len 的位元組陣列 -- P80 --
void close() buf 關閉輸出資料流 註 :print() 方法與 println() 方法類似, 所不同者 println() 輸出後會換列, 而 print() 不會換列 // 自鍵盤輸入以位元組輸出至二進位檔 test.bin 2 public class ch11_6 6 String name; 7 int chi,eng,mat; 8 9 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 10 DataOutputStream dos=new DataOutputStream(new FileOutputStream("test.bin")); 11 12 System.out.println(" 從鍵盤輸入 :"); 13 while(true) 14 { 15 System.out.print(" 姓名 :"); 16 name=br.readline(); 17 if(name.length()==0) break; 18 dos.writeutf(name); 19 System.out.print(" 國文 :"); 20 chi=integer.parseint(br.readline()); 21 dos.writeint(chi); 22 System.out.print(" 英文 :"); 23 eng=integer.parseint(br.readline()); 24 dos.writeint(eng); 25 System.out.print(" 數學 :"); 26 mat=integer.parseint(br.readline()); 27 dos.writeint(mat); 28 } 29 dos.writeutf("eof"); 30 dos.close(); 31 br.close(); 32 } 33 } P81 -- P81 --
P82 // 自二進位檔 test.bin 以位元組輸入顯示在螢幕上 2 public class ch11_7 6 String name; 7 int chi,eng,mat,sum; 8 float avg; 9 10 DataInputStream dis=new DataInputStream(new FileInputStream("test.bin")); 11 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out)); 12 try 1 14 bw.write(" 姓名 \t 國文 \t 英文 \t 數學 \t 總和 \t 平均 "); 15 bw.newline(); 16 bw.flush(); 17 while(true) 18 { 19 name=dis.readutf(); 20 if(name=="eof") break; 21 chi=dis.readint(); 22 eng=dis.readint(); 23 mat=dis.readint(); 24 sum=chi+eng+mat; 25 avg=(float)(sum/3.0); 26 27 bw.write(name); 28 bw.write("\t"+chi); 29 bw.write("\t"+eng); 30 bw.write("\t"+mat); 31 bw.write("\t"+sum); 32 bw.write("\t"+avg); 33 bw.newline(); 34 bw.flush(); -- P82 --
35 } 36 dis.close(); 37 bw.close(); 38 } 39 catch(ioexception e){} 40 } 41 } P83 六. 練習 1. 設計程式 ex11_1.java, 將 ch11_6.java 產生的二進位檔 test.bin 轉成本文檔 ex11_1.txt 2. 設計程式 ex11_2.java, 將 ex11_1.java 產生的本文檔 ex11_1.txt 轉成二進位檔 ex11_2.bin -- P83 --