JAVA 中的IO流

1、流的概念
       流(stream)的概念源於UNIX中管道(pipe)的概念。在UNIX中,管道是一條不間斷的字節流,用來實現程序或進程間的通訊,或讀寫外圍設備、外部文件等。
       一個流,必有源端和目的端,它們能夠是計算機內存的某些區域,也能夠是磁盤文件,甚至能夠是Internet上的某個URL。
        流的方向是重要的,根據流的方向,流可分爲兩類:輸入流和輸出流。用戶能夠從輸入流中讀取信息,但不能寫它。相反,對輸出流,只能往輸入流寫,而不能讀它。
       實際上,流的源端和目的端可簡單地當作是字節的生產者和消費者,對輸入流,可沒必要關心它的源端是什麼,只要簡單地從流中讀數據,而對輸出流,也可不知道它的目的端,只是簡單地往流中寫數據。 
       形象的比喻——水流 ,文件 ======程序 ,文件和程序之間鏈接一個管道,水流就在之間造成了,天然也就出現了方向:能夠流進,也能夠流出.便於理解,這麼定義流: 流就是一個管道里面有流水,這個管道鏈接了文件和程序。
2、流的分類
  1. java.io包中的類對應兩類流,一類流直接從指定的位置(如磁盤文件或內存區域)讀或寫,這類流稱爲 節點流(node stream), 其它的流則稱爲過濾器(filters)。過濾器輸入流每每是以其它輸入流做爲它的輸入源,通過過濾或處理後再以新的輸入流的形式提供給用戶,過濾器輸出流的原理也相似。
  2. Java的經常使用輸入、輸出流
java.io包中的stream類根據它們操做對象的類型是字符仍是字節可分爲兩大類: 字符流和字節流。
 
  • Java的字節流
InputStream是全部字節輸入流的祖先,而OutputStream是全部字節輸出流的祖先。
  • Java的字符流
Reader是全部讀取字符串輸入流的祖先,而writer是全部輸出字符串的祖先。
結合開始所說的輸入/輸出流 ,出現了個一小框架。

                     字節流                         字符流
輸入流        InputStream               Reader
輸出流        OutputStream            Writer
java

JAVA字節流node

  • FileInputStream和FileOutputStream
    這兩個類屬於結點流,第一個類的源端和第二個類的目的端都是磁盤文件,它們的構造方法容許經過文件的路徑名來構造相應的流。如:
    FileInputStream infile = new FileInputStream("myfile.dat");
    FileOutputStream outfile = new FileOutputStream("results.dat");

要注意的是,構造FileInputStream, 對應的文件必須存在而且是可讀的,而構造FileOutputStream時,如輸出文件已存在,則必須是可覆蓋的。 網絡

  • BufferedInputStream和BufferedOutputStream
    它們是過濾器流,其做用是提升輸入輸出的效率。
  • DataInputStream和DataOutputStream
    這兩個類建立的對象分別被稱爲數據輸入流和數據輸出流。這是頗有用的兩個流,它們容許程序按與機器無關的風格讀寫Java數據。因此比較適合於網絡上的數據傳輸。這兩個流也是過濾器流,常以其它流如InputStream或OutputStream做爲它們的輸入或輸出。
    Java的字符流

        字符流主要是用來處理字符的。Java採用16位的Unicode來表示字符串和字符,對應的字符流按輸入和輸出分別稱爲readers和writers。
    • InputStreamReader和OutputStreamWriter
      在構造這兩個類對應的流時,它們會自動進行轉換,將平臺缺省的編碼集編碼的字節轉換爲Unicode字符。對英語環境,其缺省的編碼集通常爲ISO8859-1。
    • BufferedReader和BufferedWriter
      這兩個類對應的流使用了緩衝,能大大提升輸入輸出的效率。這兩個也是過濾器流,經常使用來對InputStreamReader和OutputStreamWriter進行處理。如:
      import java.io.*;
      public class Echo {
        public static void main(String[] args) {
          BufferedReader in =
            new BufferedReader(
              new InputStreamReader(System.in));
          String s;
          try {
            while((s = in.readLine()).length() != 0)
              System.out.println(s);
            // An empty line terminates the program
          } catch(IOException e) {
            e.printStackTrace();
          }
        }
      }
    該程序接受鍵盤輸入並回顯。
    對BufferedReader類,該類的readLine()方法能一次從流中讀入一行,但對於BufferedWriter類,就沒有一次寫一行的方法,因此若要向流中一次寫一行,可用PrintWriter類將原來的流改形成新的打印流,PrintWriter類有一個方法println(),能一次輸出一行。如:
    ............
    PrintWriter out = new PrintWriter(new BufferedWriter(
          new FileWriter("D:\javacode\test.txt")));
    out.println("Hello World!");
    out.close();
    ............

    例子:框架

    1,與控制檯相關。的讀入/寫出。 實現了字符串的複製。dom

    import java.io.*;
    public class TextRead{

    public static void main(String[] args){
       BufferedReader bf = null;/*BufferedReader至關於一個大桶,其實就是內存,這裏實現了大量大量的讀寫 ,而不是讀一個字節或字符就直接寫如硬盤,增強了對硬盤的保護。*/
       try{
        while(true){ // while(true){}循環保證程序不會結束
        
           bf = new BufferedReader(new InputStreamReader(System.in));
           /*System.in 爲標準輸入,System.out爲標準輸出*/
           /*InputStreamReader用語將字節流到字符流的轉化,這也就是處理流了
            *在這裏至關與2個管道接在System.in與程序之間。
            *readLine()方法功能比較好用,也就經過處理流來實現更好功能。
            **/
         String line = bf.readLine();
         System.out.println(line);
        }  
       }catch(Exception e){
        e.printStackTrace();
       }finally{
        //必定要關閉流,用完後。最好放在編碼

    filally 裏面。  
        try{   
         if(bf!=null){
          bf.close();
         }
        }catch(Exception e){
           e.printStackTrace();
        }
        
       }
       
    }

    }spa

    2,與文件 相關的 讀寫。    實現了文件的複製。
    import java.io.*;
    public class TextRead{

    public static void main(String[] args){
       File fin,fout;  
       BufferedReader bf = null;
       PrintWriter pw = null;
       try{
        fin = new File("zzc.txt"); //注意文件與程序都要在同一個文件夾下。zzc.txt爲要被複制的文件。
       
        fout = new File("copyzzc.txt"); //若是沒有會自動建立。
       
        bf = new BufferedReader(new FileReader(fin));
       
          pw = new PrintWriter(fout); //PrintWriter爲打印流,也可使用BufferedWriter.
        String line = bf.readLine();
        while(line!=null){
         pw.println(line);
        
         line = bf.readLine();
        }
       
       
       }catch(Exception e){
        e.printStackTrace();
       
       }finally{
        try{
        //關閉 文件。
         if(bf!=null){
          bf.close();
          bf = null;
         }
         if(pw!=null){
          pw.close();
          pw = null;
         }
        }catch(Exception e){
         e.printStackTrace();
        }
       }
       
    }

    }code

    也是在一個百度好友上看到一篇關於流的文章寫的更詳細,把好多過期的不用的,哪寫經常使用的都分類了,對象

    還有好多類:接口

    像RandomAccessFile類,序列化接口,都十分重要。

    Java有一種特殊類型的IO數據流——DataOutputStream——它能夠保證「不管數據來自何種機器,只要使用一個DataInputStream收取這些數據,就可用本機正確的格式保存它們.

    之後在把示例加上,還有寫比較好的方法。

    其實感受這已是固定模式了,一提到從鍵盤讀取數據 就會聯想到:

    new BufferedReader(new InputStreamReader(System.in))

    如今水平達不到,仍是記些固定格式比較好,以致於會用。

    某個老師也說過,創新是創建在紮實的基礎之上,愈來愈以爲基礎重要了。

相關文章
相關標籤/搜索