JAVA之IO

一、概述

IO即輸入輸出系統。我在平時使用過程中,都是直接在網上覆制粘貼,沒有仔細梳理,導致現在使用自己寫有點磕磕巴巴,故此梳理一遍。
IO重點有5個類:File、OutputStream、InputStream、Writer、Reader,用於操作文件、寫入寫出數據。

二、模型

輸入流: 程序從輸入流讀取數據源。數據源包括外界(鍵盤、文件、網絡…),即是將數據源讀入到程序的通信通道
這裏寫圖片描述
輸出流: 程序向輸出流寫入數據。將程序中的數據輸出到外界(顯示器、打印機、文件、網絡…)的通信通道。
這裏寫圖片描述

三、常用

本篇不像以前研究源碼或寫出新的實現,甚至沒有寫出所有方法,只是梳理常用方法。
1.文件類file
以下是常用的幾個方法。

 static void testFile() throws Exception{
        File file = new File("D://input");
        file.exists();//判斷文件是否存在
        file.createNewFile();//新建一個文件
        file.mkdir();//創建文件夾
        file.mkdirs();//父文件夾不存在,自動新建路徑中所有需要的文件夾;若存在,直接新建子文件夾。
    }

2.字節輸入流
FileInputStream 將文件從本地讀取到內存中,字節讀取。
注意事項:

  1. 讀入時不能使用new String(bytes),而需要使用new String(bytes, 0, len)指定長度,因爲bytes是複用的,若在倒數第二次讀入1024字節,最後一次讀入500字節,最後一次會輸出額外字符(沒有覆蓋的倒數第二次的字節)。
  2. 關閉流。
    static final String INPUT_FILE_PATH = "D://input";
    public void testFileInputStream() {
        File file = new File(INPUT_FILE_PATH);
        if (!file.exists()) {
            throw new RuntimeException("文件不存在");
        }
        InputStream inputStream = null;
        int count = 1;
        try {
            inputStream = new FileInputStream(file);
            byte[] bytes = new byte[1];//設置一次讀入字節數
            int len = 0;
            while ((len = inputStream.read(bytes)) != -1) {
                System.out.println(count++ + "===============");
                //此處需要指定長度,因爲bytes是複用的,若在倒數第二次讀入1024字節,最後一次讀入500字節,最後一次會輸出額外字符
                System.out.println(new String(bytes, 0, len));
            }
        } catch (Exception e) {
            System.out.println("讀入數據時出現異常……");
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("關閉流失敗……");
            }
        }
    }

3.字節輸出流
FileOutputStream 將文件從內存寫入本地文件,字節輸出。
注意事項:

  1. FileOutputStream()構造器可傳兩個參數,第二個參數表示是否在文件後寫入(默認false)。false:覆蓋原先文件;true:在原文件後寫入。
  2. 關閉流。
static final String OUTPUT_FILE_PATH = "D://output";
  public void testFileOutputStream() {
        File file = new File(OUTPUT_FILE_PATH);
        OutputStream outputStream = null;
        try {
            //第二個參數表示是否在文件後寫入(默認false)。false:覆蓋原先文件;true:在原文件後寫入
            outputStream = new FileOutputStream(file, true);
            String w = "測試FileOutputStream寫出文件";
            outputStream.write(w.getBytes());
        } catch (Exception e) {
            System.out.println("寫出數據時出現異常……");
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("關閉流失敗……");
            }
        }
    }

4.字符輸入流
BufferedReader 將文件從本地讀取到內存中,字符輸出。
注意事項:

  1. InputStreamReader是轉換流,字節流與字符流的橋樑。
  2. 關閉流。
static final String INPUT_FILE_PATH = "D://input";
 public void testBufferedReader() {
        File file = new File(INPUT_FILE_PATH);
        if (!file.exists()) {
            throw new RuntimeException("文件不存在");
        }
        BufferedReader bufferedReader = null;
        int count = 1;
        try {
            //inputStreamReader 轉換流,字節流與字符流的橋樑
            bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
            String str = "";
            while ((str = bufferedReader.readLine()) != null) {
                System.out.println(count++ + "===========");
                System.out.println(str);
            }
        } catch (Exception e) {
            System.out.println("讀入數據時出現異常……");
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("關閉流失敗……");
            }
        }
    }

5.字符輸出流
BufferedWriter 將文件從內存寫入本地文件,字符輸出。
注意事項:

  1. outputStreamWriter是轉換流,字節流與字符流的橋樑。
  2. 在生成FileOutputStream對象時,也可傳入兩個參數,與FileOutputStream功能一致。
  3. 關閉流。
 static final String OUTPUT_FILE_PATH = "D://output";
public void testBufferedWriter() {
        File file = new File(OUTPUT_FILE_PATH);
        BufferedWriter bufferedWriter = null;
        try {
            // outputStreamWriter 轉換流,字節流與字符流的橋樑
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
            String[] ws = new String[]{"測試BufferedWriter寫出文件", "第2行", "第3行"};
            for (String s : ws) {
                bufferedWriter.write(s);
            }
        } catch (Exception e) {
            System.out.println("寫出數據時出現異常……");
        } finally {
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("關閉流失敗……");
            }
        }
    }

四、所有代碼

import java.io.*;

/**
 * Created by pengqiao01 on 2018/5/29.
 */
public class IO {
    static final String INPUT_FILE_PATH = "D://input";
    static final String OUTPUT_FILE_PATH = "D://output";

    public void testFileInputStream() {
        File file = new File(INPUT_FILE_PATH);
        if (!file.exists()) {
            throw new RuntimeException("文件不存在");
        }
        InputStream inputStream = null;
        int count = 1;
        try {
            inputStream = new FileInputStream(file);
            byte[] bytes = new byte[1];//設置一次讀入字節數
            int len = 0;
            while ((len = inputStream.read(bytes)) != -1) {
                System.out.println(count++ + "===============");
                //此處需要指定長度,因爲bytes是複用的,若在倒數第二次讀入1024字節,最後一次讀入500字節,最後一次會輸出額外字符
                System.out.println(new String(bytes, 0, len));
            }
        } catch (Exception e) {
            System.out.println("讀入數據時出現異常……");
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("關閉流失敗……");
            }
        }
    }

    public void testFileOutputStream() {
        File file = new File(OUTPUT_FILE_PATH);
        OutputStream outputStream = null;
        try {
            //第二個參數表示是否在文件後寫入(默認false)。false:覆蓋原先文件;true:在原文件後寫入
            outputStream = new FileOutputStream(file, true);
            String w = "測試FileOutputStream寫出文件";
            outputStream.write(w.getBytes());
        } catch (Exception e) {
            System.out.println("寫出數據時出現異常……");
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("關閉流失敗……");
            }
        }
    }

    public void testBufferedReader() {
        File file = new File(INPUT_FILE_PATH);
        if (!file.exists()) {
            throw new RuntimeException("文件不存在");
        }
        BufferedReader bufferedReader = null;
        int count = 1;
        try {
            //inputStreamReader 轉換流,字節流與字符流的橋樑
            bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
            String str = "";
            while ((str = bufferedReader.readLine()) != null) {
                System.out.println(count++ + "===========");
                System.out.println(str);
            }
        } catch (Exception e) {
            System.out.println("讀入數據時出現異常……");
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("關閉流失敗……");
            }
        }
    }

    public void testBufferedWriter() {
        File file = new File(OUTPUT_FILE_PATH);
        BufferedWriter bufferedWriter = null;
        try {
            // outputStreamWriter 轉換流,字節流與字符流的橋樑
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
            String[] ws = new String[]{"測試BufferedWriter寫出文件", "第2行", "第3行"};
            for (String s : ws) {
                bufferedWriter.write(s);
            }
        } catch (Exception e) {
            System.out.println("寫出數據時出現異常……");
        } finally {
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("關閉流失敗……");
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章