91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的IO流知識點有哪些

發布時間:2021-12-08 11:23:32 來源:億速云 閱讀:165 作者:iii 欄目:大數據

這篇文章主要介紹“Java的IO流知識點有哪些”,在日常操作中,相信很多人在Java的IO流知識點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java的IO流知識點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

分類一:按操作方式(類結構)

  • 字節流和字符流:

    • 字節流:以字節為單位,每次次讀入或讀出是8位數據。可以讀任何類型數據。

    • 字符流:以字符為單位,每次次讀入或讀出是16位數據。其只能讀取字符類型數據。

  • 輸出流和輸入流:

    • 輸出流:從內存讀出到文件。只能進行寫操作。

    • 輸入流:從文件讀入到內存。只能進行讀操作。

注意:這里的出和入,都是相對于系統內存而言的。
  • 節點流和處理流:

    • 節點流:直接與數據源相連,讀入或讀出。

    • 處理流:與節點流一塊使用,在節點流的基礎上,再套接一層,套接在節點流上的就是處理流。

為什么要有處理流?直接使用節點流,讀寫不方便,為了更快的讀寫文件,才有了處理流。

按操作方式分類結構圖:

根據以上分類,以及jdk的說明,我們可以畫出更詳細的類結構圖,如下:

Java的IO流知識點有哪些

分類說明

  • 1. 輸入字節流InputStream
    輸入字節流的繼承圖可見上圖,可以看出:

    • FileInputStream: 是三種基本的介質流,它們分別從Byte 數組、StringBuffer、和本地文件中讀取數據。

    • ByteArrayInputStream:

    • PipedInputStream: 是從與其它線程共用的管道中讀取數據。PipedInputStream的一個實例要和PipedOutputStream的一個實例共同使用,共同完成管道的讀取寫入操作。主要用于線程操作。

    • ObjectInputStream 和所有FilterInputStream 的子類都是裝飾流(裝飾器模式的主角)

  • 2. 輸出字節流OutputStream:
    輸出字節流的繼承圖可見上圖,可以看出:

    • FIleOutputStream:是兩種基本的介質流

    • ByteArrayOutputStream: 是兩種基本的介質流,它們分別向Byte 數組、和本地文件中寫入數據。

    • PipedOutputStream:是向與其它線程共用的管道中寫入數據。

    • ObjectOutputStream 和所有FilterOutputStream 的子類都是裝飾流。

字節流的輸入和輸出對照圖:

Java的IO流知識點有哪些

  • 3. 字符輸入流Reader:
    在上面的繼承關系圖中可以看出:

    • FileReader:

    • PipedReader:是從與其它線程共用的管道中讀取數據

    • CharArrayReader:

    • CharReader、StringReader 是兩種基本的介質流,它們分別將Char 數組、String中讀取數據。

    • BufferedReader 很明顯就是一個裝飾器,它和其子類負責裝飾其它Reader 對象。

    • FilterReader 是所有自定義具體裝飾流的父類,其子類PushbackReader 對Reader 對象進行裝飾,會增加一個行號。

    • InputStreamReader: 是一個連接字節流和字符流的橋梁,它將字節流轉變為字符流。FileReader 可以說是一個達到此功能、常用的工具類,在其源代碼中明顯使用了將FileInputStream 轉變為Reader 的方法。我們可以從這個類中得到一定的技巧。Reader 中各個類的用途和使用方法基本和InputStream 中的類使用一致。后面會有Reader 與InputStream 的對應關系。

  • 4. 字符輸出流Writer:
    在上面的關系圖中可以看出:

    • FileWriter:

    • PipedWriter:是向與其它線程共用的管道中寫入數據

    • CharArrayWriter:

    • CharArrayWriter、StringWriter 是兩種基本的介質流,它們分別向Char 數組、String 中寫入數據。

    • BufferedWriter 是一個裝飾器,為Writer 提供緩沖功能。

    • PrintWriter 和PrintStream 極其類似,功能和使用也非常相似。

    • OutputStreamWriter: 是OutputStream 到Writer 轉換的橋梁,它的子類FileWriter 其實就是一個實現此功能的具體類(具體可以研究一SourceCode)。功能和使用和OutputStream 極其類似,后面會有它們的對應圖。

字符流的輸入和輸出對照圖:

Java的IO流知識點有哪些

  • 5. 字符流與字節流轉換

    • 轉換流的特點:

  1. 其是字符流和字節流之間的橋梁;

  2. 可對讀取到的字節數據經過指定編碼轉換成字符;

  3. 可對讀取到的字符數據經過指定編碼轉換成字節;

  • 何時使用轉換流?

  1. 當字節和字符之間有轉換動作時;

  2. 流操作的數據需要編碼或解碼時。

  • 具體的實現:

InputStreamReader:輸入流轉到讀流;

String fileName= "d:"+File.separator+"hello.txt";
File file=new File(fileName);
Writer out=new OutputStreamWriter(new FileOutputStream(file));
out.write("hello");
out.close();

OutputStreamWriter:輸出流轉到寫流;

String fileName= "d:"+File.separator+"hello.txt";
File file=new File(fileName);
Reader read=new InputStreamReader(new FileInputStream(file));
char[] b=new char[100];
int len=read.read(b);
System.out.println(new String(b,0,len));
read.close();
這兩個流對象是字符體系中的成員,它們有轉換作用,本身又是字符流,所以在構造的時候需要傳入字節流對象進來。

分類二:按操作對象

按操作對象分類結構圖:

Java的IO流知識點有哪些

分類說明:

  • 對文件進行操作(節點流):

    • FileInputStream(字節輸入流),

    • FileOutputStream(字節輸出流),

    • FileReader(字符輸入流),

    • FileWriter(字符輸出流)

  • 對管道進行操作(節點流):

    • PipedInputStream(字節輸入流),

    • PipedOutStream(字節輸出流),

    • PipedReader(字符輸入流),

    • PipedWriter(字符輸出流)。
      PipedInputStream的一個實例要和PipedOutputStream的一個實例共同使用,共同完成管道的讀取寫入操作。主要用于線程操作。

  • 字節/字符數組流(節點流):

    • ByteArrayInputStream,

    • ByteArrayOutputStream,

    • CharArrayReader,

    • CharArrayWriter;
      是在內存中開辟了一個字節或字符數組。

除了上述三種是節點流,其他都是處理流,需要跟節點流配合使用。
  • Buffered緩沖流(處理流):

    • BufferedInputStream,

    • BufferedOutputStream,

    • BufferedReader,

    • BufferedWriter,
      是帶緩沖區的處理流,緩沖區的作用的主要目的是:避免每次和硬盤打交道,提高數據訪問的效率。

  • 轉化流(處理流):

    • InputStreamReader:把字節轉化成字符;

    • OutputStreamWriter:把字節轉化成字符。

  • 基本類型數據流(處理流):用于操作基本數據類型值。

    • DataInputStream,

    • DataOutputStream。
      因為平時若是我們輸出一個8個字節的long類型或4個字節的float類型,那怎么辦呢?可以一個字節一個字節輸出,也可以把轉換成字符串輸出,但是這樣轉換費時間,若是直接輸出該多好啊,因此這個數據流就解決了我們輸出數據類型的困難。數據流可以直接輸出float類型或long類型,提高了數據讀寫的效率。

  • 打印流(處理流):

    • PrintStream,

    • PrintWriter,
      一般是打印到控制臺,可以進行控制打印的地方。

  • 對象流(處理流):

    • ObjectInputStream,對象反序列化;

    • ObjectOutputStream,對象序列化;
      把封裝的對象直接輸出,而不是一個個在轉換成字符串再輸出。

  • 合并流(處理流):

    • SequenceInputStream:可以認為是一個工具類,將兩個或者多個輸入流當成一個輸入流依次讀取。

典型使用案例

  • 1. 復制文件:

/**
 * 復制文件:一邊讀,一邊寫
 */
class hello {
    public static void main(String[] args) throws IOException {
        if (args.length != 2) {
            System.out.println("命令行參數輸入有誤,請檢查");
            System.exit(1);
        }
        File file1 = new File(args[0]);
        File file2 = new File(args[1]);

        if (!file1.exists()) {
            System.out.println("被復制的文件不存在");
            System.exit(1);
        }
        InputStream input = new FileInputStream(file1);
        OutputStream output = new FileOutputStream(file2);
        if ((input != null) && (output != null)) {
            int temp = 0;
            while ((temp = input.read()) != (-1)) {
                output.write(temp);
            }
        }
        input.close();
        output.close();
    }
}
  • 說明:

    • 流在使用結束后,一定要執行關閉操作,即調用close( )方法。

    • FileInputStream.read():
      這個方法是對這個流一個一個字節的讀,返回的結果就是這個字節的int表示方式;
      當已經沒有內容時,返回的結果為-1;

    • FileOutputStream.write():
      將內容寫到文件。

  • 2. 不使用FIle,將流中的字符轉換大寫小:

 public static void main(String[] args) throws IOException {
        String str = "ROLLENHOLT";
        ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes());
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        int temp = 0;
        while ((temp = input.read()) != -1) {
            char ch = (char) temp;
            output.write(Character.toLowerCase(ch));
        }
        String outStr = output.toString();
        input.close();
        output.close();
        System.out.println(outStr);
    }
  • 說明:

    • 流在使用結束后,一定要執行關閉操作,即調用close( )方法。

  • 3. 使用管道流在多個線程間通信

/**
 * 消息發送類
 * */
class Send implements Runnable {
    private PipedOutputStream out = null;

    public Send() {
        out = new PipedOutputStream();
    }

    public PipedOutputStream getOut() {
        return this.out;
    }

    public void run() {
        String message = "hello , Rollen";
        try {
            out.write(message.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * 接受消息類
 */
class Recive implements Runnable {
    private PipedInputStream input = null;

    public Recive() {
        this.input = new PipedInputStream();
    }

    public PipedInputStream getInput() {
        return this.input;
    }

    public void run() {
        byte[] b = new byte[1000];
        int len = 0;
        try {
            len = this.input.read(b);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            input.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("接受的內容為 " + (new String(b, 0, len)));
    }
}

/**
 * 測試類
 */
class hello {
    public static void main(String[] args) throws IOException {
        Send send = new Send();
        Recive recive = new Recive();
        try {
            //管道連接
            send.getOut().connect(recive.getInput());
        } catch (Exception e) {
            e.printStackTrace();
        }
        new Thread(send).start();
        new Thread(recive).start();
    }
}
  • 4. 使用緩沖區從鍵盤上讀入內容:

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

        BufferedReader buf = new BufferedReader(
                new InputStreamReader(System.in));
        String str = null;
        System.out.println("請輸入內容");
        try{
            str = buf.readLine();
        }catch(IOException e){
            e.printStackTrace();
        }
        System.out.println("你輸入的內容是:" + str);
    }
  • 5. 將系統輸出定向到文件:

public static void main(String[] args) throws IOException {
    File file = new File("/Users/liuluming/Documents/hello.txt");
    // 此刻直接輸出到屏幕
    System.out.println("hello");
    try {
        System.setOut(new PrintStream(new FileOutputStream(file)));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    System.out.println("這些內容在文件中才能看到哦!");
}

其他類:File

File類是對文件系統中文件以及文件夾進行封裝的對象,可以通過對象的思想來操作文件和文件夾。 File類保存文件或目錄的各種元數據信息,包括文件名、文件長度、最后修改時間、是否可讀、獲取當前文件的路徑名,判斷指定文件是否存在、獲得當前目錄中的文件列表,創建、刪除文件和目錄等方法。

其他類:RandomAccessFile

該對象并不是流體系中的一員,其封裝了字節流,同時還封裝了一個緩沖區(字符數組),通過內部的指針來操作字符數組中的數據。 該對象特點:

  1. 該對象只能操作文件,所以構造函數接收兩種類型的參數:a.字符串文件路徑;b.File對象。

  2. 該對象既可以對文件進行讀操作,也能進行寫操作,在進行對象實例化時可指定操作模式(r,rw)。

注意:
該對象在實例化時,如果要操作的文件不存在,會自動創建;如果文件存在,寫數據未指定位置,會從頭開始寫,即覆蓋原有的內容。 可以用于多線程下載或多個線程同時寫數據到文件

到此,關于“Java的IO流知識點有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长宁县| 额尔古纳市| 昭平县| 黑河市| 梁山县| 安化县| 巴彦淖尔市| 阿拉善右旗| 肇源县| 临夏市| 平武县| 凌源市| 措勤县| 安图县| 博白县| 石泉县| 山东| 岢岚县| 连城县| 兴文县| 阿瓦提县| 垫江县| 南郑县| 改则县| 大埔县| 剑河县| 江永县| 平潭县| 怀仁县| 米泉市| 兴仁县| 长泰县| 文水县| 鹤庆县| 连江县| 大荔县| 平江县| 内丘县| 雷州市| 巴林右旗| 来宾市|