1. 程式人生 > >java總結輸入流輸出流

java總結輸入流輸出流

1.什麼是IO

      Java中I/O操作主要是指使用Java進行輸入,輸出操作. Java所有的I/O機制都是基於資料流進行輸入輸出,這些資料流表示了字元或者位元組資料的流動序列Java的I/O流提供了讀寫資料的標準方法。任何Java中表示資料來源的物件都會提供以資料流的方式讀寫它的資料的方法。  

      Java.io是大多數面向資料流的輸入/輸出類的主要軟體包。此外,Java也對塊傳輸提供支援,在核心庫 java.nio中採用的便是塊IO。

  流IO的好處是簡單易用,缺點是效率較低。塊IO效率很高,但程式設計比較複雜。 
      Java IO模型  :


      Java的IO模型設計非常優秀,它使用Decorator模式,按功能劃分Stream,您可以動態裝配這些Stream,以便獲得您需要的功能。例如,您需要一個具有緩衝的檔案輸入流,則應當組合使用FileInputStream和BufferedInputStream。 

2.資料流的基本概念

       資料流是一串連續不斷的資料的集合,就象水管裡的水流,在水管的一端一點一點地供水,而在水管的另一端看到的是一股連續不斷的水流。資料寫入程式可以是一段、一段地向資料流管道中寫入資料,這些資料段會按先後順序形成一個長的資料流。對資料讀取程式來說,看不到資料流在寫入時的分段情況,每次可以讀取其中的任意長度的資料,但只能先讀取前面的資料後,再讀取後面的資料。不管寫入時是將資料分多次寫入,還是作為一個整體一次寫入,讀取時的效果都是完全一樣的。

      “流是磁碟或其它外圍裝置中儲存的資料的源點或終點。”

    在電腦上的資料有三種儲存方式,一種是外存,一種是記憶體,一種是快取。比如電腦上的硬碟,磁碟,U盤等都是外存,在電腦上有記憶體條,快取是在CPU裡面的。外存的儲存量最大,其次是記憶體,最後是快取,但是外存的資料的讀取最慢,其次是記憶體,快取最快。這裡總結從外存讀取資料到記憶體以及將資料從記憶體寫到外存中。對於記憶體和外存的理解,我們可以簡單的理解為容器,即外存是一個容器,記憶體又是另外一個容器。那又怎樣把放在外存這個容器內的資料讀取到記憶體這個容器以及怎麼把記憶體這個容器裡的資料存到外存中呢?

     在Java類庫中,IO部分的內容是很龐大的,因為它涉及的領域很廣泛:

         標準輸入輸出,檔案的操作,網路上的資料流,字串流,物件流,zip檔案流等等,java中將輸入輸出抽象稱為流,就好像水管,將兩個容器連線起來。將資料衝外存中讀取到記憶體中的稱為輸入流,將資料從記憶體寫入外存中的稱為輸出流。

    流是一個很形象的概念,當程式需要讀取資料的時候,就會開啟一個通向資料來源的流,這個資料來源可以是檔案,記憶體,或是網路連線。類似的,當程式需要寫入資料的時候,就會開啟一個通向目的地的流。

      總結的基本概念如下:

1) 資料流

    一組有序,有起點和終點的位元組的資料序列。包括輸入流和輸出流。

  

2) 輸入流(Input  Stream):

      程式從輸入流讀取資料來源。資料來源包括外界(鍵盤、檔案、網路…),即是將資料來源讀入到程式的通訊通道

     

 3) 輸出流

    程式向輸出流寫入資料。將程式中的資料輸出到外界(顯示器、印表機、檔案、網路…)的通訊通道。

         

採用資料流的目的就是使得輸出輸入獨立於裝置。

Input  Stream不關心資料來源來自何種裝置(鍵盤,檔案,網路)
Output  Stream不關心資料的目的是何種裝置(鍵盤,檔案,網路)

4 資料流分類:

流序列中的資料既可以是未經加工的原始二進位制資料,也可以是經一定編碼處理後符合某種格式規定的特定資料。因此Java中的流分為兩種:
 1)  位元組流:資料流中最小的資料單元是位元組
 2)  字元流:資料流中最小的資料單元是字元, Java中的字元是Unicode編碼,一個字元佔用兩個位元組。

3. 標準I/O

 Java程式可通過命令列引數與外界進行簡短的資訊交換,同時,也規定了與標準輸入、輸出裝置,如鍵盤、顯示器進行資訊交換的方式。而通過檔案可以與外界進行任意資料形式的資訊交換。

1. 命令列引數

  1. publicclass TestArgs {  
  2.     publicstaticvoid main(String[] args) {  
  3.         for (int i = 0; i < args.length; i++) {  
  4.             System.out.println("args[" + i + "] is <" + args[i] + ">");  
  5.         }  
  6.     }  
  7. }  

執行命令:java Java C VB

執行結果:

args[0] is <Java>

args[1] is <C>

args[2] is <VB>

2. 標準輸入,輸出資料流

java系統自帶的標準資料流:java.lang.System:

  1. java.lang.System   
  2. publicfinalclass System  extends Object{   
  3.    static  PrintStream  err;//標準錯誤流(輸出)
  4.    static  InputStream  in;//標準輸入(鍵盤輸入流)
  5.    static  PrintStream  out;//標準輸出流(顯示器輸出流)
  6. }  

注意:
(1)System類不能建立物件,只能直接使用它的三個靜態成員。
(2)每當main方法被執行時,就自動生成上述三個物件。

1) 標準輸出流 System.out

   System.out向標準輸出裝置輸出資料,其資料型別為PrintStream。方法:

      Void print(引數)       Void println(引數)

2)標準輸入流 System.in

    System.in讀取標準輸入裝置資料(從標準輸入獲取資料,一般是鍵盤),其數 據型別為InputStream。方法:

        int read()//返回ASCII碼。若,返回值=-1,說明沒有讀取到任何位元組讀取工作結束。          int read(byte[] b)//讀入多個位元組到緩衝區b中返回值是讀入的位元組數 例如:
  1. import java.io.*;  
  2. publicclass StandardInputOutput {  
  3.     publicstaticvoid main(String args[]) {  
  4.         int b;  
  5.         try {  
  6.             System.out.println("please Input:");  
  7.             while ((b = System.in.read()) != -1) {  
  8.                 System.out.print((char) b);  
  9.             }  
  10.         } catch (IOException e) {  
  11.             System.out.println(e.toString());  
  12.         }  
  13.     }  
  14. }  
等待鍵盤輸入,鍵盤輸入什麼,就打印出什麼:

3)標準錯誤流

   System.err輸出標準錯誤,其資料型別為PrintStream。可查閱API獲得詳細說明。

    標準輸出通過System.out呼叫println方法輸出引數並換行,而print方法輸出引數但不換行。println或print方法都通 過過載實現了輸出基本資料型別的多個方法,包括輸出引數型別為boolean、char、int、long、float和double。同時,也過載實現 了輸出引數型別為char[]、String和Object的方法。其中,print(Object)和println(Object)方法在執行時將調 用引數Object的toString方法。

  1. import java.io.BufferedReader;  
  2. import java.io.IOException;  
  3. import java.io.InputStreamReader;  
  4. publicclass StandardInputOutput {  
  5.     publicstaticvoid main(String args[]) {  
  6.         String s;  
  7.         // 建立緩衝區閱讀器從鍵盤逐行讀入資料
  8.         InputStreamReader ir = new InputStreamReader(System.in);  
  9.         BufferedReader in = new BufferedReader(ir);  
  10.         System.out.println("Unix系統: ctrl-d 或 ctrl-c 退出"
  11.                 + "\nWindows系統: ctrl-z 退出");  
  12.         try {  
  13.             // 讀一行資料,並標準輸出至顯示器
  14.             s = in.readLine();  
  15.             // readLine()方法執行時若發生I/O錯誤,將丟擲IOException異常
  16.             while (s != null) {  
  17.                 System.out.println("Read: " + s);  
  18.                 s = in.readLine();  
  19.             }  
  20.             // 關閉緩衝閱讀器
  21.             in.close();  
  22.         } catch (IOException e) { // Catch any IO exceptions.
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
  26. }  

4.java.IO層次體系結構

     在整個Java.io包中最重要的就是5個類和一個介面。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個介面指的是Serializable.掌握了這些IO的核心操作那麼對於Java中的IO體系也就有了一個初步的認識了

      Java I/O主要包括如下幾個層次,包含三個部分:

   1.流式部分――IO的主體部分;

   2.非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;

   3.其他類--檔案讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地作業系統相關的檔案系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。

   主要的類如下:

     1. File(檔案特徵與管理):用於檔案或者目錄的描述資訊,例如生成新目錄,修改檔名,刪除檔案,判斷檔案所在路徑等。

     2. InputStream(二進位制格式操作):抽象類,基於位元組的輸入操作,是所有輸入流的父類。定義了所有輸入流都具有的共同特徵。

     3. OutputStream(二進位制格式操作):抽象類。基於位元組的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特徵。

     Java中字元是採用Unicode標準,一個字元是16位,即一個字元使用兩個位元組來表示。為此,JAVA中引入了處理字元的流。

     4. Reader(檔案格式操作):抽象類,基於字元的輸入操作。

     5. Writer(檔案格式操作):抽象類,基於字元的輸出操作。

     6. RandomAccessFile(隨機檔案操作):它的功能豐富,可以從檔案的任意位置進行存取(輸入輸出)操作

     Java中IO流的體系結構如圖:

     

5. 非流式檔案類--File類

在Java語言的java.io包中,由File類提供了描述檔案和目錄的操作與管理方法。但File類不是InputStream、OutputStream或Reader、Writer的子類,因為它不負責資料的輸入輸出,而專門用來管理磁碟檔案與目錄。
作用:File類主要用於命名檔案、查詢檔案屬性和處理檔案目錄。
  1. publicclass   File   extends Object   
  2.     implements Serializable,Comparable  
  3. {}  
File類共提供了三個不同的建構函式,以不同的引數形式靈活地接收檔案和目錄名資訊。建構函式:
1)File (String   pathname)         例:File  f1=new File("FileTest1.txt"); //建立檔案物件f1,f1所指的檔案是在當前目錄下建立的FileTest1.txt
2)File (String  parent  ,  String child)      例:File f2=new  File(“D:\\dir1","FileTest2.txt") ;//  注意:D:\\dir1目錄事先必須存在,否則異常
3)File (File    parent  , String child)
     例:File  f4=new File("\\dir3");
          File  f5=new File(f4,"FileTest5.txt");  //在如果 \\dir3目錄不存在使用f4.mkdir()先建立         一個對應於某磁碟檔案或目錄的File物件一經建立, 就可以通過呼叫它的方法來獲得檔案或目錄的屬性。            1)public boolean exists( ) 判斷檔案或目錄是否存在
       2)public boolean isFile( ) 判斷是檔案還是目錄 
       3)public boolean isDirectory( )判斷是檔案還是目錄
       4)public String getName( )返回檔名或目錄名
       5)public String getPath( )返回檔案或目錄的路徑。
       6)public long length( )獲取檔案的長度 
       7)public String[ ] list ( )將目錄中所有檔名儲存在字串陣列中返回。         File類中還定義了一些對檔案或目錄進行管理、操作的方法,常用的方法有:
       1) public boolean renameTo( File newFile );    重新命名檔案
       2) public void delete( );   刪除檔案
       3)  public boolean mkdir( ); 建立目錄

例子:
  1. import java.io.File;  
  2. import java.io.IOException;  
  3. publicclass TestFile {  
  4.     publicstaticvoid main(String args[]) throws IOException {  
  5.         File dir = new File("\\root");  
  6.         File f1 = new File(dir, "fileOne.txt");  
  7.         File f2 = new File(dir, "fileTwo.java");  
  8.         // 檔案物件建立後,指定的檔案或目錄不一定物理上存在
  9.         if (!dir.exists())  
  10.             dir.mkdir();  
  11.         if (!f1.exists())  
  12.             f1.createNewFile();  
  13.         if (!f2.exists())  
  14.             f2.createNewFile();  
  15. 相關推薦

    JAVA輸入輸出當中,什麼時候該使用字元?什麼時候該使用位元組

    1. InputStream 和OutputStream,兩個是為位元組流設計的,主要用來處理位元組或二進位制物件, 2. Reader和 Writer.兩個是為字元流(一個字元佔兩個位元組)設計的,主要用來處理字元或字串. 字元流處理的單元為2個位元組的Unicode字元,分別操作字元、字元陣列或字串,而位

    JAVA輸入輸出當中,什麽時候該使用字符?什麽時候該使用字節流?

    enc href nic 文件 功能 byte[] 字節數 .com 字節 1. InputStream 和OutputStream,兩個是為字節流設計的,主要用來處理字節或二進制對象, 2. Reader和 Writer.兩個是為字符流(一個字符占兩個字節)設計的,

    java總結輸入輸出

    1.什麼是IO       Java中I/O操作主要是指使用Java進行輸入,輸出操作. Java所有的I/O機制都是基於資料流進行輸入輸出,這些資料流表示了字元或者位元組資料的流動序列。Java的I/O流提供了讀寫資料的標準方法。任何Java中表示

    Java筆記(7)-輸入輸出、File類、InputStream、Reader、檔案位元組、檔案字元、緩衝、隨機、資料、物件、序列化和物件克隆、Scanner解析檔案、Console

    所有的合適都是兩個人的相互遷就和改變,沒有天生合適的兩個人,兩個人朝著相同的方向努力,就是最好的愛情。 輸入、輸出流 什麼是“流”。直觀地講,流就像水一樣,不存在大小問題,也避免了完整性問題。非流的資料傳輸,比如你下載一張圖片,需要整幅圖片下

    java輸入輸出

    概述 從14年10月份開始工作,到今天做Android已經兩年半了。可是到現在也沒搞清楚Java的I/O機制,痛定思痛,覺得好好整理一下。古人云“格物致知”,今天就好好格一格I/O機制吧! 常見

    Java筆記】檔案輸出中的IO異常處理

    在檔案輸出流(FileOutputStream)的寫入操作和關閉資源操作中,比如說檔案寫入失敗或者關閉資源失敗等等,我們不能把這些異常總是拋給虛擬機器,不然JVM會生氣的,我們已經長大了要自己學會處理這些異常。 如: try { fos = new FileOutputStream("

    C++輸入輸出

    一 I/O流的概念和流類庫的結構 1 I/O流的概念和流類庫的結構 1)標準裝置的輸入和輸出。即從鍵盤輸入資料,輸出到顯示器螢幕。標準輸入輸出 2)標準裝置的輸入和輸出。即從鍵盤輸入資料,輸出到顯示器螢幕。標準輸入輸出 3)記憶體中指定的空間進行輸入和輸出,稱為字串輸入輸出,簡稱串I

    Java網路程式設計(輸出 OutputStream)

    網路程式所做的很大一部分工作都是簡單的輸入輸出: 將資料位元組從一個系統移動到另一個系統。位元組就是位元組。在很大程度上講,讀取伺服器傳送給你的資料與讀取檔案並沒有什麼不同。向客戶端傳送文字和寫檔案也沒有什麼不同。但是,Java中輸入和輸出(I/O)的組織與其他語言都不太一

    轉換和標準輸入輸出

    轉換流提供了字元流和位元組流之間的轉換 InputStreamReader和OutputStreamWriter 位元組流中的資料都是字元時,轉成字元流操作更高效 /* 轉換流:inputStreamReader OutputStreamWriter 編碼:字串 --->

    輸入輸出__檔案對話方塊 JFileChooser

    使用檔案對話方塊 指定輸入輸出檔案 是一個常用功能。 本博文介紹 用檔案對話方塊 開啟和儲存 檔案的方法 使用javax.swing.JFileChooser 實現開啟和儲存檔案對話方塊 一. JFileChooser 類的常用方法 showOpernDialog()  

    Day08 輸入 輸出

    read和write方法在執行是都將阻塞,直至位元組被真正的輸入或者輸出。這就意味著如果流不能被立即訪問(通常因為網路繁忙),那麼當前的執行緒被阻塞。其他執行緒失去工作機會。 我們就要用到available byte[] data = new byte[bytesAvailable]; in

    C++技術點積累(6)——異常處理、輸入輸出

    1、異常處理機制: 1、異常是一種程式控制機制,與函式機制獨立和互補 函式是一種以棧結構展開的上下函式銜接的程式控制系統,異常是另一種控制結構,它依附於棧結構,卻可以同時設定多個異常型別作為網捕條件,從而以型別匹配在棧機制中跳躍回饋. 2、異常設計目的: 棧機制是一種高度節

    Process輸入輸出及對C++、Python的測試

    對C++部分的測試來自文章: http://fair-jm.iteye.com/blog/1442267 C++程式碼 #include<iostream> #include<string> using namesp

    C++提高 10(標準輸入輸出,檔案io

    1.標準輸入流 #include<iostream> using namespace std; void main01() { int a; long b; char c[100]

    java後臺用的輸出。怎麼在前臺用js怎麼接收

    後臺Java程式碼: @RequestMapping(value = "/friendLinks/friendLinksList.do") public void getfriendLinksList(HttpServletRequest request,

    java.se.io.2輸出

    package com.knock.io; import java.io.FileNotFoundException; import java.io.FileOutputStream; import

    Java輸入輸出遇到的一點問題

    () main public 可用 util clip 回收 char 錯誤 1 //package com.yunying.test; 2 import java.io.Console; 3 import java.util.Scanner; 4 //學習io

    Java輸入輸出

    輸入 Scanner  輸入 (1)首先建立Scanner物件,接受從控制檯輸出 Scanner input=new Scanner(System.in); (2)可以接受String 型別 String str=input next(); 亦可以接受int()型別

    Java輸入輸出

    一、Java的輸入 方法一:從控制檯接收一個字元,然後將其打印出來 import java.io.*; public static void main(String [] args) throws IOException{      &

    Java輸入輸出、if...else if...else判斷、Java中列印陣列、Java中陣列排序、檢視函式方法的原始碼、命令列引數

    Java的輸入和輸出: 輸入: import java.util.Scanner Scanner s = new Scanner(System.in); //通過new Scanner(System.in)建立一個Scanner物件,控制檯會一直等待輸入,直到敲回車鍵