1. 程式人生 > >Java io流 之FileOutputStream與FileInputStream 詳解

Java io流 之FileOutputStream與FileInputStream 詳解

FileOutputStream

檔案輸出流

方法程式碼詳解:

public class Demo01 {
    public static void main(String[] args)  {
//      fun1();
//      fun2();
        /*
         * 異常處理
         * io 發生異常 都需要停止程式 修改程式碼
         */
        File file = new File("/Users/james/Desktop/level/123.txt");
        // 增加作用域
        FileOutputStream oStream  = null
; try { // 建立一個流 // 只要手動建立的流 就需要手動關閉 oStream = new FileOutputStream(file); oStream.write("Hello".getBytes()); } catch (FileNotFoundException e) { // 丟擲執行時異常(直接停止程式) throw new RuntimeException("檔案找不到"); } catch (IOException e) { // 檔案編寫失敗
throw new RuntimeException("檔案無法編寫"); }finally { try { // 非空判斷 // 如果是空的 說明 流建立失敗 就不需要關閉 if (oStream != null) { oStream.close(); } } catch (IOException e) { // 關閉資源失敗 停止程式
throw new RuntimeException("流無法關閉"); } } } /** * @throws FileNotFoundException * @throws IOException * 檔案的續寫 和 換行 */ public static void fun2() throws FileNotFoundException, IOException { File file = new File("/Users/james/Desktop/level/123.txt"); FileOutputStream oStream = new FileOutputStream(file, true); oStream.write("Hello\n".getBytes()); oStream.close(); } /** * @throws FileNotFoundException * @throws IOException */ public static void fun1() throws FileNotFoundException, IOException { /* * 構造方法需要檔案(被寫入的檔案) 和 檔案的路徑(被寫入的路徑) * 寫入檔案流程 * 1. 繫結要寫入的檔案 或 檔案路徑 * 2. 使用write方法 直接寫入 * 3. 關閉資源 * */ // 繫結資料的目的地(繫結要寫入的檔案) // 該路徑下 沒有該檔案 會幫你創建出這個檔案 // 如果有該檔案 檔案會被覆蓋 File file = new File("/Users/james/Desktop/level/123.txt"); FileOutputStream oStream = new FileOutputStream(file); // 按ascii 表的值輸入的 oStream.write(97); byte[] b = {90,100,110}; oStream.write(b); oStream.write(b, 1, 2); // 簡單寫法 oStream.write("hello".getBytes()); oStream.close(); } }

FileInputStream

從檔案系統中的某個檔案中獲得輸入位元組

方法程式碼示例:

/*
 * 位元組輸入流
 * inputStream 所有輸入流的父類
 * 注意: 位元組流 寫入的時候 是一個位元組一個位元組的寫 讀取是一個位元組一個位元組的讀
 * 
 * 讀取檔案流程
 * 1.繫結資料來源檔案(要讀哪個檔案)
 * 2.使用read方法讀
 * 3.關閉資源
 */
public class Demo01 {
    public static void main(String[] args) throws IOException {
        File file = new File("/Users/james/Desktop/level/134.txt");
        FileInputStream iStream = new FileInputStream(file);
//      fun1(iStream);
//      fun2(iStream);
        int length = (int) file.length();
        byte[] bs = new byte[length];
        while ((iStream.read(bs)) != -1) {
            for (byte b : bs) {
                System.out.println(b);
            }
        }   
        iStream.close();
    }

    /**
     * @param iStream
     * @throws IOException
     */
    public static void fun2(FileInputStream iStream) throws IOException {
        // 迴圈讀取
        // read 方法 每呼叫一次就 讀取一個位元組
        // 迴圈的時候 read方法只能出現一次
        // 宣告一個變數儲存 讀出來的結果
        int read = 0;
        while ((read = iStream.read())!= -1 ) {
            System.out.println(read);
        }
    }
}

輸入輸出流例題應用:

/*
 * 使用位元組的輸入輸出流進行檔案的複製
 * (位元組流不但可以寫文字 還可以寫圖片 音訊 視訊)
 */

public class Demo01 {
    public static void main(String[] args) {
        // 獲取系統時間
        long start = System.currentTimeMillis();
        // 異常處理 複製檔案
        // 讀
        FileInputStream fis = null;
        // 寫
        FileOutputStream fos = null;
        try {
        // 複製圖片
            fis = new FileInputStream("/Users/james/Desktop/level/圖1.jpg");
            fos = new FileOutputStream("/Users/james/Desktop/圖2.jpg");

            // 利用緩衝陣列讀寫 效率較高!

            // 開始讀 讀一個位元組 寫一個位元組
//          int len = 0;
//          while ((len = fis.read()) != -1) {
//              // 直接把讀出來的寫進檔案
//              fos.write(len);
//          }
            // 用位元組陣列方式讀寫
            byte[] bs = new byte[1024];
            int len = 0;
            while ((len = fis.read(bs)) != -1) {
                fos.write(bs, 0, len);
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException("檔案找不到!");
        } catch (IOException e) {
            throw new RuntimeException("檔案複製失敗");
        }finally {
            // 這時讀寫都完事 可以不用順序關閉
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                throw new RuntimeException("關閉資源失敗");
            }finally {
                // 寫在一起 如果第一個報異常 第二個流 無法關閉
                try {
                    if (fos != null) {
                        fos.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException("關閉資源失敗");
                }
            }
        }
        long stop = System.currentTimeMillis();
        System.out.println(stop - start);
    }
}

複製一個資料夾裡的所有txt到另一個檔案內

public class Demo03 {
    public static void main(String[] args) throws IOException {

        File oldfile = new File("/Users/james/Desktop/level");
        File newfile = new File("/Users/james/Desktop/xTest");
        copyFileTxt(oldfile, newfile);
    }

    public static void copyFileTxt(File src, File dest) throws IOException {
        File[] listFiles = src.listFiles(new FileTxt());
        for (File file : listFiles) {
            if (file.isFile()) {
                // 讀寫
                FileInputStream fis = new FileInputStream(file);
                File tempFile = new File(dest, file.getName());
                FileOutputStream fos = new FileOutputStream(tempFile);

                int len = 0;
                byte[] b = new byte[1024];
                while ((len = fis.read(b)) != -1) {
                    fos.write(b, 0, len);
                }
                fis.close();
                fos.close();

            }else {
                copyFileTxt(file, dest);
            }
        }
    }

}

class FileTxt implements FileFilter{

    @Override
    public boolean accept(File pathname) {
        // 檔案不被過濾
        if (pathname.isDirectory()) {
            return true;
        }
        // 過濾不是txt的
        String name = pathname.getName();
        return name.endsWith("txt");    
    }   
}