Java IO流之原理分類與節點流文件操作詳解

IO流簡介

I/O是Input/Output的縮寫, I/O技術是非常實用的技術,用於處理設備之間的數據傳輸。如讀/寫文件,網絡通訊等。

Java程序中,對於數據的輸入/輸出操作以“流(stream)” 的方式進行。

java.io包下提供瞭各種“流”類和接口,用以獲取不同種類的數據,並通過標準的方法輸入或輸出數據。

IO流原理

輸入input:讀取外部數據(磁盤、光盤等存儲設備的數據)到程序(內存)中。

輸出output:將程序(內存)數據輸出到磁盤、光盤等存儲設備中。

在這裡插入圖片描述

流的分類

①按操作數據單位不同分為:字節流(8 bit 一般用於非文本文件),字符流(16 bit 一般用於文本文件)

②按數據流的流向不同分為:輸入流,輸出流(相對的)

③按流的角色的不同分為:節點流(直接處理文件),處理流(處理被包含的流)

在這裡插入圖片描述

IO 流體系

Java的IO流共涉及40多個類,實際上非常規則,都是從如下4個抽象基類派生的。
由這四個類派生出來的子類名稱都是以其父類名作為子類名後綴。

在這裡插入圖片描述

在這裡插入圖片描述

節點流和處理流

節點流:直接從數據源或目的地讀寫數據

在這裡插入圖片描述

處理流:不直接連接到數據源或目的地,而是“連接”在已存在的流(節點流或處理流)之上,通過對數據的處理為程序提供更為強大的讀寫功能。

在這裡插入圖片描述

節點流操作

讀入以FileReader為例

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
 * @Author: Yeman
 * @Date: 2021-09-25-16:30
 * @Description:
 */
public class FileReaderTest {
    public static void main(String[] args) {
        FileReader fileReader = null;
        try { //一定需要try-catch
            //1、實例化File對象,指明要操作的文件
            File file = new File("IO\\hello.txt");
            //2、提供具體的流
            fileReader = new FileReader(file);
            //3、讀取操作
            int read = fileReader.read(); //空參為一位一位讀取,末尾返回-1
            while (read != -1){
                System.out.print((char) read);
                read = fileReader.read();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4、關閉流
            try {
                if (fileReader != null) { //確保不會因具體流未創建而產生空指針異常
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在這裡插入圖片描述

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
 * @Author: Yeman
 * @Date: 2021-09-25-16:30
 * @Description:
 */
public class FileReaderTest {
    public static void main(String[] args) {
        FileReader fileReader = null;
        try { //一定需要try-catch
            //1、實例化File對象,指明要操作的文件
            File file = new File("IO\\hello.txt");
            //2、提供具體的流
            fileReader = new FileReader(file);
            //3、讀取操作
            char[] chars = new char[5];
            //char型數組為參數,該數組相當於一個容器,把讀取放在裡面,返回該次讀取的個數,末尾返回-1
            // 最後若不夠,容器後部分仍為上一次取的,前部分則被新的這次取到的覆蓋瞭
            int length = fileReader.read(chars);
            while (length != -1){
                for (int i = 0; i < length; i++) {
                    System.out.print(chars[i]);
                }
                length = fileReader.read(chars);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4、關閉流
            try {
                if (fileReader != null) {
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

寫出以FileWriter為例

import java.io.*;

/**
 * @Author: Yeman
 * @Date: 2021-09-25-16:30
 * @Description:
 */
public class FileReaderTest {
    public static void main(String[] args) {
        FileWriter fw1 = null; //若硬盤中不存在file,創建之;若存在,內容覆蓋之
        try {
            //1、實例化File對象,指明要寫出的文件
            File file = new File("IO\\hi.txt");
            //2、創建具體的流
            fw1 = new FileWriter(file);
            //FileWriter fw2 = new FileWriter(file,false); //若硬盤中不存在file,創建之;若存在,內容覆蓋之
            //FileWriter fw3 = new FileWriter(file,true); //若硬盤中不存在file,創建之;若存在,內容追加之
            //3、寫出操作
            fw1.write("Hello World!\n",0,5); //寫出“Hello”
            fw1.write("你好,世界!"); //寫出“你好,世界!”
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4、關閉流
            try {
                if (fw1 != null) fw1.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

實現一個圖片復制(讀入寫出,使用字節流)

import java.io.*;

/**
 * @Author: Yeman
 * @Date: 2021-09-25-16:30
 * @Description:
 */
public class FileReaderTest {
    public static void main(String[] args) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            File inFile = new File("IO\\input.jpg");
            File outFile = new File("IO\\output.jpg");

            fis = new FileInputStream(inFile);
            fos = new FileOutputStream(outFile);

            byte[] bytes = new byte[1024]; //通常使用1024,2的10次方
            int length = fis.read(bytes);
            while (length != -1){
                fos.write(bytes,0,length);
                length = fis.read(bytes);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fis != null) fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

到此這篇關於Java IO流之原理分類與節點流文件操作詳解的文章就介紹到這瞭,更多相關Java IO流內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: