Java面試知識點(四十)I/O 基本概念

1.I/O 框架圖

在這裏插入圖片描述

2.比特Bit、字節Byte、字符Char

  • Bit 最小的二進制單位 ,是計算機的操作部分 取值 0 或者 1
  • Byte 是計算機操作數據的最小單位由 8 位 bit 組成 取值(-128-127)
  • Char 是用戶的可讀寫的最小單位,在 Java 裏面由 16 位 bit 組成 取值(0-65535)

3.java中流的種類

  • 字符流和字節流。

所有的字節流都繼承自 inputStream 和 OutputStream,

所有的字符流繼承自 Reader 和 Writer。

  • 節點流和處理流

節點流:直接與數據源相連,用於輸入或者輸出

處理流:在節點流的基礎上對之進行加工,進行一些功能的擴展

4.字符流和字節流的區別

  • 要把一片二進制數據數據逐一輸出到某個設備中,或者從某個設備中逐一讀取一片二進制數據,不管輸入輸出設備是什麼,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名爲 IO 流,對應的抽象類爲 OutputStream 和 InputStream ,不同的實現類就代表不同的輸入和輸出設備,它們都是針對字節進行操作的。

  • 在應用中,經常要完全是字符的一段文本輸出去或讀進來,用字節流可以嗎?
    計算機中的一切最終都是二進制的字節形式存在。對於 “中國” 這些字符,首先要得到其對應的字節,然後將字節寫入到輸出流。讀取時,首先讀到的是字節,可是我們要把它顯示爲字符,我們需要將字節轉換成字符。由於這樣的需求很廣泛,人家專門提供了字符流的包裝類。

  • 底層設備永遠只接受字節數據,有時候要寫字符串到底層設備,需要將字符串轉成字節再進行寫入。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備,這爲我們向 IO 設別寫入或讀取字符串提供了一點點方便。

5.常用流的應用場景

  • 對字節流進行大量的從硬盤讀取
    使用BufferedInputStream
    使用緩衝流能夠減少對硬盤的損傷

  • 打印出不同類型的數據到數據源
    Printwriter 可以打印各種數據類型
    也就是常用的System.out.println()

  • 把我們控制檯的輸出改成輸出到一個文件裏面
    SetOut(printWriter,printStream)重定向

  • 基本類型數據和字符串按順序輸出和輸入
    使用 DataInputStream DataOutputStream

  • 將字節流轉換爲字符流
    InputStreamReader 類是從字節流到字符流的橋接器:它使用指定的字符集讀取字節並將它們解碼爲字符。 它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的默認字符集。

6.寫入文件

public static void write() {

        File file = null;
        FileWriter fw = null;
        BufferedWriter bw = null;
        String content = "溫柔的及時雨";

        try {
            // 打開文件
            String path = "C:\\D\\test.txt";
            file = new File(path);
            if (!file.exists()) {
                file.createNewFile();
            }

            // 寫入文件
            fw = new FileWriter(file);
            bw = new BufferedWriter(fw);
            bw.write(content);
            bw.flush();

            fw.close();
            bw.close();
        } catch (Exception e) {

        }
    }

這裏需要注意的是,在使用緩衝流的時候,需要調用flush方法,把緩衝流中的內容刷新到文件中,如果不使用,就無法正常寫入文件

7.遞歸讀取文件夾

public static void read(String path) {
        if (path == null) {
            return;
        }

        File [] files = new File(path).listFiles();

        if (files == null) {
            return;
        }

        for (File file : files) {
            if (file.isFile()) {
                System.out.println("file name: " + file.getName());
            } else if (file.isDirectory()) {
                System.out.println("directory name: " + file.getName());
                read(file.getPath());
            } else {
                System.out.println("error");
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章