Java基礎之I/O流


  一.什么是流?

  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(); 是輸入;流

  將一些東西讀取 到程序中;

 

 

 

 網太慢,明天更


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM