直接上碼:
讀取鍵盤錄入資料程式碼演示:
import java.io.IOException; import java.io.InputStream; /** *讀取鍵盤錄入的資料,並列印在控制檯上。 * *鍵盤本身就是一個標準的輸入裝置, *對於Java而言, */ public class ReadKey { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // readKey(); readKey_2(); } public static void readKey() throws IOException { InputStream in = System.in; int ch = in.read(); System.out.println(ch); int ch1 = in.read(); System.out.println(ch1); int ch2 = in.read(); System.out.println(ch2); } /** * 獲取使用者鍵盤錄入的資料, * 並將資料變成大寫顯示在控制檯上, * 如果使用者輸入的是over,則結束鍵盤錄入 * * 思路: * 1,因為鍵盤錄入只讀取一個位元組,要判斷是否是over,需要先將讀到的位元組拼成字串 * 2,那就需要一個容器。可以使用StringBuilder * 3,在使用者回車之前將錄入的資料變成字串判斷即可。 * @throws IOException */ public static void readKey_2() throws IOException { //建立容器 StringBuilder sb = new StringBuilder(); //獲取鍵盤讀取流 InputStream in = System.in; //定義變數記錄讀取到的位元組,並迴圈讀取。 int ch = 0; while((ch = in.read())!=-1){ //在儲存之前需要判斷是否是換行標記,因為換行標記不存 if(ch == '\r') continue; if(ch == '\n'){ String temp = sb.toString(); if("over".equals(temp)) break; System.out.println(temp.toUpperCase()); sb.delete(0,sb.length()); }else{ sb.append((char)ch); } } } }
流轉換:
位元組流轉換成字元流InputStreamReader
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class TransStreamDemo { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //位元組流 InputStream in = System.in; //將位元組轉換成字元的橋樑,即轉換流。 InputStreamReader isr = new InputStreamReader(in); //字元流 BufferedReader bufr = new BufferedReader(isr); String line = null; while((line=bufr.readLine())!=null){ if("over".equals(line)){ break; } System.out.println(line.toUpperCase()); } } }
字元流轉換成位元組流OutputStreamWriter
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; public class TransStreamDemo { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //位元組流 InputStream in = System.in; //將位元組轉換成字元的橋樑,即轉換流。 InputStreamReader isr = new InputStreamReader(in); //字元流 BufferedReader bufr = new BufferedReader(isr); OutputStream out = System.out; OutputStreamWriter osw = new OutputStreamWriter(out); BufferedWriter bufw = new BufferedWriter(osw); String line = null; while((line=bufr.readLine())!=null){ if("over".equals(line)){ break; } bufw.write(line.toUpperCase()); bufw.newLine(); bufw.flush(); } } }
程式碼重寫
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class TransStreamDemo { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out)); String line = null; while((line=bufr.readLine())!=null){ if("over".equals(line)){ break; } bufw.write(line.toUpperCase()); bufw.newLine(); bufw.flush(); } } }
複製檔案程式碼演示
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class TransStreamDemo { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"))); BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"))); String line = null; while((line=bufr.readLine())!=null){ if("over".equals(line)){ break; } bufw.write(line); bufw.newLine(); bufw.flush(); } } }
轉換流總結:
InputStreamReader : 位元組到字元的橋樑,解碼
OutputStreamWriter : 字元到位元組的橋樑,編碼
流的操作規律:
首先需弄清楚操作規律的原因是:流的物件太多啦,往往不知道用哪一個物件合適。
想要知道物件開發時用到哪些物件,只要通過四個條件去明確即可。
1, 明確源和目的(匯)
源:InputStream 和 Reader
目的:OutputStream 和 Writer
2,明確資料是否是純文字資料。
源:
是純文字:Reader
不是純文字:InputStream
目的:
是純文字:Writer
不是純文字:OutputStream
此時就明確了需要使用哪個體系
3,明確具體的裝置
源裝置:
硬碟:檔案File
鍵盤:System.in
記憶體:陣列
網路:Socket流
目的裝置:
硬碟:檔案File
控制檯:System.out
記憶體:陣列
網路:Socket流
4,是否需要其他額外功能。
1)是否需要高效(緩衝區)
是就加上Buffer
2)轉換
......
使用轉換流的常見場景:
1,源或者目的對應的裝置是位元組流,但是操作的卻是文字資料,可以使用轉換流作為橋樑,提高對本文操作的便捷
2,操作文字涉及到具體的指定編碼表時,必須使用轉換流。