JavaEE 初阶文件操作与 IO 详解

一、文件操作基础:File 类

作用:操作文件或目录(创建、删除、获取信息)。
核心方法

  • exists():文件是否存在
  • createNewFile():创建新文件
  • mkdir():创建目录
  • delete():删除文件或目录

代码示例

import java.io.File;
import java.io.IOException;public class FileCreateDemo {public static void main(String[] args) {// 1. 创建文件对象(不实际创建文件)File file = new File("test.txt");try {// 2. 创建文件(需处理 IOException)if (file.createNewFile()) {System.out.println("文件创建成功");} else {System.out.println("文件已存在");}} catch (IOException e) {e.printStackTrace();}// 3. 创建目录(单层)File dir = new File("mydir");if (dir.mkdir()) {System.out.println("目录创建成功");}// 4. 创建多级目录File multiDir = new File("parent/child");if (multiDir.mkdirs()) {System.out.println("多级目录创建成功");}}
}

重点

  • new File("路径") 只是创建对象,不会实际创建文件。
  • 操作可能抛出 IOException,必须处理异常。
  • createNewFile():原子性操作,文件不存在时创建并返回 true
  • mkdir() 与 mkdirs():后者可创建多级目录
  • 路径分隔符:Windows 用 \(需转义为 \\),Linux/Mac 用 /

2. 删除与判断文件属性

public class FileDeleteDemo {public static void main(String[] args) {File file = new File("test.txt");// 1. 删除文件(立刻删除,非移到回收站)if (file.delete()) {System.out.println("文件删除成功");}// 2. 判断文件属性System.out.println("是否隐藏文件: " + file.isHidden());System.out.println("是否可读: " + file.canRead());System.out.println("最后修改时间: " + file.lastModified());}
}
二、IO 流分类与核心类
1. 按方向分
  • 输入流:从文件/网络读取数据 → InputStreamReader
  • 输出流:向文件/网络写入数据 → OutputStreamWriter
2. 按数据类型分

类型字节流(二进制)字符流(文本)
输入InputStreamReader
输出OutputStreamWriter

为什么需要字符流
直接处理文本更方便,自动处理字符编码(如 UTF-8)。

三、字节流实战:文件复制

代码示例

import java.io.*;public class FileCopy {public static void main(String[] args) {// 1. 定义输入输出文件File srcFile = new File("source.jpg");File destFile = new File("copy.jpg");// 2. 使用 try-with-resources 自动关闭流try (InputStream is = new FileInputStream(srcFile);OutputStream os = new FileOutputStream(destFile)) {// 3. 缓冲区提高效率byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {os.write(buffer, 0, len); // 写入实际读取的字节数}System.out.println("文件复制完成");} catch (IOException e) {e.printStackTrace();}}
}

重点

  • try-with-resources 自动关闭流,避免资源泄漏。
  • 缓冲区大小(如 1024)影响性能,通常设为 4KB~8KB。
  • read() 返回实际读取字节数,避免写入多余数据。
  • 逐字节读写效率极低,需优化为缓冲区读写。
四、字符流实战:读写文本文件

代码示例(处理中文不乱码)

import java.io.*;public class TextFileDemo {public static void main(String[] args) {// 写入文件(UTF-8编码)try (Writer writer = new FileWriter("data.txt", StandardCharsets.UTF_8)) {writer.write("你好,JavaEE!\n");writer.write("Hello, World!");} catch (IOException e) {e.printStackTrace();}// 读取文件try (Reader reader = new FileReader("data.txt", StandardCharsets.UTF_8);BufferedReader br = new BufferedReader(reader)) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

重点

  • FileWriter/FileReader 默认使用系统编码,建议显式指定(如 UTF-8)。
  • BufferedReader 提升读取效率,readLine() 逐行读取。
    五、缓冲流:性能优化利器

    代码示例

  • public class BufferedByteStreamDemo {public static void main(String[] args) {try (InputStream is = new FileInputStream("source.jpg");BufferedInputStream bis = new BufferedInputStream(is); // 添加缓冲OutputStream os = new FileOutputStream("copy.jpg");BufferedOutputStream bos = new BufferedOutputStream(os)) {byte[] buffer = new byte[8192]; // 8KB 缓冲区int len;while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len); // 写入实际读取的字节数}} catch (IOException e) {e.printStackTrace();}}
    }
    

    重点

  • 缓冲流(BufferedXXX)通过减少物理 IO 次数提升性能。
  • 默认缓冲区大小 8KB,可根据需求调整。
  • 冲区大小通常设为 4096(4KB)~ 8192(8KB)
  • BufferedInputStream 内部维护 8KB 缓冲区,减少物理磁盘访问次数
六、NIO 新特性:更简洁的文件操作

Java NIO(New IO)核心类

  • Path:替代 File 类,路径操作更灵活
  • Files:提供静态方法简化文件操作

代码示例

import java.nio.file.*;public class NioDemo {public static void main(String[] args) {Path source = Paths.get("source.txt");Path target = Paths.get("backup.txt");try {// 复制文件(自动覆盖)Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);// 读取所有行(UTF-8)List<String> lines = Files.readAllLines(source);lines.forEach(System.out::println);// 写入文件Files.write(target, "新内容".getBytes());} catch (IOException e) {e.printStackTrace();}}
}

重点

  • Files.copy() 比传统 IO 更简洁。
  • readAllLines() 适合小文件,大文件仍需流式读取。
七、高级应用场景

1. 文件监控(WatchService)

public class FileWatcherDemo {public static void main(String[] args) throws IOException {WatchService watchService = FileSystems.getDefault().newWatchService();Path dir = Paths.get("."); // 监控当前目录dir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY);while (true) {WatchKey key = watchService.take(); // 阻塞直到事件发生for (WatchEvent<?> event : key.pollEvents()) {System.out.println("事件类型: " + event.kind());System.out.println("文件: " + event.context());}key.reset(); // 重置监听}}
}

2. 大文件逐行处理(内存优化)

public class LargeFileProcessor {public static void main(String[] args) {try (Stream<String> lines = Files.lines(Paths.get("bigdata.txt"))) {lines.filter(line -> line.contains("error")).forEach(System.out::println);} catch (IOException e) {e.printStackTrace();}}
}
八、核心总结
  1. 选择流类型
    • 文本文件 → 字符流(Reader/Writer)
    • 图片/视频 → 字节流(InputStream/OutputStream)
  2. 性能优化
    • 使用缓冲流(BufferedXXX)
    • 合理设置缓冲区大小
  3. 资源管理
    • 必须用 try-with-resources 或手动关闭流
  4. NIO 优势
    • 更简洁的 API
    • 支持异步和非阻塞 IO(高级特性)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++(27): 标准库 <iterator>

目录 1. 核心概念 2. 基本语法 3. 特点 4. 特有成员函数与工具 5. 内存与性能 6. 示例代码 7. 成员函数与类型 8. 使用场景 9. 注意事项 1. 核心概念 迭代器(Iterator) 是 C++ 中用于访问和遍历容器元素的通用接口,类似于指针,但支持更丰富的操作。 抽象访问机制:…

谈谈 Kotlin 中的构造方法,有哪些注意事项?

在 Kotlin 中&#xff0c;构造方法分为主构造方法&#xff08;Primary Constructor&#xff09;和次构造方法&#xff08;Secondary Constructor&#xff09;。 1 主构造方法 主构造方法是类的核心构造方法&#xff0c;直接在类头声明&#xff0c;位于类名之后。 1.1 基本语…

年会招标抽奖活动软件———仙盟创梦IDE

年会是企业一年的总结与欢庆时刻&#xff0c;而抽奖环节更是点燃全场气氛的关键。如何让抽奖环节既大气又充满仪式感&#xff1f;选对抽奖软件至关重要&#xff01;本文精心挑选了 3 款兼具实用性与氛围感的年会抽奖软件&#xff0c;从界面设计到功能特色&#xff0c;全方位为你…

安全软件检测进程异常行为-Postgresql应用执行异常指令whoami

文章目录 环境症状问题原因解决方案 环境 系统平台&#xff1a;UOS&#xff08;海光&#xff09; 版本&#xff1a;4.5.8 症状 数据库安装包&#xff1a; 安全软件告警中提示“sh -c whoami”命令&#xff0c;是由数据库发出的&#xff0c;安全软件捕获到了postgres.exe–fo…

车载诊断架构 --- LIN 节点 ECU 故障设计原则

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

GPU加速的AlphaFold3蛋白质复合体预测:如何在64GB显存下跑超大规模模型(混合精度+模型并行实战技巧)

一、AlphaFold3的超大规模挑战与优化方向 AlphaFold3作为当前生物计算领域的革命性工具&#xff0c;其核心架构基于扩散模型&#xff0c;能够预测包含蛋白质、核酸、小分子配体等复杂生物复合物的三维结构。然而&#xff0c;模型参数量级&#xff08;典型配置超百亿级&#xf…

Qt功能区:Ribbon控件

控件 1. 按钮1.1 多选按钮1.2 2. 下拉列表框SARibbonComboBox2.1 简介2.2 代码实现 1. 按钮 1.1 多选按钮 软件功能&#xff1a;用于实现Category的名称居中。 SARibbonCheckBox继承于QCheckBox&#xff0c;使用方法完全相同。 SARibbonCheckBox* checkBox new SARibbonChe…

一个由微软开源的 Python 工具,用于将多种文件格式转换为 Markdown 格式

&#x1f4da; Markitdown 由微软开源的 Python 工具&#xff0c;用于将多种文件格式转换为 Markdown 格式 支持&#xff1a;PDF、PowerPoint、Word、Excel、图像、音频、HTML、文本格式&#xff08;CSV、JSON、XML&#xff09;、ZIP 文件的转换。 它旨在提供一个简单且灵活的…

Linux的进程概念

目录 1、冯诺依曼体系结构 2、操作系统(Operating System) 2.1 基本概念 2.2 目的 3、Linux的进程 3.1 基本概念 3.1.1 PCB 3.1.2 struct task_struct 3.1.3 进程的定义 3.2 基本操作 3.2.1 查看进程 3.2.2 初识fork 3.3 进程状态 3.3.1 操作系统的进程状态 3.3…

export和import的书写方式

一、导出模块&#xff08;export&#xff09; 1. 命名导出&#xff08;Named Exports&#xff09; // math.js export const PI 3.14159; // 导出单个常量 export function sum(a, b) { return a b; } // 导出单个函数 export class Calculator { /* ..…

HOW - 结合 AI 进行 Tailwind 样式开发

文章目录 情况 1&#xff1a;使用 Tailwind CSS 与手写传统 CSS 的开发效率对比情况 2&#xff1a;AI Tailwind 自动生成 UI 的效率如何&#xff1f;总结 在 WHAT - Tailwind 样式方案&#xff08;不写任何自定义样式&#xff09; 中我们已经简单介绍过 Tailwind。今天主要认识…

java面试每日一背 day1

1.什么是缓存穿透 缓存穿透是指查询一个数据库中根本不存在的数据&#xff0c;导致这个查询请求绕过缓存直接访问数据库的情况。这种情况如果频繁发生&#xff0c;会对数据库造成不必要的压力。 典型特征&#xff1a; &#xff08;1&#xff09;查询的数据在数据库和缓存中都…

ngx_http_realip_module 模块概述

一、使用场景 日志记录 记录真实客户端 IP 而非反向代理的 IP&#xff0c;有助于流量分析和安全审计。访问控制 基于真实 IP 实现防火墙规则&#xff08;allow/deny&#xff09;或限流&#xff0c;而非误将上游 IP 视为客户端。GeoIP、WAF、限速等功能 模块化的上游真实 IP 支…

实战5:个性化数字艺术生成与销售

盈利思路 数字艺术销售&#xff1a; 平台销售&#xff1a;将生成的数字艺术作品上传到像OpenSea、Foundation等NFT平台进行售卖。每一件独特的艺术品可以通过NFT技术保证其唯一性&#xff0c;吸引收藏家和投资者。 定价策略&#xff1a;根据作品的复杂度、创意性以及市场需求来…

游戏引擎学习第303天:尝试分开对Y轴和Z轴进行排序

成为我们自己的代码精灵α 所以现在应该可以正常使用了。不过&#xff0c;这两周我们没办法继续处理代码里的问题&#xff0c;而之前留在代码里的那个问题依然存在&#xff0c;没有人神奇地帮我们修复&#xff0c;这让人挺无奈的。其实我们都希望有个神奇的“代码仙子”&#…

InetAddress 类详解

InetAddress 类详解 一、核心作用 封装 IP 地址&#xff1a;同时支持 IPv4 和 IPv6 地址域名解析&#xff1a;将域名转换为 IP 地址&#xff08;DNS 查询&#xff09;地址验证&#xff1a;检查网络地址的有效性无构造方法&#xff1a;通过静态工厂方法获取实例 二、核心方法 …

spring cloud alibaba-Geteway详解

spring cloud alibaba-Gateway详解 Gateway介绍 在 Spring Cloud Alibaba 生态系统中&#xff0c;Gateway 是一个非常重要的组件&#xff0c;用于构建微服务架构中的网关服务。它基于 Spring Cloud Gateway 进行扩展和优化&#xff0c;提供了更强大的功能和更好的性能。 Gat…

iOS 直播技术及优化

iOS直播技术的实现和优化涉及多个技术环节&#xff0c;需结合协议选择、编解码方案、播放器技术及性能调优等多方面。 一、核心技术实现 协议选择与传输优化 HLS&#xff08;HTTP Live Streaming&#xff09;&#xff1a;苹果官方推荐&#xff0c;基于HTTP分片传输&#xff0c…

目标检测135个前沿算法模型汇总(附源码)!

目标检测是计算机视觉核心方向之一&#xff0c;也是发论文的热门领域&#xff01; 近来不仅YOLO算法迎来了新突破&#xff0c;迭代出YOLOv12&#xff01;Mamba、大模型等新技术的发展&#xff0c;也给该领域注入了全新的力量&#xff0c;取得了诸多显著成果。比如性能飙升82.3…

期刊采编系统安装升级错误

我们以ojs系统为例&#xff1a; PHP Fatal error: Uncaught Error: Call to a member function getId() on null in /esci/data/html/classes/install/Upgrade.inc.php:1019 Stacktrace: #0 /esci/data/html/lib/pkp/classes/install/Installer.inc.php(415): Upgrade->con…