Java IO

分類一:按操做方式(類結構)

字節流和字符流:數組

  • 字節流:以字節爲單位,每次次讀入或讀出是8位數據。能夠讀任何類型數據。多線程

  • 字符流:以字符爲單位,每次次讀入或讀出是16位數據。其只能讀取字符類型數據。dom

輸出流和輸入流:函數

  • 輸出流:從內存讀出到文件。只能進行寫操做。工具

  • 輸入流:從文件讀入到內存。只能進行讀操做。編碼

節點流和處理流:spa

  • 節點流:直接與數據源相連,讀入或讀出。線程

  • 處理流:與節點流一塊使用,在節點流的基礎上,再套接一層,套接在節點流上的就是處理流。指針

爲何要有處理流?直接使用節點流,讀寫不方便,爲了更快的讀寫文件,纔有了處理流。code

clipboard.png

輸入字節流InputStream:

  • 三種基本的節點流:FileInputStream、ByteArrayInputStream、PipedInputStream

  • 四個處理流:ObjectInputStream 和全部FilterInputStream 的子類DataInputStreamBufferedInputStream、SequenceInputStream

輸出字節流OutputStream:

  • 同上

字節流的輸入和輸出對照圖:

clipboard.png

字符輸入流Reader:

  • CharArrayReaderStringReader 是兩種基本的介質流,它們分別將 Char 數組、String中讀取數據。

  • BufferedReader 很明顯就是一個裝飾器,它和其子類負責裝飾其它 Reader 對象。

  • PipedReader:是從與其它線程共用的管道中讀取數據

  • FilterReader 是全部自定義具體裝飾流的父類,其子類PushbackReader 對 Reader 對象進行裝飾,會增長一個行號。

  • InputStreamReader: 是一個鏈接字節流和字符流的橋樑,它將字節流轉變爲字符流。FileReader能夠說是一個達到此功能、經常使用的工具類,在其源代碼中明顯使用了將FileInputStream 轉變爲 Reader 的方法。咱們能夠從這個類中獲得必定的技巧。Reader 中各個類的用途和使用方法基本和 InputStream 中的類使用一致。

字符輸出流Writer

  • CharArrayWriter、StringWriter 是兩種基本的介質流,它們分別向 Char 數組、String 中寫入數據。

  • PipedWriter: 是向與其它線程共用的管道中寫入數據

  • BufferedWriter 是一個裝飾器,爲 Writer 提供緩衝功能。

  • PrintWriter 和 PrintStream 極其相似,功能和使用也很是類似。

  • OutputStreamWriter: 是OutputStream 到 Writer 轉換的橋樑,它的子類FileWriter,其實就是一個實現此功能的具體類,功能和使用和OutputStream極其相似

字符流的輸入和輸出對照圖
clipboard.png
..]

字符流與字節流轉換

轉換流的特色:

  • 字符流和字節流之間的橋樑

  • 可對讀取到的字節數據通過指定編碼轉換成字符

  • 可對讀取到的字符數據通過指定編碼轉換成字節

什麼時候使用轉換流?

  • 當字節和字符之間有轉換動做時

  • 流操做的數據須要編碼或解碼時

OutputStreamWriter:輸出流轉到寫流

String fileName= "hello.txt";

        try {
            Writer out=new OutputStreamWriter(
                    new FileOutputStream(
                            new File(fileName)));
            try {
                out.write("hello");
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                out.close();
            }
        }catch (IOException e){
            e.printStackTrace();
        }

InputStreamReader:輸入流轉到讀流

try {
            Reader read=new InputStreamReader(
                    new FileInputStream(new File(fileName)));
            try {
                BufferedReader reader = new BufferedReader(read);
                String s;
                while ((s = reader.readLine()) != null){
                    System.out.println(s);
                }
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                read.close();
            }
        }catch (IOException e){
            e.printStackTrace();
        }

這兩個流對象是字符體系中的成員,它們有轉換做用,自己又是字符流,因此在構造的時候須要傳入字節流對象進來。

分類二:按操做對象

clipboard.png

對文件進行操做(節點流):

  • FileInputStream(字節輸入流)

  • FileOutputStream(字節輸出流)

  • FileReader(字符輸入流)

  • FileWriter(字符輸出流)

對管道進行操做(節點流):

  • PipedInputStream(字節輸入流)

  • PipedOutStream(字節輸出流):PipedInputStream的一個實例要和PipedOutputStream的一個實例共同使用,共同完成管道的讀取寫入操做。主要用於線程操做。

  • PipedReader(字符輸入流)

  • PipedWriter(字符輸出流)

字節/字符數組流(節點流):

  • ByteArrayInputStream

  • ByteArrayOutputStream

  • CharArrayReader

  • CharArrayWriter

Buffered緩衝流(處理流):是帶緩衝區的處理流,緩衝區的做用的主要目的是:避免每次和硬盤打交道,提升數據訪問的效率。

  • BufferedInputStream

  • BufferedOutputStream

  • BufferedReader

  • BufferedWriter

轉化流(處理流):

  • InputStreamReader:把字節轉化成字符

  • OutputStreamWriter:把字節轉化成字符

基本類型數據流(處理流):用於操做基本數據類型值

  • DataInputStream

  • DataOutputStream。

由於平時如果咱們輸出一個8個字節的long類型或4個字節的float類型,那怎麼辦呢?能夠一個字節一個字節輸出,也能夠把轉換成字符串輸出,可是這樣轉換費時間,如果直接輸出該多好啊,所以這個數據流就解決了咱們輸出數據類型的困難。數據流能夠直接輸出float類型或long類型,提升了數據讀寫的效率。

打印流(處理流):通常是打印到控制檯,能夠進行控制打印的地方。

  • PrintStream

  • PrintWriter

對象流(處理流):把封裝的對象直接輸出,而不是一個個在轉換成字符串再輸出。

  • ObjectInputStream,對象反序列化

  • ObjectOutputStream,對象序列化

合併流(處理流):

  • SequenceInputStream:能夠認爲是一個工具類,將兩個或者多個輸入流當成一個輸入流依次讀取。

File

  • File類是對文件系統中文件以及文件夾進行封裝的對象,能夠經過對象的思想來操做文件和文件夾。

  • File類保存文件或目錄的各類元數據信息,包括文件名、文件長度、最後修改時間、是否可讀、獲取當前文件的路徑名,判斷指定文件是否存在、得到當前目錄中的文件列表,建立、刪除文件和目錄等方法。

RandomAccessFile

  • 該對象並非IO流體系中的一員,其封裝了字節流,同時還封裝了一個緩衝區(字符數組),經過內部的指針來操做字符數組中的數據。 該對象特色:

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

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

注意:

  • 該對象在實例化時,若是要操做的文件不存在,會自動建立;若是文件存在,寫數據未指定位置,會從頭開始寫,即覆蓋原有的內容。能夠用於多線程下載或多個線程同時寫數據到文件。

相關文章
相關標籤/搜索