從“0”開始學JAVA——第十一節 I/O流

???????在Java編程中,文件操作和輸入輸出(IO)處理是必不可少的部分。本文將深入探討Java IO包

中的文件流操作,包括基礎概念、分類、常用類以及實際應用場景。

1. File類

File類是Java IO操作的基礎,它實現了Serializable和Comparable<File>接口。

構造方法

// 通過路徑名創建File對象
File file1 = new File("pathName");// 通過父路徑和子路徑創建
File file2 = new File("parent", "child");// 通過父File對象和子路徑創建
File file3 = new File(parentFile, "child");// 通過URI創建
File file4 = new File(URI uri);

常用方法

1.exists():判斷文件/目錄是否存在

2.isFile()/isDirectory():判斷是否為文件/目錄

3.createNewFile():創建新文件

4.mkdir()/mkdirs():創建目錄

5.list()/listFiles():列出目錄內容

6.delete():刪除文件/目錄

2. 流的分類

Java IO流可以按照不同維度進行分類:

按數據流向

  • 輸入流:用于讀取數據(如讀取配置文件)

  • 輸出流:用于寫入數據(如寫日志文件、導出到表格)

按數據類型

  • 字節流:以byte為單位操作數據

  • 字符流:以char為單位操作數據

分類組合

輸入輸出
字節流InputStreamOutputStream
字符流ReaderWriter

3. 基礎流類

Java IO提供了四個抽象基類:

  • InputStream/OutputStream:字節流基類

  • Reader/Writer:字符流基類

4. 字節流操作

字節流以byte為單位操作數據,可以處理任意類型的文件數據。

基本使用方法

// 1. 聲明流
FileInputStream fis = null;
FileOutputStream fos = null;try {// 2. 創建流fis = new FileInputStream("input.txt");fos = new FileOutputStream("output.txt");// 3. 使用流int data;while ((data = fis.read()) != -1) {fos.write(data);}
} catch (IOException e) {e.printStackTrace();
} finally {// 4. 關閉流try {if (fis != null) fis.close();if (fos != null) fos.close();} catch (IOException e) {e.printStackTrace();}
}

常用字節流類

  • FileInputStream/FileOutputStream:文件字節流,操作文件數據

  • ByteArrayInputStream/ByteArrayOutputStream:字節數組流(內存流),操作內存數據

注意:內存流不需要手動關閉,由垃圾回收器負責清理。

5. 字符流操作

字符流提供了更方便高效的字符處理方式,底層仍是字節流,但自動處理字符編碼轉換。

try (FileReader reader = new FileReader("input.txt");FileWriter writer = new FileWriter("output.txt")) {int data;while ((data = reader.read()) != -1) {writer.write(data);}
} catch (IOException e) {e.printStackTrace();
}

注意:字符流只能操作文本文件,不能處理圖片、音頻、視頻等二進制文件。

6. 異常處理

IO操作必須正確處理異常,推薦兩種方式:

方式1:try-catch-finally

FileInputStream fis = null;
try {fis = new FileInputStream("file.txt");// 使用流
} catch (IOException e) {e.printStackTrace();
} finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}
}

方式2:try-with-resource(自動關閉資源)

try (FileInputStream fis = new FileInputStream("file.txt");FileOutputStream fos = new FileOutputStream("output.txt")) {// 使用流// 資源會自動關閉
} catch (IOException e) {e.printStackTrace();
}

7. 增強流

增強流提供更高級的功能和操作,通常包裝在基礎流之上。

緩沖流(高效流)

緩沖流通過在內存中創建緩沖區,減少實際IO操作次數,提高效率。

// 字節緩沖流
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = bis.read(buffer)) != -1) {bos.write(buffer, 0, bytesRead);}
}// 字符緩沖流
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {String line;while ((line = reader.readLine()) != null) {writer.write(line);writer.newLine();}
}

標準流

Java預定義了三個標準流:

  • System.in:標準輸入流(字節流,通常是鍵盤輸入)

  • System.out:標準輸出流(字節流,通常是控制臺輸出)

  • System.err:標準錯誤流(字節流,輸出錯誤信息)

// 使用Scanner讀取標準輸入
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();// 標準輸出
System.out.println("普通信息");
System.err.println("錯誤信息");

轉換流

轉換流用于在字節流和字符流之間進行轉換,并可指定編碼。

try (InputStreamReader isr = new InputStreamReader(new FileInputStream("input.txt"), "UTF-8");OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8")) {int data;while ((data = isr.read()) != -1) {osw.write(data);}
}

對象流

對象流用于序列化和反序列化Java對象。

// 需要序列化的類必須實現Serializable接口
class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private transient int age; // transient修飾的字段不會被序列化// 構造方法、getter和setter
}// 序列化對象
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {oos.writeObject(new Person("張三", 25));
}// 反序列化對象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {Person person = (Person) ois.readObject();System.out.println(person.getName());
}

注意:serialVersionUID用于確保序列化兼容性,建議顯式定義。

數據流

數據流專門用于讀寫基本數據類型和字符串。

try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.dat"))) {dos.writeInt(100);dos.writeDouble(3.14);dos.writeUTF("Hello");
}try (DataInputStream dis = new DataInputStream(new FileInputStream("data.dat"))) {int i = dis.readInt();double d = dis.readDouble();String s = dis.readUTF();
}

8. 隨機訪問流

RandomAccessFile類允許對文件進行隨機訪問,集輸入輸出于一體。

try (RandomAccessFile raf = new RandomAccessFile("file.txt", "rw")) {// 定位到文件末尾raf.seek(raf.length());// 寫入數據raf.writeUTF("追加的內容");// 定位到文件開頭raf.seek(0);// 讀取數據String content = raf.readLine();
}

9. 實際應用場景

  1. 寫日志:使用字符輸出流(如FileWriter)記錄程序運行日志

  2. 讀寫配置文件:使用Properties類結合文件流讀寫配置文件

  3. 文件上傳下載:使用字節流處理文件傳輸

  4. 數據持久化:使用對象流將對象序列化到文件中

  5. 大數據處理:使用緩沖流提高大文件讀寫效率

總結

Java IO提供了豐富的API來處理文件和數據流操作。在實際開發中,應根據具體需求選擇合適的流類型:

  • 處理文本文件:優先考慮字符流

  • 處理二進制文件:使用字節流

  • 需要高效讀寫:使用緩沖流

  • 需要對象持久化:使用對象流

  • 需要隨機訪問:使用RandomAccessFile

正確使用和關閉流資源是避免內存泄漏和資源耗盡的關鍵,推薦使用try-with-resources語句確保資源正確釋放。

掌握Java IO操作對于開發高效、穩定的應用程序至關重要,希望本文能為您提供全面的指導和參考。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94568.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94568.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94568.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據價值化】數據資產入表指南:核心準則與實操路徑

隨著數據要素市場的蓬勃發展&#xff0c;數據資產的商業價值愈發凸顯。然而&#xff0c;如何讓數據資產合規、合理地進入企業財務報表&#xff0c;成為眾多企業急需解決的難題。本文基于《企業會計準則》的相關規定&#xff0c;為您系統梳理數據資產入表的核心準則要點與實操路…

基于 MediaPipe + Three.js 的實時姿態可視化前端

這是一套前端實時姿態捕獲與 3D 可視化的 DEMO&#xff0c;特點是啟動快、UI 現代、渲染穩定&#xff0c;同時對設備性能與網絡情況做了多處優化。 預覽地址 技術棧與核心依賴 框架與工程&#xff1a;Vite React TypeScript實時姿態識別&#xff1a;MediaPipe Tasks Vision&…

【分布式技術】Kafka 數據積壓全面解析:原因、診斷與解決方案

Kafka 數據積壓全面解析&#xff1a;原因、診斷與解決方案Kafka 數據積壓深度解析與解決方案全景指南一、數據積壓核心原因矩陣二、生產者側問題深度解析1. 突發流量洪峰2. 大消息阻塞管道三、消費者側問題深度解析1. 消費能力不足2. 消費邏輯阻塞四、Broker集群問題深度解析1.…

企業云辦公安全指南:如何構建高效無憂的云辦公環境?

2025年&#xff0c;全球化協作與混合辦公已成為企業運營的常態。越來越多的企業將業務遷移至云端&#xff0c;云辦公在提升靈活性與效率的同時&#xff0c;也帶來了新的安全挑戰——數據泄露、內部威脅、網絡攻擊等風險無處不在&#xff0c;每一個環節都可能成為企業核心資產的…

Thingsboard 租戶管理員權限,增加租戶普通用戶權限

在 ThingsBoard CE&#xff08;社區版&#xff09;中&#xff0c;租戶管理員擁有對規則鏈、客戶、資產、設備、儀表板等資源的全面管理權限。如果你想為租戶創建一個普通用戶&#xff0c;并限制其不能操作規則鏈、高級功能、安全設置等&#xff0c;可以通過以下步驟實現&#x…

【筆記】大模型業務場景流程綜述

前言 大模型是指具有大規模參數和復雜計算結構的深度學習模型,這些模型通常由眾多神經網絡構建而成,擁有數十億甚至數千億個參數。本章將圍繞大模型概念及特點展開,介紹模型算法的分類、典型大模型及應用、大模型訓練流程和大模型業務流程。 目標 學完本課程后,您將能夠…

【兩數相互求余等于輸入兩數】2022-10-20

緣由關于#c#的問題&#xff1a;這個應該按照怎么個思路來寫&#xff1a;想老半天莫得思路想法-編程語言-CSDN問答 void 兩數相互求余等于輸入兩數() {//緣由https://ask.csdn.net/questions/7813625int a 0, b 0, x 0, y 0;cin >> a >> b;if (a > b)x a, y…

Linux系統調優

目錄 1.CPU 負載查看 1.1.使用 uptime 查看系統負載 1.2.使用 top 按 CPU 使用率排序 1.3.使用 ps 查看 CPU 使用最多的進程 1.4.使用 mpstat 查看 CPU 詳細狀態 1.5.查看 /proc/meminfo 獲取詳細內存信息 2查看內存運行狀態 2.1.使用 free 查看內存使用 1.CPU 負載查看…

AtCoder Beginner Contest 420

比賽鏈接如下&#xff1a; AtCoder Beginner Contest 420 - AtCoder A - What month is it? Problem Statement You are given integers X and Y between 1 and 12, inclusive. Find what month it will be Y months after month X (for example, month 1 is January). Cons…

Python算法-貪心算法(Greedy Algorithm)

Python算法&#xff1a;貪心算法&#xff08;Greedy Algorithm&#xff09;深度解析 引言 貪心算法&#xff08;Greedy Algorithm&#xff09;是計算機科學中最基礎的算法設計思想之一&#xff0c;其核心在于通過局部最優選擇逐步構建全局最優解。盡管它并不總能保證得到絕對最…

告別臃腫與廣告:精選9款安卓電視桌面Launcher,還你清爽高效體驗 (2025版)

[實測] 9款優秀安卓電視桌面Launcher推薦&#xff1a;告別原生臃腫&#xff0c;重塑清爽TV體驗 引言&#xff1a;當前智能電視桌面的痛點 目前市面上許多智能電視或電視盒子的原生桌面&#xff08;Launcher&#xff09;系統&#xff0c;為了商業推廣和內容聚合&#xff0c;往…

Docker Desktop緊急修復CVSS9.3高危容器逃逸漏洞

Docker公司修復了Windows和macOS版Docker Desktop應用程序中的一個高危漏洞&#xff08;CVE-2025-9074&#xff0c;CVSS評分9.3&#xff09;&#xff0c;攻擊者可能利用該漏洞突破容器隔離限制。漏洞技術細節根據Docker官方文檔披露&#xff0c;惡意容器能夠訪問Docker引擎并在…

攜程旅游的 AI 網關落地實踐

原創 董藝荃 Higress 2025年08月21日 16:32 陜西本文整理自攜程旅游研發總監董藝荃在2025中國可信云大會上的分享&#xff0c;董藝荃 GitHub ID CH3CHO&#xff0c;同時也是 Higress 的 Maintainer。分享內容分為以下4部分。01 大規模應用 AI 技術過程中遇到了哪些問題02 網關…

CloudBase云開發MCP + CodeBuddy IDE:打造智能化全棧理財助手的完整實踐

CloudBase云開發MCP CodeBuddy IDE&#xff1a;打造智能化全棧理財助手的完整實踐 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#x…

ESP8266學習

一&#xff0c;連接Wifi1.Esp8266連接手機熱點ATATRST ATCWMODE1 ATCWJAP"ESP8266","123456789"手機查看連接信息2.Esp8266連接手機熱點進入透傳模式ATATRST ATCWMODE1 ATCWJAP"ESP8266","123456789"ATCIPMUX0 ATCIPSTART"TCP&qu…

Mac安裝mitmproxy及操作對監控的請求

在 macOS 上安裝和配置 mitmproxy 是一個相對簡單的過程&#xff0c;可以使用常見的包管理工具如 Homebrew 或直接通過 Python 的包管理工具 pip。以下是詳細的安裝步驟&#xff1a; 方法一&#xff1a;使用 Homebrew 安裝 Homebrew 是 macOS 上流行的包管理工具。它可以快速安…

c++ 數據結構-堆、優先隊列 小總結

之前學習了一些堆、優先隊列的知識點&#xff0c;在此做一個小總結。堆&#xff08;Heap&#xff09;堆&#xff08;Heap&#xff09;是一種特殊的完全二叉樹數據結構&#xff0c;具有以下重要特性&#xff1a;結構特性堆是一棵完全二叉樹&#xff0c;即除了最后一層外&#xf…

編寫Linux下usb設備驅動方法:probe函數中要進行的工作

一. 簡介 前一篇文章簡單學習了 Linux下usb設備驅動實現流程&#xff0c;文章如下&#xff1a; 編寫Linux下usb設備驅動方法&#xff1a;usb設備驅動實現流程-CSDN博客 本文來學習一下 usb設備驅動的 probe函數要完成的任務。 當usb主控制器檢測到設備與 驅動相匹配時&…

動態規劃:為什么暴力算法會有重復子問題

第一步&#xff1a;先明確 “子問題” 和 “重復子問題” 的定義 在算法中&#xff0c;“子問題” 不是泛指 “小一點的問題”&#xff0c;而是具有明確 “狀態參數” 的、可獨立求解的問題單元。 狀態參數&#xff1a;描述子問題核心信息的變量&#xff08;比如 01 背包中的 “…

【網絡】添加路由時,via和dev參數作用、直連路由

文章目錄概述1、帶via1.1 添加路由前的初始狀態1.2. 執行添加路由的命令1.3. 添加路由后的狀態2、不帶 via (使用設備接口)&#xff0c;直連3、帶via還是不帶via ?4、dev xx的作用4.1 命令中帶via時&#xff0c;建議不帶 dev eth0 (讓系統自動判斷)4.2 命令中帶via&#xff0c…