在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…