IO流基礎與字節流,字符流

IO流基礎

一、概念
數據的交換
程序與文件,數組,網絡資源,數據庫資源的數據傳輸與交換。
<br />
二、IO流的分類

  1. 流向:輸出流與輸入流(以程序為中心判斷)
  2. 數據:字節流:二進制,可以傳輸任何文件。
    字符流:文本文件,只能處理純文本
  3. 功能:節點:包裹源頭
    處理:增強功能,提高性能
    <br />

三、字符流與字節流(重點區分)

  1. 字節流
    輸入流:InputStream
    輸出流:OutputStream
  2. 字符流
    輸入流:Writer
    輸出流:Reader
    <br />

四、操作
1)、建立聯系
2)、選擇流
3)、操作 數組大小+read、write
4)、釋放資源

字節流基本操作之文件讀取,寫出,追加,拷貝

<br />
一、文件讀取

  1. 建立聯系:File對象
  2. 選擇流 文件輸入流:InputStream接口的實現類FileOutputStream
  3. 操作:byte[] car=new byte[數組大小]+read+讀取大小,輸出
  4. 關閉資源

示例程序

    public static void fileIn() {
        // 1.關聯文件
        File f = new File("F:/javaIotest/poetry.txt");
        // 2.選擇流
        InputStream is = null;// 提升作用域
        try {
            is = new FileInputStream(f);
            // 3.操作
            byte[] car = new byte[20];// 緩沖數組
            // 這里定義每次讀取的文件的長度,
            // 如果不定義的話,如果到最后長度不夠填滿數組,那么只會改變前面的部分,后面的還是上次讀取的內容
            // 輸出也沒辦法確定輸出到哪里結束
            int len = 0;
            while (-1 != (len = is.read(car))) {// is.read()方法會返回整形,表示本次讀取的長度
                // 每次只輸出本次讀取的字節,到最后就不會多輸出了
                String str = new String(car, 0, len);
                // 打印
                System.out.print(str);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件未找到");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("讀取文件失敗");
        } finally {
            // 4.關閉資源
            if (null != is)
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("關閉流失敗");
                }
        }
    }

<br />
二、文件寫出
<br />
操作同上
選擇流的FileInputStream 多一個參數,是表示追加還是覆蓋。false為覆蓋,true為追加。如果不寫該參數的話,默認為覆蓋的。
還有個要注意的,文件輸出需要使用flush()方法強制刷新一下。如果不刷新視頻里說是等輸出總線滿了,才會往外推。雖然在finally里關閉流的時候也會自動刷新,但是推薦養成使用這個方法的習慣。

public static void outFile() {
        File f = new File("F:/javaIotest/test01.txt");
        OutputStream os = null;
        try {
            // 選擇文件輸出流,構造器里,最后一個參數為追加或者覆蓋,false為覆蓋
            os = new FileOutputStream(f);
            String str = "Viking is very handsome ! Do you agry ?";
            // 字符串轉為字符數組
            byte[] b = str.getBytes();
            os.write(b, 0, b.length);

            os.flush();// 強制刷新,雖然在流關閉時也會,但推薦加一個這個
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件無法創建或者為目錄");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("文件寫入失敗");
        } finally {
            if (null != os)
                // 關閉資源
                try {
                os.close();
                } catch (IOException e) {
                e.printStackTrace();
                System.out.println("流關閉失敗");
                }
        }
    }

<br />
三、文件拷貝
<br />
建立聯系階段,源必須存在,且必須為文件。目的文件可以不存在,但也必須是文件。
示例程序

public static void fileCopy(File src, File dest) {

        InputStream is = null;
        OutputStream os = null;

        try {
            is = new FileInputStream(src);
            os = new FileOutputStream(dest);
            byte[] b = new byte[20];
            int len = 0;
            while (-1 != (len = is.read(b))) {
                os.write(b, 0, len);
            }
            os.flush();
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("文件讀取或寫出失敗");
            e.printStackTrace();
        } finally {
            try {
                os.close();
                is.close();
            } catch (IOException e) {
                System.out.println("流關閉失敗!");
                e.printStackTrace();
            }
        }
    }

<br />
四、文件夾的拷貝。
即利用listFiles方法獲取目錄下文件,如果是文件則拷貝,是目錄則遞歸調用。因為都是完全的拷貝。所以要注意新文件的關聯的建立。目錄則需要手動創建。文件可以自己建立。

示例程序

    public static void dirCopy(File src, File dest) {
        // 先判斷源是否是文件,如果再判斷目的,如果是目錄,就新建個同名的文件
        // 如果是文件直接拷貝。如果源是目錄則調用私有方法拷貝目錄。
        if (src.isDirectory()) {
            // 這里是在目的地下面新建個同名文件夾,即整個源一起拷貝進去
            File f = new File(dest, src.getName());
            dirCopyDetils(src, f);
        } else if (dest.isDirectory()) {
            File copyFile = new File(dest, src.getName());
            fileCopy(src, copyFile);
        } else {
            fileCopy(src, dest);
        }
    }

    private static void dirCopyDetils(File src, File dest) {
        // 建立文件夾
        if (!dest.exists())
            dest.mkdirs();
        File[] files = src.listFiles();
        // 遍歷源目錄下文件
        for (File temp : files) {
            // 如果是目錄,調用自身,拷貝到上層目錄下的同名文件夾
            if (temp.isDirectory()) {
                dirCopyDetils(temp, new File(dest, temp.getName()));
            } else {
                // 如果是文件,建立新的文件關聯,復制時自動創建文件
                File copyFile = new File(dest, temp.getName());
                fileCopy(temp, copyFile);
            }
        }
    }

<br />

字符流

<br />
字符流只能用于處理純文本。
操作與字節流類似
字符流的節點流:

  1. Reader 文件讀取(FileReader)
  2. Writer 文件寫出(FileWriter)

區別在于,用char數組來接收而不是用byte數組
寫出操作,write方法形參可以是字符數組也可以是字符串,還多個append方法表示追加。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容