Java文件编程

news/2025/9/25 20:30:04/文章来源:https://www.cnblogs.com/hellodeyang/p/19111950

目录
  • Java文件编程
    • 传统IO
    • NIO
    • NIO.2
    • 总结

Java文件编程

传统IO

传统IO (java.io包)的主要类:

  • FileInputStream/FileOutputStream - 字节流
  • FileReader/FileWriter - 字符流
  • BufferedReader/BufferedWriter - 缓冲流
  • File - 文件/目录操作

文件读取和写入:

  • 字节流:File + FileInputStream/FileOutputStream + byte[]
    • FileInputStream/FileOutputStream构造函数创建时可以传入File 和String
  • 字符流:File + FileReader/FileWriter + BufferedReader/BufferedWriter
    • FileReader/FileWriter构造函数创建时可以传入File 和String
  • File:File对象作为参数传递给流构造函数。负责文件/目录的创建、删除、重命名、属性查询等管理操作

优点:

  1. 简单易用,学习曲线平缓

  2. 广泛的兼容性,所有Java版本都支持

  3. 适合简单的文件操作场景

  4. 明确的异常处理(IOException)

缺点:

  1. 阻塞IO模型,性能较低
  2. 缺乏高级功能(如文件锁、内存映射等)
  3. 缓冲区管理需要手动处理
  4. 目录遍历功能较弱

NIO

NIO提供了更现代、更高效的文件操作方式,特别适合处理大文件和高并发场景。

NIO (java.nio包Jdk 1.4)的主要类:

  • FileChannel - 文件通道
  • ByteBuffer - 缓冲区
  • Charset - 字符编码处理

文件读取和写入:

  • 使用FileChannel进行高性能读写
    • FileChannel基础操作:FileChannel + ByteBuffer + 文件(可以是String传递路径、也可以是NIO.2的Files + Paths + Path)
    • 内存映射文件(Memory Mapped Files):FileChannel + MappedByteBuffer + 文件(可以是String传递路径、也可以是NIO.2的Files + Paths + Path)

优点:

  1. 非阻塞IO(对于网络IO),文件IO使用更高效的通道

  2. 内存映射文件,提高大文件读写性能。MappedByteBuffer

  3. 文件锁机制

    • FileLock lock = channel.lock(); // 获取文件锁
  4. 聚集写入(Gathering Write)

    channel.write(buffer数组);

  5. 分散读取(Scattering Read)

    channel.read(buffer数组);

缺点:

  1. API相对复杂,学习曲线较陡
    Path path = Paths.get("file.txt");
    BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);

  2. 某些操作异常信息不够明确

  3. 缓冲区管理需要更多关注

  4. 对于简单操作可能显得繁琐

NIO.2

NIO.2提供了现代化、功能丰富的文件操作API,是当前Java文件处理的首选方案。

NIO.2 不是取代 NIO,而是在 NIO 基础上的增强,两者可以协同工作。

NIO.2 (Java 7+)的主要增强:

  • Files - 工具类,提供静态方法
  • Paths - 路径操作
  • Path - 路径表示
  • WatchService - 文件系统监视
  • FileVisitor - 目录遍历接口
  • FileSystem - 文件系统操作

文件读取和写入:

  • 使用Files类进行读写
    • 字符读写:Files + Paths + Path + List
    • 字节读写:Files + Paths + Path + byte[]
  • 使用BufferedReader/BufferedWriter(NIO版本)
    • BufferedReader/BufferedWriter:Files + Paths + Path + BufferedReader/BufferedWriter
  • 与NIO协同工作:Files + Paths + Path + FileChannel + ByteBuffer

优点:

  1. 更强大的Files工具类
    List lines = Files.readAllLines(Paths.get("file.txt"));
    Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
  2. 更好的目录遍历支持
    try (Stream paths = Files.walk(Paths.get("dir"))) {
    paths.filter(Files::isRegularFile)
    .forEach(System.out::println);
    }

缺点:

  1. 学习曲线较陡,概念复杂,API庞大
  2. 内存使用问题:大文件读取的内存压力
  3. 性能开销:小文件操作可能更慢

总结

  • 简单性优先:传统IO(适合初学者、简单场景)
  • 性能优先:NIO Channel(适合大文件、高性能需求)
  • 功能优先:NIO.2 Files类(适合现代应用开发)
  • 兼容性考虑:根据项目环境和团队技能选择
特性 传统IO (java.io) NIO (java.nio) NIO.2 (java.nio.file)
引入版本 Java 1.0 Java 1.4 Java 7
编程模型 阻塞IO 非阻塞IO + 选择器 异步IO + 完整文件系统API
核心概念 流(Stream) 通道(Channel) + 缓冲区(Buffer) Path + Files工具类
性能 一般 较高 最高
易用性 简单 复杂 简单(高级API)
功能完整性 基础 中等 完整

根据需求选择技术:

需求场景 推荐技术 理由
简单文本读写 NIO.2的Files类 代码简洁,功能完善
大文件处理 NIO的FileChannel 高性能,内存映射支持
二进制文件 NIO的ByteBuffer 精确控制,性能优秀
目录遍历 NIO.2的Files.walk() 功能强大,使用简单
文件监视 NIO.2的WatchService 传统IO不支持此功能
网络编程 NIO的Selector 非阻塞IO,高并发
兼容老系统 传统IO 最大兼容性

简单总结

  1. 传统IO:适合简单场景、老项目维护、学习基础概念
  2. NIO:适合高性能需求、大文件处理、网络编程
  3. NIO.2:适合新项目开发、复杂文件操作、现代API需求

现代Java开发推荐优先使用NIO.2,它在易用性、功能和性能之间取得了最佳平衡。只有在特定性能需求或兼容性要求时,才考虑使用传统IO或基础NIO。

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

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

相关文章

opencart做外贸网站怎样新乡手机网站建设官网

不需要选中整行,执行光标所在行,按F8就可直接执行; 工具—>首选项—>SQL窗口—>自动选择,勾选自动选择即可。 这样光标放在此行,按F8就可以执行,需要注意的是sql语句必须以分号结束。下期更新

免费个人博客网站模板下载新县住房和城乡规划建设局网站

24年重庆三支一扶报名照不通过怎么处理?

自我介绍与规划

关于我自己: 目前就读于中南林业科技大学涉外学院大数据专业大三,在过往的学习生活里,我更像 “安静的追赶者”—— 成绩稳定在班级中上游,上课认真记笔记、作业按时完成,却很少主动在课堂上发言或参与小组牵头工…

软件工程学习日志2025.9.25

今天我完成了软件设计课程的作业,这是一个非常有用的多语言翻译服务。以下是我的实践总结: 技术实现要点API调用流程 • 注册百度AI开放平台账号并创建应用• 获取API Key和Secret Key • 使用官方SDK进行接口调用核…

从50ms到30ms:YOLOv10部署中图像预处理的性能优化实践 - 实践

从50ms到30ms:YOLOv10部署中图像预处理的性能优化实践 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

申请域名流程后怎样做网站装潢设计软件免费

转自:http://www.ruanyifeng.com/blog/2012/09/linus_torvalds.html作者: 阮一峰日期: 2012年9月 3日除了程序员,大概很少人知道Linux操作系统。它的发明者Linus Torvalds,知道的人就更少了。他本人也很低调&#xff0…

大兴做网站公司wordpress首页布局修改

来源:新华社第17届亚洲-太平洋通讯社组织(亚通组织)全体大会8日在韩国首尔闭幕。大会颁发了亚通组织卓越通讯社品质奖,中国新华通讯社与越南通讯社分别获奖。这是亚通组织主席、阿塞拜疆国家新闻社社长阿斯兰阿斯兰诺夫&#xff0…

苏联的经典数学教材

苏联的经典数学教材苏联的数学教材以其体系严谨、逻辑缜密、内容深刻而享誉世界,形成了独具特色的“苏联学派”风格。这些教材通常不满足于简单地呈现知识,而是致力于培养学生严格的数学思维和独立的解题能力。其典型…

java课基础问题整理与解答

java课基础问题整理与解答常量与变量定义示例 public class cyj { // 1. 定义全局常量,全局变量在项目中通用 public static final int MAX_VALUE = 512; // 2. 定义局部常量,局部变量在本类中使用 private static f…

redis实现分布式锁1

在集群下的并发问题:业务流程:具体实现: ILock点击查看代码package com.hmdp.utils;public interface ILock {// 获取锁boolean tryLock(long timeoutSec);// 释放锁void unlock(); }SimpleRedisLock点击查看代码pa…

网页设计基础知识总结如何优化网站推广

原文地址:http://www.cnblogs.com/yinzixin/archive/2012/11/30/entity-framework-dynamic-query.html Dynamic Query是一个支持动态Entity Framework查询的库。它的设计初衷是为了减少在管理系统中大量出现的对一个数据集进行查找、排序、分页的这类场景的开发工作…

对软件工程的理解:从 “写代码” 到 “系统工程” 的认知跃迁

对软件工程的理解:从 “写代码” 到 “系统工程” 的认知跃迁在接触《软件工程》课程前,我对软件开发的认知停留在“用代码实现功能”的单一维度,认为只要熟练掌握 Python(我最常用的开发语言),能写出可运行的程…

深入解析:Python9-逻辑回归-决策树

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:(13)GPS/无GPS转换

完整教程:(13)GPS/无GPS转换pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

石家庄网站开发设计asp源码打开网站

生日是一个人在一年中比较特殊的日子之一,人们通常希望能够在这一天得到亲朋好友的祝福和庆祝。然而,随着人们生活节奏的加快,很多人表示自己很容易忘记他人的生日,导致不能够及时送出祝福和礼物。如果经常忘记亲朋好友的生日&…

网站建设主要包括用jquery做的书籍网站

机器学习编译MLC 1. 引言2. 机器学习编译--概述2.1 什么是机器学习编译 1. 引言 陈天奇目前任教于CMU,研究方向为机器学习系统。他是TVM、MXNET、XGBoost的主要作者。2022年夏天,陈天奇在B站开设了《机器学习编译》的课程。   《机器学习编译》课程共分…

在百度做推广需要网站吗质量最好的购物平台

C 语言 break和continue语句 C 语言 break break语句在遇到循环时将立即结束循环。其语法为: break; break语句几乎总是与if…else循环内的语句一起使用。 示例1:break语句 //程序计算最多10个数字的总和 //如果输入负数,则循环终止 includ…

Transformer自回归关键技术:掩码注意力原理与PyTorch完整实现

掩码注意力(Causal Attention)是生成式模型的核心技术,它传统自注意力机制有根本的不同,掩码注意力限制模型只能关注当前位置之前的tokens,确保了自回归生成的因果性。 自注意力的掩码 自注意力机制在Transformer…

深入解析:SQL 字符串函数高频考点:LIKE 和 SUBSTRING 的区别

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第四篇

今天是9月25号,今天又不发工资,烦死了,不写了。