Java IO總結

1、概要數組

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

  • 流式部分――IO的主體部分;
  • 非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;
  • 其餘類--文件讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地操做系統相關的文件系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。

  主要的類以下:dom

  • File(文件特徵與管理):用於文件或者目錄的描述信息,例如生成新目錄,修改文件名,刪除文件,判斷文件所在路徑等。
  • InputStream(二進制格式操做):抽象類,基於字節的輸入操做,是全部輸入流的父類。定義了全部輸入流都具備的共同特徵。
  • OutputStream(二進制格式操做):抽象類。基於字節的輸出操做。是全部輸出流的父類。定義了全部輸出流都具備的共同特徵。
  • Reader(文件格式操做):抽象類,基於字符的輸入操做。
  • Writer(文件格式操做):抽象類,基於字符的輸出操做。
  • RandomAccessFile(隨機文件操做):一個獨立的類,直接繼承至Object.它的功能豐富,能夠從文件的任意位置進行存取(輸入輸出)操做

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

    

  Java流類的類結構圖:函數

    

2、字節流工具

2.1 輸入字節流 InputStream測試

  基本輸入字節流:spa

   裝飾輸入字節流:操作系統

   InputStream中的三個基本的讀方法線程

    • abstract int read() :讀取一個字節數據,並返回讀到的數據,若是返回-1,表示讀到了輸入流的末尾。
    • int  read(byte[] b) :將數據讀入一個字節數組,同時返回實際讀取的字節數。若是返回-1,表示讀到了輸入流的末尾。
    • int  read(byte[] b, int off, int len) :將數據讀入一個字節數組,同時返回實際讀取的字節數。若是返回-1,表示讀到了輸入流的末尾。off指定在數組b中存放數據的起始偏移位置;len指定讀取的最大字節數。

    流結束的判斷:方法read()的返回值爲-1時;readLine()的返回值爲null時。
  

  其它方法

    • long skip(long n):在輸入流中跳過n個字節,並返回實際跳過的字節數。
    • int available() :返回在不發生阻塞的狀況下,可讀取的字節數。
    • void close() :關閉輸入流,釋放和這個流相關的系統資源。
    • void mark(int readlimit) :在輸入流的當前位置放置一個標記,若是讀取的字節數多於readlimit設置的值,則流忽略這個標記。
    • void reset() :返回到上一個標記。
    • boolean markSupported() :測試當前流是否支持mark和reset方法。若是支持,返回true,不然返回false。
 2.2 輸出字節流 OutputStream

   基本輸出字節流:

  裝飾輸出字節流:

  OutputStream中的三個基本的讀方法

    • abstract void write(int b):往輸出流中寫入一個字節。
    • void write(byte[] b) :往輸出流中寫入數組b中的全部字節。
    • void write(byte[] b, int off, int len) :往輸出流中寫入數組b中從偏移量off開始的len個字節的數據。

  其它方法

    • void flush() :刷新輸出流,強制緩衝區中的輸出字節被寫出。
    • void close() :關閉輸出流,釋放和這個流相關的系統資源。

3、字符流  

 3.1 輸入字符流 Reader

   

  在上面的繼承關係圖中能夠看出:

    • Reader是全部的輸入字符流的父類,它是一個抽象類。
    • CharReader、StringReader是兩種基本的介質流,它們分別將Char數組、String中讀取數據。PipedReader是從與其它線程共用的管道中讀取數據。
    • BufferedReader很明顯就是一個裝飾器,它和其子類負責裝飾其它Reader對象。
    • FilterReader是全部自定義具體裝飾流的父類,其子類PushbackReader對Reader對象進行裝飾,會增長一個行號。
    • InputStreamReader是一個鏈接字節流和字符流的橋樑,它將字節流轉變爲字符流。FileReader能夠說是一個達到此功能、經常使用的工具類,在其源代碼中明顯使用了將FileInputStream轉變爲Reader的方法。咱們能夠從這個類中獲得必定的技巧。Reader中各個類的用途和使用方法基本和InputStream中的類使用一致。後面會有Reader與InputStream的對應關係。

   主要方法:

    • public int read() throws IOException; //讀取一個字符,返回值爲讀取的字符 
    • public int read(char cbuf[]) throws IOException; /*讀取一系列字符到數組cbuf[]中,返回值爲實際讀取的字符的數量*/ 
    • public abstract int read(char cbuf[],int off,int len) throws IOException; /*讀取len個字符,從數組cbuf[]的下標off處開始存放,返回值爲實際讀取的字符數量,該方法必須由子類實現*/ 

  3.2 輸出字符流 Writer

   

  在上面的關係圖中能夠看出:

    • Writer是全部的輸出字符流的父類,它是一個抽象類。
    • CharArrayWriter、StringWriter是兩種基本的介質流,它們分別向Char數組、String中寫入數據。PipedWriter是向與其它線程共用的管道中寫入數據,
    • BufferedWriter是一個裝飾器爲Writer提供緩衝功能。
    • PrintWriter和PrintStream極其相似,功能和使用也很是類似。
    • OutputStreamWriter是OutputStream到Writer轉換的橋樑,它的子類FileWriter其實就是一個實現此功能的具體類(具體能夠研究一SourceCode)。功能和使用和OutputStream極其相似.

   主要方法:

    • public void write(int c) throws IOException; //將整型值c的低16位寫入輸出流
    • public void write(char cbuf[]) throws IOException; //將字符數組cbuf[]寫入輸出流
    • public abstract void write(char cbuf[],int off,int len) throws IOException; //將字符數組cbuf[]中的從索引爲off的位置處開始的len個字符寫入輸出流
    • public void write(String str) throws IOException; //將字符串str中的字符寫入輸出流
    • public void write(String str,int off,int len) throws IOException; //將字符串str 中從索引off開始處的len個字符寫入輸出流 

4、字符流和字節流的轉換

  OutputStreamWriter(OutStreamout):將字節流以字符流輸出。  字符到字節的橋樑

  InputStreamReader(InputStream in):將字節流以字符流輸入。  字節到字符的橋樑

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:/1.jpg")),"utf-8"));

5、非流式文件類--File類

   File類是對文件系統中文件以及文件夾進行封裝的對象,能夠經過對象的思想來操做文件和文件夾。File類保存文件或目錄的各類元數據信息,包括文件名、文件長度、最後修改時間、是否可讀、獲取當前文件的路徑名,判斷指定文件是否存在、得到當前目錄中的文件列表,建立、刪除文件和目錄等方法。 

  構造函數:

  • File (String   pathname)   
    • 例:File  f1=new File("FileTest1.txt"); //建立文件對象f1,f1所指的文件是在當前目錄下建立的FileTest1.txt
  • File (String  parent  ,  String child)
    • 例:File f2=new  File(「D:\\dir1","FileTest2.txt") ;//  注意:D:\\dir1目錄事先必須存在,不然異常
  • 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( ); 建立目錄

 6、RandomAccessFile類

  文件的分隔與合併,隨機訪問文件。

 

  1.    該對象只能操做文件,因此構造函數接收兩種類型的參數:a.字符串文件路徑;b.File對象。

 

  2.    該對象既能夠對文件進行讀操做,也能進行寫操做,在進行對象實例化時可指定操做模式(r,rw)

 1 public static void main(String[] args)
 2     {
 3         try
 4         {
 5             insert("d:/out.txt",5,"插入的內容");
 6         }
 7         catch (IOException e)
 8         {
 9             e.printStackTrace();
10         }
11     }
12     
13     private static void insert(String fileName,long pos,String content) throws IOException
14     {
15         //建立臨時空文件
16         File tempFile = File.createTempFile("temp",null);
17         //在虛擬機終止時,請求刪除此抽象路徑名錶示的文件或目錄
18         tempFile.deleteOnExit();
19         FileOutputStream fos = new FileOutputStream(tempFile);
20         
21         RandomAccessFile raf = new RandomAccessFile(fileName,"rw");
22         raf.seek(pos);
23         byte[] buffer = new byte[4];
24         int num = 0;
25         while(-1 != (num = raf.read(buffer)))
26         {
27             fos.write(buffer,0,num);
28         }
29         raf.seek(pos);
30         raf.write(content.getBytes());
31         FileInputStream fis = new FileInputStream(tempFile);
32         while(-1 != (num = fis.read(buffer)))
33         {
34             raf.write(buffer,0,num);
35         }
36     }
指定位置插入內容

7、System類對IO的支持

  針對一些頻繁的設備交互,Java語言系統預約了3個能夠直接使用的流對象,分別是:

   System.in(標準輸入),一般表明鍵盤輸入。其數據類型爲InputStream

   System.out(標準輸出):一般寫往顯示器。其數據類型爲PrintStream

   System.err(標準錯誤輸出):一般寫往顯示器。其數據類型爲PrintStream

相關文章
相關標籤/搜索