一.什么是流?
1. I/O的定義 : Input/Out 入/出
Java通過流來執行I/O
2.什么是流?
流,是一種抽象的東西,咱們先拋開I/O不說,單說計算機中,如果想要讓軟件來改變硬件(比如在硬盤上添加一些txt等),就得依靠流來讓硬件發生變化;
Java中講的I/O就是這樣的一種,I/O是一門自帶流屬性的技術,我理解為它就是一種具有偏向性的流;
I/O流簡稱,他的中文學名叫做 "I/O 基於流", 完成數據的 入 / 出 操作,建立在流的基礎上.
二.字符流和字節流的特點和區別
- 字節是一種單位,也就是Byte, 表示數據量的多少,它計算機中存儲容量的一種計量單位;
- 字符是指計算機啊中使用的文字符號,比如"1,2,3,4,A,V,C,a,e,r,@,$,%"…等
字節和字符,它們完全不是一個概念,一個是計量單位,一個是純粹的名詞. 並且在不同的字節編碼里,字符和字節的對應關系不同,指的是字符的字節單位大小不同;
-
- Ascll碼中,一個引文字母(不分大小寫)占用一個字節空格鍵,一個漢字占用兩個字節空間,一個二進制數字占用一個字節空間
- UTF-8編碼中,一個英文字符等於一個字節,一個中文等於兩字節
- Unicode編碼中, 所有字符占兩個字節
- UTF-16編碼中,一個英文占用兩個字節,一個中文占用兩個字節(有一些UNICODE補充的中文漢字要占用4個字節)
- UTF-32編碼中,任何字符存儲都要占用四個字節
(來自百度,了解個大概,個人不清楚各種編碼詳細情況)
具體可以借鑒:一個講關於編碼很詳細的介紹 斟酌觀看
個人理解..
根據上面的理解,因為一開始的字符都是一個字節,慢慢的全球化開啟因為各地的語言使用出現了字符,一個字符占用兩個字節單位,字節是根本,一切的一切都是按照字節來的;
字符是字節的一種替代,各有所用,但是字節是基本的東西,字符是一種根據編碼集翻譯出來的產物;
三. 字符流和字節流的區別
1.字節流:顧名思義,在以字節為基本操作基礎的情況下對流進行定義;
2.字符流:是以字符為操作基礎,它使用的編碼表是Unicode,所以可以國際化,並且在某些情況下,字符流比字節流更高效,
但是底層上,字符流也是基於字節流的; (就好像,Java用操作符可以完成數組排序,但實際上用一些工具類的方
法可以快速完成數組排序;)
3. 在Java的概念中,實現I/O流的方法
本質上,底層里,字符流是基於字節留的,底層運行的時候最基本的還是字節流;
四.預定義流
Java程序一定會先倒入lang包,該包包含一個System類,它封裝了運行時環境的幾個要素,其中有三個預定義流變量,
分別是,in , out , err; 在System中分別被定義為public,final,static;
- System.out是標准輸出流,默認情況下是控制台,是InputStream類型的對象;
- System.in是標准輸入流,默認情況下是鍵盤,是PrintStream類型的對象;
- System.err是標准錯誤流,默認情況下是控制台,也是PrintStream類型的對象;
盡管他們通常用於對控制台的輸入和讀寫,但這些都是字節流,因為預定義流沒有包含字符流的java原始規范,
所以他們不是字符流而是字節流
五.
1.讀取控制台輸入
對於商業代碼而言,讀取控制台輸入的首選項是使用字符流,因為這樣做可以使程序更易國際化,更易維護,而且直接操作字符要比在字符字節之間來回切換轉換方便的多;
public static void main(String[] args) throws IOException { byte[] date = new byte[10]; System.out.println("輸入一些數"); /* System.in 返回從控制台輸入字符 read 從輸入流讀取數據的下一個字節。 值字節返回為int ,范圍為0至255 。 如果沒有字節可用,因為已經到達流的末尾,則返回值-1 。 該方法阻塞直到輸入數據可用,檢測到流的結尾,或拋出異常。*/ System.in.read(date); //System.in.rean輸入不存在什么輸多了,read方法把輸入的字符存儲好到內存中,然后再 //向date數組中存放,從內存中的第一個開始往里面灌,灌滿為止,剩下多余的被回收 for (byte b : date) { //如果直接輸入b,那就相當與把輸入的字節的底層ascll碼給轉為String了 // 就會直接輸出輸入字符所代表的ascll碼 //System.out.println(b); System.out.println((char)b);//將ascll轉換為字符形式,輸出的是ascll代表的字符 } }
2.寫入,控制台輸出
public static void main(String[] args) { int b=12; //向屏幕寫入一個字節 ,他不會將十進制Ascll碼轉換為字符串,而是直接轉換為字符 //或者說 字符類型(char) 會隱式轉換為int類型 System.out.write(b); //write()的寫入目標是控制台 System.out.write('\n'); }
而System.in.read(); 是輸入;流
將一些東西讀取 到程序中;
網太慢,明天更