Java基礎之IO框架

 

1、流的概念java

 

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

 

 

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進行處理。如:
複製代碼
 1 import java.io.*;
 2 public class Echo {
 3   public static void main(String[] args) {
 4     BufferedReader in =
 5       new BufferedReader(
 6         new InputStreamReader(System.in));
 7     String s;
 8     try {
 9       while((s = in.readLine()).length() != 0)
10         System.out.println(s);
11       // An empty line terminates the program
12     } catch(IOException e) {
13       e.printStackTrace();
14     }
15   }
16 } 
複製代碼
該程序接受鍵盤輸入並回顯。

對BufferedReader類,該類的readLine()方法能一次從流中讀入一行,但對於BufferedWriter類,就沒有一次寫一行的方法,因此若要向流中一次寫一行,可用PrintWriter類將原來的流改形成新的打印流,PrintWriter類有一個方法println(),能一次輸出一行。如: 框架

............
PrintWriter out = new PrintWriter(new BufferedWriter(
      new FileWriter("D:\javacode\test.txt")));
out.println("Hello World!");
out.close();
............

 

 

例子:dom

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

 

複製代碼
 1 import java.io.*;
 2 public class TextRead{
 3 
 4 public static void main(String[] args){
 5    BufferedReader bf = null;/*BufferedReader至關於一個大桶,其實就是內存,這裏實現了大量大量的讀寫 ,而不是讀一個字節或字符就直接寫如硬盤,增強了對硬盤的保護。*/
 6    try{
 7     while(true){ // while(true){}循環保證程序不會結束
 8     
 9        bf = new BufferedReader(new InputStreamReader(System.in));
10        /*System.in 爲標準輸入,System.out爲標準輸出*/
11        /*InputStreamReader用語將字節流到字符流的轉化,這也就是處理流了
12         *在這裏至關與2個管道接在System.in與程序之間。
13         *readLine()方法功能比較好用,也就經過處理流來實現更好功能。
14         **/
15      String line = bf.readLine();
16      System.out.println(line);
17     }  
18    }catch(Exception e){
19     e.printStackTrace();
20    }finally{
21     //必定要關閉流,用完後。最好放在
22 
23 filally 裏面。  
24     try{   
25      if(bf!=null){
26       bf.close();
27      }
28     }catch(Exception e){
29        e.printStackTrace();
30     }  
31    }  
32 }
33 }
複製代碼

2,與文件 相關的 讀寫。    實現了文件的複製。spa

複製代碼
 1 import java.io.*;
 2 public class TextRead{
 3 
 4 public static void main(String[] args){
 5    File fin,fout;  
 6    BufferedReader bf = null;
 7    PrintWriter pw = null;
 8    try{
 9     fin = new File("zzc.txt"); //注意文件與程序都要在同一個文件夾下。zzc.txt爲要被複制的文件。
10     fout = new File("copyzzc.txt"); //若是沒有會自動建立。
11     bf = new BufferedReader(new FileReader(fin));
12     pw = new PrintWriter(fout); //PrintWriter爲打印流,也可使用BufferedWriter.
13     String line = bf.readLine();
14     while(line!=null){
15     pw.println(line);
16      line = bf.readLine();
17     }
18    }catch(Exception e){
19     e.printStackTrace();
20    }finally{
21     try{
22     //關閉 文件。
23      if(bf!=null){
24       bf.close();
25       bf = null;
26      }
27      if(pw!=null){
28       pw.close();
29       pw = null;
30      }
31     }catch(Exception e){
32      e.printStackTrace();
33     }
34    }
35 }
36 }
複製代碼

 

還有好多類:code

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

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

相關文章
相關標籤/搜索