最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解如何使用IO流實現(xiàn)文件數(shù)據(jù)的讀寫及文件復(fù)制

 更新時間:2025年10月09日 11:45:10   作者:68歲敲代碼老婆婆  
Java中的IO流是基礎(chǔ)操作之一,包括控制臺輸入、控制臺輸出、讀寫文件等,下面這篇文章主要介紹了如何使用IO流實現(xiàn)文件數(shù)據(jù)的讀寫及文件復(fù)制的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一. 什么是IO流?

IO流本質(zhì)上是 Java 中用于處理設(shè)備間數(shù)據(jù)傳輸的 API(不止限于文件,還包括網(wǎng)絡(luò)、內(nèi)存、鍵盤等),可以實現(xiàn)對文件數(shù)據(jù)的讀寫,區(qū)別于File類只能操作文件本身

  • 輸入流(Input):數(shù)據(jù)從外部設(shè)備(如文件、網(wǎng)絡(luò))進入程序(內(nèi)存);
  • 輸出流(Output):數(shù)據(jù)從程序(內(nèi)存)發(fā)送到外部設(shè)備。File 類僅能操作文件的 “元數(shù)據(jù)”(如創(chuàng)建、刪除、判斷存在性),而 IO 流負責(zé)文件內(nèi)容的讀寫,這是兩者的核心區(qū)別。

二. IO流的分類

1. 字節(jié)IO流:

以字節(jié)(8bit)為單位讀寫數(shù)據(jù),可處理所有類型文件(文本、圖片、視頻等)

輸入:FileInputStream()     對應(yīng)的緩沖流: BufferedInputStream() 

 輸出:FileOutputStream()   對應(yīng)的緩沖流: BufferedOutputStream() 

2.字符IO流:

以字符(16bit,Java 中char)為單位讀寫數(shù)據(jù),僅適合處理文本文件

輸入:FileReader()             對應(yīng)的緩沖流: BufferedReader() 

輸出:FileWriter()                對應(yīng)的緩沖流: BufferedWriter() 

注意:為什么要記對應(yīng)的緩沖流?

緩沖流(BufferedXXX)通過內(nèi)置8KB 緩沖區(qū)(字節(jié)緩沖流)或字符緩沖區(qū)(字符緩沖流),減少直接與磁盤的 IO 次數(shù)(磁盤 IO 效率遠低于內(nèi)存操作),從而提升性能。

  • 例如:讀取文件時,緩沖流會一次性從磁盤讀取 8KB 數(shù)據(jù)到緩沖區(qū),程序從緩沖區(qū)獲取數(shù)據(jù);寫入時先攢滿緩沖區(qū)再一次性寫入磁盤。

使用規(guī)范

處理流需 “包裹” 節(jié)點流,關(guān)閉時只需關(guān)閉外層處理流(會自動關(guān)閉內(nèi)層節(jié)點流):

// 示例:緩沖流包裹節(jié)點流
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        // 讀取數(shù)據(jù)
    }
} catch (IOException e) {
    e.printStackTrace();
}

其他重要補充

  • 流的繼承關(guān)系

    • 所有字節(jié)輸入流繼承InputStream,字節(jié)輸出流繼承OutputStream;
    • 所有字符輸入流繼承Reader,字符輸出流繼承Writer(這四個是抽象基類,不能直接實例化)。
  • 編碼問題:字符流涉及編碼轉(zhuǎn)換,FileReader/FileWriter默認使用系統(tǒng)編碼(可能導(dǎo)致亂碼),建議用InputStreamReader/OutputStreamWriter指定編碼:

    // 指定UTF-8編碼讀取文本
    Reader reader = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8");
    
  • JDK7 + 的 try-with-resources:流實現(xiàn)了AutoCloseable接口,可在 try 后自動關(guān)閉,無需手動調(diào)用close(),推薦優(yōu)先使用(如上述緩沖流示例)。

思維導(dǎo)圖

練習(xí)一: 統(tǒng)計單一文件目錄大小

package com.itheima.homework;

import java.io.File;

/**
 * @author Administrator
 **需求:**
    假設(shè)在`D:\itheima\`目錄下有若干個文件**(只有文件沒有目錄)**,請編寫程序統(tǒng)計`D:\itheima`目錄的大小。
 **提示:**
1. 如果沒有`D:\itheima`目錄,就在任意盤下創(chuàng)建一個`itheima`目錄
2. 統(tǒng)計目錄的大小就是統(tǒng)計目錄中所有文件的大小之和
 */
public class Work1 {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\IDEA\\java-upgrade\\day06-file-recursion-io\\src\\com\\itheima\\d4_io\\d1_byteio");
        File[] files = file.listFiles();
        long length = 0;
        for (File file1 : files) {
            length+=file1.length();
        }
        System.out.println("總大小為"+length);

    }


}

練習(xí)2:統(tǒng)計目錄若干文件大小

package com.itheima.homework;

import java.io.File;

/**
 * @author Administrator
 **需求:
        假設(shè)在`D:\itheima\`目錄下有若干個文件和目錄,請編寫程序統(tǒng)計`D:\itheima`目錄的大小。

 **提示:**統(tǒng)計目錄的大小就是統(tǒng)計目錄(及其子目錄)中所有文件的大小之和
 */
public class Work2 {
    public static void main(String[] args) {
        File file = new File("day06-file-recursion-io");
        System.out.println("總大小為"+fileSizeCount(file));
    }
    public static long fileSizeCount(File dir){

        File[] files = dir.listFiles();
        long length = 0;
        for (File file1 : files) {
            if (file1.isFile()) {
                long len = file1.length();
                System.out.println(file1.getName()+"-->"+len);
                length+=file1.length();
            }else{
//                return fileSizeCount(file1); 不能return直接否定了外層循環(huán)
//                fileSizeCount(file1);
                //todo 沒有累加非同級目錄的文件大小,結(jié)果為909,只計算了1級目錄的文件大小
                length +=fileSizeCount(file1);
                //遞歸就應(yīng)該累加文件大小,就跟階乘類似
                System.out.println("子級目錄長度:"+ length);


            }
        }
    return length;
    }

}

練習(xí)3: 復(fù)制單個文件到目錄中

package com.itheima.homework;

import java.io.*;

/**
 * @author Administrator
 * **需求:**
 假設(shè)在`D:\itheima\`目錄下有若干個文件**(只有文件沒有目錄)**,請編寫程序?qū)D:\itheima`目錄中的**一個文件**復(fù)制到當(dāng)前模塊下的`itheima`目錄中,文件名不變。
 * **要求:**不使用commons-io框架
 */
public class Work3 {
    public static void main(String[] args) throws IOException {
        copyFile();
    }
    public static void copyFile()  {
        //復(fù)制文件的思路:字節(jié)流符合視頻\圖片\音頻\文本,更普遍使用
        try(
                FileInputStream fis = new FileInputStream(new File("day06-file-recursion-io\\src\\com\\itheima\\d1_file\\Demo1.java"));
                FileOutputStream fos = new FileOutputStream("day06-file-recursion-io\\src\\com\\itheima\\homework\\Demo1.java");

        ) {
                       byte[] bytes = new byte[1024];
            int lenth = 0;
            while((lenth=fis.read(bytes))!=-1){
                fos.write(bytes,0,lenth);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

練習(xí)4:將某一目錄下所有文件復(fù)制到別的目錄下

package com.itheima.homework;

import java.io.*;

/**
 * @author Administrator
 * 假設(shè)在`D:\itheima\`目錄下有若干個文件**(只有文件沒有目錄)**,請編寫程序?qū)D:\itheima`目錄中的**所有文件**復(fù)制到當(dāng)前模塊下的`itheima`目錄中。
 */
/*todo Error: FileInputStream 只能用于讀取文件,不能讀取目錄
*   遍歷目錄中的每個文件
    為每個源文件創(chuàng)建獨立的 FileInputStream
    為目標(biāo)文件創(chuàng)建 FileOutputStream
    *
    * 輸出目錄拒絕訪問的原因是:
    FileOutputStream 不能直接寫入目錄
    FileOutputStream 只能用于創(chuàng)建或?qū)懭胛募荒苤苯訉懭肽夸?
    代碼中 new FileOutputStream(outputFile) 試圖將數(shù)據(jù)寫入目錄 work4,這是不允許的
    目標(biāo)路徑應(yīng)該是文件而不是目錄
    每個源文件都需要對應(yīng)一個目標(biāo)文件
    當(dāng)前代碼試圖將所有文件內(nèi)容都寫入同一個目錄路徑*
    *使用 while((len = fis.read(bytes)) != -1) 循環(huán)讀取
    每次讀取后立即寫入目標(biāo)文件
    直到 read() 返回 -1(文件結(jié)束)才停止
    這樣就能完整復(fù)制整個文件內(nèi)容,而不是只復(fù)制前1024字節(jié)。*/
public class Work4 {
    public static void main(String[] args) throws IOException {
        File inputFile = new File("day06-file-recursion-io\\src\\com\\itheima\\d4_io\\d1_byteio");
        File outputFile = new File("day06-file-recursion-io\\src\\com\\itheima\\homework\\work4");
        copyFiles(inputFile,outputFile);
    }
    public static void copyFiles(File  dir,File outputFile) throws IOException {
        //創(chuàng)建字節(jié)輸入輸出流
        //這里的都是目錄

            //讀取輸入流目錄的子級
            File[] files = dir.listFiles();
            for (File file : files) {
                //遍歷父級目錄下的文件是否是文件
                if (file.isFile()) {
                    try ( FileInputStream fis = new FileInputStream(file);
                          //todo 此時字節(jié)輸入流已經(jīng)拿到了文件
                          FileOutputStream fos = new FileOutputStream(new File(outputFile, file.getName()));
                          //todo 為輸出字節(jié)流的目標(biāo)文件指定具體文件名,父目錄+子文件名
                          ){
                        byte[] bytes = new byte[1024];
                        int len = 0;
                        while ((len=fis.read(bytes))!=-1){
                             fos.write(bytes,0,len);
                         }
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }else{
                    copyFiles(file, new File(outputFile, file.getName()));
                }
            }
            //讀入和輸出
            //關(guān)閉流

    }
}

練習(xí)5:符緩沖流讀取數(shù)據(jù)并封裝對象

package com.itheima.homework;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author Administrator
 * - 使用字符緩沖流讀取”students.txt”文件,將每行數(shù)據(jù)封裝為一個Student對象,并將Student對象存儲到一個集合
 *
 * - 遍歷并打印集合的所有Student信息
 */
public class Work5 {
    public static void main(String[] args) throws IOException {
        Reader file = new FileReader("day06-file-recursion-io\\student.txt");
        BufferedReader br = new BufferedReader(file);
        //讀取行
        String line = null;
        List<Student> studentArrayList = new ArrayList<>();
        while((line=br.readLine())!=null){
            String s = new String(line);
            String[] split = s.split(",");
//            System.out.println(Arrays.toString( split));
            Student student = new Student(split[0], Integer.parseInt(split[1]));

            studentArrayList.add(student);

            /*//todo 而不是“每行都重復(fù) 3 次”,根本原因是:
                    //你把 new ArrayList<>() 寫在了 while 循環(huán)里
                    //→ 每讀一行就 new 一個新的空集合 → 只裝當(dāng)前這一個 Student → 打印完就棄用 → 下一行再 new 一個新的空集合……*/
        }
        br.close();
        System.out.println(studentArrayList);


    }
}

總結(jié) 

到此這篇關(guān)于如何使用IO流實現(xiàn)文件數(shù)據(jù)的讀寫及文件復(fù)制的文章就介紹到這了,更多相關(guān)IO流實現(xiàn)文件數(shù)據(jù)讀寫及文件復(fù)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA中對List進行查詢

    JAVA中對List進行查詢

    下面小編就為大家?guī)硪黄趈ava List中進行模糊查詢的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-08-08
  • 使用Maven進行依賴排除的詳細步驟

    使用Maven進行依賴排除的詳細步驟

    在Maven中,依賴排除是一種常見的技術(shù),用于從項目的依賴中排除特定的傳遞性依賴,這通常用于解決依賴沖突或避免引入不需要的庫,以下是如何在Maven中使用依賴排除的詳細步驟,包括代碼示例,需要的朋友可以參考下
    2024-11-11
  • Java實現(xiàn)猜數(shù)程序

    Java實現(xiàn)猜數(shù)程序

    這篇文章主要為大家詳細介紹了Java實現(xiàn)猜數(shù)程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Java 實現(xiàn)協(xié)同過濾算法推薦算法的示例代碼

    Java 實現(xiàn)協(xié)同過濾算法推薦算法的示例代碼

    本文介紹了協(xié)同過濾算法的概念,包括基于用戶的協(xié)同過濾和基于物品的協(xié)同過濾,文章詳細解釋了數(shù)據(jù)準(zhǔn)備、相似度計算以及如何在Java中實現(xiàn)這些算法,通過一個簡單的用戶-物品評分矩陣示例,展示了如何計算用戶和物品之間的相似度,并推薦未評分的物品,感興趣的朋友一起看看吧
    2025-02-02
  • Java對象布局(JOL)實現(xiàn)過程解析

    Java對象布局(JOL)實現(xiàn)過程解析

    這篇文章主要介紹了Java對象布局(JOL)實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Java ResourceBundle案例詳解

    Java ResourceBundle案例詳解

    這篇文章主要介紹了Java ResourceBundle案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行

    Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行

    Java主線程等待所有子線程執(zhí)行完畢在執(zhí)行,其實在我們的工作中經(jīng)常的用到,本篇文章就介紹了Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行,有需要的可以了解一下。
    2016-11-11
  • Java?Servlet實現(xiàn)表白墻的代碼實例

    Java?Servlet實現(xiàn)表白墻的代碼實例

    最近用Servlet做了個小項目,分享給大家,下面這篇文章主要給大家介紹了關(guān)于Java?Servlet實現(xiàn)表白墻的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • 簡單了解springboot加載配置文件順序

    簡單了解springboot加載配置文件順序

    這篇文章主要介紹了簡單了解springboot加載配置文件順序,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • 一文詳解各種ElasticSearch查詢在Java中的實現(xiàn)

    一文詳解各種ElasticSearch查詢在Java中的實現(xiàn)

    Elasticsearch是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是當(dāng)前流行的企業(yè)級搜索引擎,下面這篇文章主要給大家介紹了關(guān)于各種ElasticSearch查詢在Java中實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2023-11-11

最新評論

安远县| 汝阳县| 洱源县| 巢湖市| 怀宁县| 汶川县| 汤原县| 兴和县| 积石山| 泸水县| 左云县| 田东县| 石狮市| 东平县| 衡阳县| 泸州市| 德江县| 乌恰县| 台南市| 澄迈县| 桃源县| 青浦区| 大宁县| 漯河市| 策勒县| 常州市| 益阳市| 田阳县| 盐池县| 同江市| 五河县| 永仁县| 昭通市| 沈丘县| 龙门县| 潮安县| 东源县| 江源县| 济阳县| 吕梁市| 平度市|