1. 程式人生 > >java之IO

java之IO

buffer red 抽象 dom 輸出流 字符輸入 () rand write

? 版權聲明:本文為博主原創文章,轉載請註明出處

1.RandomAccessFile:訪問保存數據記錄的文件的

  1.1 創建對象時必須指定對文件的操作方式。r:只讀 rw:讀寫

  1.2 該對象讀取文件時存在一個指針,指向當前位置;因此程序可以跳到任何地方讀寫數據

  1.3 raf.getFilePointer():定位,獲取指針當前所在位置

  1.3 raf.seek(pos):跳轉,將指針移動到文件中的指定位置

2.字節流

  2.1 InputStream:抽象類,不能直接生成對象,它是所有字節輸入流的父類。輸入流主要用於讀操作。is.read()

  2.2 OutputStream:抽象類,不能直接生成對象,它是所有字節輸出流的父類。輸出流主要用於寫操作。os.writer()

  2.3 FileInputStream:用於讀取本地文件中的字節數據

  2.4 FileOutputStream:用於將字節數據寫入到文件中

/**
     * 通過字節數組拷貝文件
     *
     * @param srcFile
     *                  源文件
     * @param destFile
     *                  目標文件
     * @throws IOException
     */
    public static void copyFileByByteArray(String srcFile, String destFile) throws IOException {

        long startTime = System.currentTimeMillis();// 開始時間

        // 將文件以字節流的形式進行讀/寫操作
        FileInputStream fis = new FileInputStream(srcFile);
        FileOutputStream fos = new FileOutputStream(destFile);

        byte[] buff = new byte[1024];// 存放一次讀取的字節數據
        int b;// 一次性讀取的字節個數

        // 批量讀取數據
        while ((b = fis.read(buff, 0, buff.length)) != -1) {
            fos.write(buff, 0, b);// 批量寫入數據
        }

        // 關閉文件輸入/輸出流
        fis.close();
        fos.close();

        long endTime = System.currentTimeMillis();// 結束時間
        System.out.println("copFileByByteArray執行時間為:" + (endTime - startTime) + "ms");

    }

  2.5 BufferedInputStream:帶緩存區的輸入流,默認緩存區大小是8M,可減少訪問磁盤的次數,提高文件讀取性能

  2.6 BufferedOutputStream:帶緩存區的輸出流,可以提高文件寫入效率

/**
     * 通過字節數組緩存拷貝文件
     *
     * @param srcFile
     *                  源文件
     * @param destFile
     *                  目標文件
     * @throws IOException
     */
    public static void copyFileByByteArrayBuffer(String srcFile, String destFile) throws IOException {

        long startTime = System.currentTimeMillis();// 開始時間

        // 將文件以帶緩存區的字節流的形式進行讀/寫操作
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));

        byte[] buff = new byte[1024];// 定義緩存區
        int b;// 一次讀取的字節個數

        // 批量讀取字節數據並放入緩存區中
        while ((b = bis.read(buff, 0, buff.length)) != -1) {
            bos.write(buff, 0, b);// 批量將緩存區中的數據寫入
            bos.flush();// 刷新緩沖區
        }

        // 關閉帶緩存區的輸入/輸出流
        bos.close();
        bis.close();

        long endTime = System.currentTimeMillis();// 結束時間
        System.out.println("copFileByByteArrayBuffer執行時間為:" + (endTime - startTime) + "ms");

    }

3.字符流

  3.1 InputStreamReader:字節流與字符流之間的橋梁,將字節輸入流以指定的編碼格式轉換為字符輸入流

  3.2 OutputStreamWriter:字節流與字符流之間的橋梁,將字節輸出流以指定的編碼格式轉換為字符輸出流

/**
     * 通過字符流批量拷貝文件
     *
     * @param srcFile
     *                  源文件
     * @param destFile
     *                  目標文件
     * @throws IOException
     */
    public static void copyFileByIsrAndOsw(String srcFile, String destFile) throws IOException {

        long startTime = System.currentTimeMillis();// 開始時間

        // 創建文件輸入流
        FileInputStream fis = new FileInputStream(srcFile);
        // 將字節流以UTF-8的格式轉換為字符流
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        // 創建文件輸出流
        FileOutputStream fos = new FileOutputStream(destFile);
        // 將字節流以UTF-8的格式轉換為字符流
        OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

        char[] buff = new char[1024];
        int b;// 讀取的字符數據
        while ((b = isr.read(buff, 0, buff.length)) != -1) {// 批量讀取字符
            osw.write(buff, 0, b);// 輸出字符
        }

        // 關閉字符輸入流
        isr.close();
        // 關閉字符輸出流
        osw.close();
        // 關閉字節輸入流
        fis.close();
        // 關閉字節輸出流
        fos.close();

        long endTime = System.currentTimeMillis();// 結束時間
        System.out.println("copyFileByByteIsrAndOsw執行時間為:" + (endTime - startTime) + "ms");

    }

  3.4 FileReader:以字符流的形式讀取本地文件

  3.5 FileWriter:將字符流的形式將數據寫入到文件中

/**
     * 通過字符流批量拷貝文件
     *
     * @param srcFile
     *                  源文件
     * @param destFile
     *                  目標文件
     * @throws IOException
     */
    public static void copyFileByFrAndFw(String srcFile, String destFile) throws IOException {

        long startTime = System.currentTimeMillis();// 開始時間

        FileReader fr = new FileReader(srcFile);
        FileWriter fw = new FileWriter(destFile);

        char[] buff = new char[1024];
        int b;// 讀取的字符數據
        while ((b = fr.read(buff, 0, buff.length)) != -1) {// 批量讀取字符
            fw.write(buff, 0, b);// 輸出字符
        }

        // 關閉字符輸入流
        fw.close();
        // 關閉字符輸出流
        fr.close();

        long endTime = System.currentTimeMillis();// 結束時間
        System.out.println("copyFileByFrAndFw執行時間為:" + (endTime - startTime) + "ms");

    }

  3.6 BufferedReader:帶緩存區的字符輸入流

  3.7 BufferedWriter:帶緩存區的字符輸出流

/**
     * 通過字符流批量拷貝文件
     *
     * @param srcFile
     *                  源文件
     * @param destFile
     *                  目標文件
     * @throws IOException
     */
    public static void copyFileByBrAndBw(String srcFile, String destFile) throws IOException {

        long startTime = System.currentTimeMillis();// 開始時間

        BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(srcFile)));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(destFile)));

        String line;// 讀取的行數據
        while ((line = br.readLine()) != null) {// 批量讀取字符
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        // 關閉字符輸入流
        bw.close();
        // 關閉字符輸出流
        br.close();

        long endTime = System.currentTimeMillis();// 結束時間
        System.out.println("copyFileByBrAndBw執行時間為:" + (endTime - startTime) + "ms");

    }

  

參考:http://www.imooc.com/learn/123

java之IO