System類的支持和緩衝流
System類對IO的支持
-
在System類中,爲了支持IO操做提供了三個常量:java
- 錯誤輸出:
public static final PrintStream err;
- 輸出到標準輸出設備(顯示器)
public static final PrintStream out;
- 從標準輸入(鍵盤)設備輸入
public static final InputStream in;
錯誤輸出
System.err 是 PrintStream 類對象,此對象專門負責進行錯誤信息的輸出操做數組
- 幾乎無用!
system.err 和 System.out 的功能是徹底同樣的;之因此設計 System.err 主要目的就是 err 能夠輸出用戶看不見的錯誤,而 System.out 輸出用戶可見的信息。app
信息輸出
System.out 是在Java中專門支持屏幕輸出信息的操做對象(對象由系統賦值實例化)spa
public class TestDemo { public static void main(String [] args) throws IOException { OutputStream out = System.out; out.write("Hello,World!".getBytes()); } }
上述程序:經過System.out實例對象,OutputStream out 轉爲了向屏幕輸出設計
系統輸入
System.in:鍵盤輸入操做。Java並無直接提供鍵盤輸入功能;而System類中提供了 in 對象,此對象類型是 IntputStreamcode
public class TestDemo { public static void main(String [] args) throws IOException { InputStream in = System.in ; // System.in對象是系統實例化, byte [] data = new byte[1024]; int len = in.read(data); // 輸入數據 System.out.println(new String(data,0,len)); } }
public class TestDemo { public static void main(String [] args) throws IOException { //InputStream in = System.in ; // System.in對象是系統實例化, byte [] data = new byte[1024]; int len = System.in.read(data); // 輸入數據 System.out.println(new String(data,0,len)); } }
System.out 和 System.in 都是系統實例化的對象,在程序中均是向上轉型。對象
在系統輸入中,利用byte數組接收輸入數據,可是數組有長度限制,用戶一旦不可控的輸入過長的數據該如何?get
- 解決方法
經過接收單字符並不斷追加的方式能夠避免長度限制自由的輸入數據it
public class TestDemo { public static void main(String [] args) throws IOException { StringBuffer buf = new StringBuffer(); int temp = 0 ; while ((temp = System.in.read()) != -1) { // \n 換行也屬於Char字符 if ( temp == '\n') { break; } buf.append((char)temp); } System.out.println(buf); } }
如上,咱們利用StringBuffer類對象 buf ,不斷追加Char型字符;由此達到不受長度限制任意接收輸入的字符。io
- 問題提出:
按照上述的方法,如果輸入的數據爲 中文 內容,則可能會致使亂碼現象。
緣由:
中文漢字,每一個漢字佔用兩個字節,而一個英文字符佔用一個字節。
而咱們的方法中,是按照單個字節進行讀取的,由此致使亂碼。
緩衝流
- 解決中文字符輸入帶來的諸多問題
處理中文輸入的問題,因爲中文單字符佔兩個字節,由此咱們首先想到的是利用字符流處理中文數據。
緩衝操做流
字符緩衝區流:
- <u>BufferedReader:字符緩衝輸入流</u>
- BufferedWriter:字符緩衝輸出流
字節緩衝區流:
- BufferedInputStream:字節緩衝輸入流
- BufferedOutputStream:字節緩衝輸出流
字符緩衝輸入流
BufferedReader構造
public BufferedReader(Reader in);
讀取一行數據
public String readLine() thows IOException;
如果利用BufferedReader類來處理System.in操做,是不可直接的;由於System.in是InputStream的類型。
- InputStream 和 Reader 類之間的轉換
引用:InputStreamReader類
public class TestDemo { public static void main(String [] args) throws IOException { // System.in 是InputStream的類對象 // BufferedReader的構造方法接收的是Reader類對象 // 利用InputStreamReader將字節流變爲字符流 BufferedReader buf = new BufferedReader (new InputStreamReader(System.in)); // 調用readLine()方法接收一行數據,以String數據返回,而且以 \n 做爲分隔 String str = buf.readLine(); System.out.println(str); } }
BufferedReader類構造接收的數據是 Reader字符流對象;
利用InputStreamReader類將字節流類對象的Systen.in轉爲字符流的類對象Reader。
文件讀取
BufferedReader緩衝輸入流不單單能夠能夠從鍵盤中得到,也能夠從文件中得到
public class TestDemo { public static void main(String [] args) throws IOException { File file = new File("F:" + File.separator + "demo" + File.separator + "demo.txt"); if (!file.exists()) { file.mkdirs(); } BufferedReader buf = new BufferedReader // FileReader():實例的爲字符流數據,而BufferedReader接收Reader字符流 (new FileReader(file)); String str = null; while ((str = buf.readLine()) != null) { System.out.println(str); } buf.close(); } }