java基礎的文件流操做

1、概念 在Java中,文件的輸入和輸出是經過流(Stream)來實現的。一個流,必有源端和目的端,它們能夠是計算機內存的某些區域,也能夠是磁盤文件,甚至能夠是 Internet 上的某個 URL。對於流而言,咱們不用關心數據是如何傳輸的,只須要向源端輸入數據,從目的端獲取數據便可。設計模式

流按照處理數據的單位,能夠分爲字節流和字符流。字節流的處理單位是字節,一般用來處理二進制文件,例如音樂、圖片文件等。而字符流的處理單位是字符,由於Java採用Unicode編碼,Java字符流處理的即爲Unicode字符,因此在操做漢字、國際化等方面,字符流具備優點。 回到頂部 2、字節流 全部的字節流類都繼承自InputStream 和 OutputStream 這兩個抽象類,下面列舉了5個輸入字節流類,輸出字節流類和輸入字節流類存在對應關係,這個就不一一列舉了。數組

FileInputStream:把一個文件做爲輸入源,從本地文件系統中讀取數據字節,實現對文件的讀取操做。 ByteArrayInputStream:把內存中的一個緩衝區做爲輸入源,從內存數組中讀取數據字節。 ObjectInputStream:對之前使用過ObjectOuputStream寫入的基本數據和對象進行反序列化,用於恢復那些之前序列化的對象,注意這個對象所屬的類必須實現Serializable接口。 PipeInputStream:實現了管道的概念,從線程通道中讀取線程字節。主要在線程中使用,用於兩個線程間通訊。 SequenceInputStream:表示其餘輸入流的邏輯串聯。它從輸入流的有序集合開始,並從第一個輸入流開始讀取,直到到達文件末尾,接着從第二個輸入流讀取,依次類推,直到到達包含的最後一個輸入流的文件末尾爲止。 System.in:從用戶控制檯讀取數據字節,在System類中,in是 InputStream 類的靜態導入。緩存

public static void main(String[] args) {
    InputStream in = null;
    OutputStream out = null;

    try {
        //獲得輸入流
        in = new FileInputStream("E:\\test\\a.txt");
        //獲得輸出流
        File file = new File("E:\\test\\b.txt");
        if (!file.exists()) {
            file.createNewFile();
        }
        out = new FileOutputStream(file, true);
        int i;//從輸入流讀取必定數量的字節,返回 0 到 255 範圍內的 int 型字節值
        while ((i = in.read()) != -1) {
            out.write(i);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3、字符流 全部的字符流類都繼承自Reader 和 Writer 這兩個抽象類,其中Reader是用於讀取字符流的抽象類,Writer是用於寫入字符流的抽象類。網絡

Reader 和 Writer 要解決的最主要問題是國際化。原先的 I/O 類庫只支持8位的字節流,所以不能很好的處理16位的Unicode字符。Unicode 是國際化的字符集,這樣增長了Reader 和 Writer以後,就能夠自動在本地字符集和Unicode國際化字符集之間進行轉換。ide

FileReader:與FileInputStream對應,從文件系統中讀取字符序列。 CharArrayReader:與ByteArrayInputStream 對應,從字符數組中讀取數據。 PipedReader:與PipedInputStream 對應,從線程管道中讀取字符序列。 StringReader:從字符串中讀取字符序列。性能

/**
 * 因爲是字符,存在編碼不一致致使亂碼的問題
 * [@param](https://my.oschina.net/u/2303379) args
 */
public static void main(String[] args) {
    Reader reader = null;
    Writer writer = null;

    try {
        //獲得輸入流
        reader = new FileReader("E:\\test\\a.txt");
        //獲得輸出流
        writer = new FileWriter("E:\\test\\c.txt", true);
        char[] chars = new char[50];
        int i;
        while ((i = reader.read(chars)) != -1) {
            writer.write(chars, 0, i);
            writer.flush();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (reader != null) {
                reader.close();
            }
            if (writer != null) {
                writer.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4、緩衝流 前面介紹的字節流、字符流都是無緩衝的輸入、輸出流,這就意味着,每一次的讀、寫操做都會交給操做系統來處理。這樣的作法可能會對系統的性能形成很大的影響,由於每一次操做均可能引發磁盤硬件的讀、寫或網絡的訪問。所以,對於字節流和字符流,通常不直接使用。編碼

緩存流是一種裝飾器類,目的是讓原字節流、字符流 新增緩衝的功能。以字符緩衝流爲例進行說明,字符緩衝流從字符流中讀取、寫入字符,不馬上要求系統進行處理,而是緩衝部分字符,從而實現按規定字符數、按行等方式高效的讀取或寫入。操作系統

字節緩衝流:.net

public static void main(String[] args) {
    BufferedInputStream in = null;
    BufferedOutputStream out = null;
    try {
        in = new BufferedInputStream(new FileInputStream("E:\\test\\a.txt"));
        out = new BufferedOutputStream(new FileOutputStream("E:\\test\\e.txt", true));
        byte[] b = new byte[1024];
        int i;
        // 並非每次都能讀到 1024 個字節,因此用 i 做爲每次數據讀取的長度,不然會出現文件損壞的錯誤
        while ((i = in.read(b)) != -1) {
            out.write(b, 0, i);
            out.flush();//手動刷新該流的緩衝,當即將他們寫入預期目標
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

字符緩衝流:線程

public static void main(String[] args) {
    BufferedReader bufferedReader = null;
    BufferedWriter bufferedWriter = null;
    try {
        //設置文件編碼,解決文件亂碼問題
        //將字節流轉換爲字符流,實際上使用了一種設計模式——適配器模式
        InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\test\\a.txt"), "GBK");
        bufferedReader = new BufferedReader(isr);
        bufferedWriter = new BufferedWriter(new FileWriter("E:\\test\\d.txt"));
        String s;
        while ((s = bufferedReader.readLine()) != null) {
            bufferedWriter.write(s);
            bufferedWriter.newLine();//按行讀取,寫入一個分行符,不然全部內容都在一行顯示
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
            if (bufferedWriter != null) {
                bufferedWriter.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
相關文章
相關標籤/搜索