Java學習經驗與總結(10)——IO流

一 IO流概述及其分類

1 io流的概述

流是一組有序的,有起點和終點的字節集合,是對數據傳輸的總稱和抽象。即數據在兩設備之間的傳輸稱爲流,流的本質是數據傳輸,根據數據傳輸的特性將流抽象爲各種類,方便進行更直觀的數據操作。
而io流,他是用來處理用來處理設備之間的數據傳輸,Java對數據的操作是通過流的方式,Java用於操作流的對象都在IO包中 java.io

2 io流的分類

根據處理數據類型的不同分爲字節流(可以讀寫任何類型的文件 比如音頻 視頻 文本文件)和字符流(只能讀取文本文件)。根據數據流向的不同分爲輸入流(讀入數據)和輸出流(寫出數據)。

二 字符流和字節流

字符流的由來:因爲數據編碼的不同,因而有了對字符進行高效操作的流對象,本質其實就是基於字節流讀取時,去查了指定的碼錶 字符流和字節流的區別: 讀寫單位不同:字節流以字節(8bit)爲單位,字符流以字符爲單位,根據碼錶映射字符,一次可能讀取多個字節。 處理對象不同:字節流能處理所有類型的數據(如圖片、.avi等),字符流只能處理純文本的數據。結論:如果處理純文本的數據優先考慮字符流,其他情況 用字節流。

三 輸入流和輸出流

對輸入流只能進行讀操作,對輸出流只能進行寫操作,程序中需要根據待傳輸數據的特性來選擇使用不同的流

四 java流操作相關的類和接口

類 說明

File 文件類

RandomAccessFile 隨機存取文件類

InputStream 字節輸入流

OutputStream 字節輸出流

Reader 字符輸入流

Writer 字符輸出流

五 io流對象

1.輸入字節流

InputStreamIo輸入字節流繼承圖見上圖可以看出:InputStream是所有輸入字節流的父類,是一個抽象類。ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三種基本的介質流,它們分別從Byte 數組、StringBuffer、和本地文件中讀取數據。PipedInputStream是從與其它線程共用的管道中讀取數據。ObjectInputStream 和所有FilterInputStream 的子類都是裝飾流(裝飾器模式的主角)。

2.輸出字節流

OutputStreamIO 中輸出字節流的繼承圖可見上圖,可以看出:OutputStream 是所有的輸出字節流的父類,它是一個抽象類。ByteArrayOutputStream、FileOutputStream 是兩種基本的介質流,它們分別向Byte 數組、和本地文件中寫入數據。PipedOutputStream 是向與其它線程共用的管道中寫入數據,ObjectOutputStream 和所有FilterOutputStream 的子類都是裝飾流。

六 常見的幾種io流

1 字符輸入流reader

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

2 字符輸出流Writer

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

七 字符流與字節流轉換

1 轉換流的特點:

其是字符流和字節流之間的橋樑可對讀取到的字節數據經過指定編碼轉換成字符可對讀取到的字符數據經過指定編碼轉換成字節何時使用轉換流?當字節和字符之間有轉換動作時;流操作的數據需要編碼或解碼時

2 具體的對象體現:

InputStreamReader:字節到字符的橋樑
OutputStreamWriter:字符到字節的橋樑這兩個流對象是字符體系中的成員,它們有轉換作用,本身又是字符流,所以在構造的時候需要傳入字節流對象進來。

八 一些案例演示

1 編寫程序,獲取指定目錄下 所有的.java結尾的文件, 打印出文件的絕對路徑(包含 子文件夾中的.java文件)

public class myjavademo {



    public static void main(String[] args) {

        File filePath = new File("D:\\javase1228");


        getFiles(filePath);
    }


    public static void getFiles(File filePath) {

        File[] files = filePath.listFiles();

        for (File file : files) {

            if (file.isDirectory()) {

                getFiles(file);

            } else {

                if (file.getName().endsWith(".java")) {

                    System.out.println(file.getAbsolutePath());
                }
            }
        }
    }

2 編寫程序,刪除 指定目錄下的 所有文件與文件夾 (包含子文件夾)

public  class myjavademo {


    File filePath = new File("D:\\resource");


    public static void getFiles(File filePath) {

        File[] files = filePath.listFiles();

        if (files != null) {

            for (File file : files) {

                if (file.isDirectory()) {

                    getFiles(file);
                } else {

                    System.out.println(file.getAbsolutePath() + "---" + file.delete());
                }
            }

            System.out.println(filePath.getAbsolutePath() + "---" + filePath.delete());
        }
    }

}

3 編寫程序,採用多種方式,把d:\video01.avi的內容複製到d:\video02.avi中

(1)基本字節流一次讀寫一個字節


public class demo {
    public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();

        method("D:\\video01.avi", "D:\\video02.avi");
        long end = System.currentTimeMillis();
        System.out.println("共耗時: "+ (end-start) +"毫秒");
    }

(2)基本字節流一次讀寫一個字節數組

         public static void method(String srcPath, String destPath) throws IOException {
        FileInputStream fis = new FileInputStream(srcPath);
        FileOutputStream fos = new FileOutputStream(destPath);
        int by = 0;
        while ((by = fis.read()) != -1) {
        fos.write(by);
        }
        fis.close();
        fos.close();
        }

(3) 高效字節流一次讀寫一個字節

public static void method2(String srcPath, String destPath) throws IOException {
        FileInputStream fis = new FileInputStream(srcPath);
        FileOutputStream fos = new FileOutputStream(destPath);

        byte[] buffer = new byte[1024];
        int len  = 0;
        while( (len=fis.read(buffer)) != -1){

        fos.write(buffer, 0, len);
        }
        fos.close();
        fis.close();
        }

(4) 高效字節流一次讀寫一個字節數組

public static void method4(String srcPath, String destPath) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcPath));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = bis.read(buffer)) != -1) {
        bos.write(buffer, 0, len);
        }
        bos.close();
        bis.close();
        }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章