当前位置: 首页 > news >正文

文件 Java IO 操作:文件读取、写入与管理!

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在 Java 中,文件操作(File IO)是与外部存储设备进行交互的重要机制,常用于读取和写入文件。Java 提供了丰富的 IO 类库,可以帮助开发者以不同的方式进行文件操作。在这篇文章中,我们将详细讲解 Java 中的文件 IO 操作,包括文件的管理、字节流与字符流、缓冲流与转换流、以及对象的序列化与反序列化。

1. File 类的使用

File 类是 Java IO 中用来表示文件和目录的一个类。通过 File 类,您可以创建文件、删除文件、检查文件是否存在、列出目录内容等操作。注意,File 类本身并不提供文件内容的读取和写入功能,它仅用于文件和目录的基本操作。

1.1 创建 File 对象
import java.io.File;public class FileExample {public static void main(String[] args) {// 创建一个表示文件的 File 对象File file = new File("example.txt");// 检查文件是否存在if (!file.exists()) {try {// 创建一个新文件boolean created = file.createNewFile();if (created) {System.out.println("File created: " + file.getName());} else {System.out.println("File already exists.");}} catch (Exception e) {System.out.println("An error occurred.");e.printStackTrace();}}}
}
1.2 文件管理操作
  • 检查文件是否存在

    file.exists();  // 如果文件存在,返回 true
    
  • 删除文件

    file.delete();  // 删除文件,如果删除成功返回 true
    
  • 获取文件路径

    System.out.println(file.getAbsolutePath());  // 获取文件的绝对路径
    
  • 列出目录中的文件

    File dir = new File("/path/to/directory");
    String[] files = dir.list();  // 获取目录中的所有文件
    for (String file : files) {System.out.println(file);
    }
    

2. 字节流 (InputStream, OutputStream)

字节流用于处理所有类型的输入输出,包括图片、音频、视频等二进制数据。字节流的基类分别是 InputStreamOutputStream,它们定义了从文件或其他数据源读取字节以及写入字节的方法。

2.1 FileInputStream 和 FileOutputStream
  • FileInputStream:用于读取文件中的字节。
  • FileOutputStream:用于将字节写入文件。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteStreamExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("source.txt");FileOutputStream fos = new FileOutputStream("destination.txt")) {int data;while ((data = fis.read()) != -1) {  // 读取字节直到文件结束fos.write(data);  // 写入字节到目标文件}System.out.println("File copied successfully!");} catch (IOException e) {e.printStackTrace();}}
}
2.2 字节流的性能

字节流适用于所有类型的文件,但读取和写入时,通常不会将数据按块进行缓冲,导致性能较低。因此,我们常常将字节流与缓冲流结合使用。

3. 字符流 (Reader, Writer)

字符流是用于处理字符数据(即文本文件)的输入输出流。与字节流不同,字符流可以自动处理字符编码问题,确保文本数据在不同平台之间的正确传输。字符流的基类是 ReaderWriter,它们分别定义了从文件中读取字符和写入字符的方法。

3.1 FileReader 和 FileWriter
  • FileReader:用于读取文件中的字符。
  • FileWriter:用于将字符写入文件。
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class CharStreamExample {public static void main(String[] args) {try (FileReader fr = new FileReader("source.txt");FileWriter fw = new FileWriter("destination.txt")) {int data;while ((data = fr.read()) != -1) {  // 读取字符直到文件结束fw.write(data);  // 写入字符到目标文件}System.out.println("File copied successfully!");} catch (IOException e) {e.printStackTrace();}}
}
3.2 字符流的性能

字符流比字节流更适合处理文本文件,尤其是在不同的字符编码(如 UTF-8 和 UTF-16)之间进行转换时。字符流自动处理字符编码,使得字符数据的读取和写入更加方便。

4. 缓冲流和转换流

4.1 缓冲流 (BufferedStream)

缓冲流通过引入缓存区来提高输入输出的效率,避免了每次读取或写入时都进行物理操作。常用的缓冲流类包括:

  • BufferedReader:用于读取字符数据。
  • BufferedWriter:用于写入字符数据。
  • BufferedInputStream:用于读取字节数据。
  • BufferedOutputStream:用于写入字节数据。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class BufferedStreamExample {public static void main(String[] args) {try (BufferedReader br = new BufferedReader(new FileReader("source.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);  // 逐行读取文件内容}} catch (IOException e) {e.printStackTrace();}}
}
4.2 转换流 (InputStreamReader, OutputStreamWriter)

转换流用于在字节流和字符流之间进行转换。InputStreamReader 可以将字节流转换为字符流,而 OutputStreamWriter 则将字符流转换为字节流。

import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class ConversionStreamExample {public static void main(String[] args) {try (InputStreamReader isr = new InputStreamReader(new FileInputStream("source.txt"));OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("destination.txt"))) {int data;while ((data = isr.read()) != -1) {  // 读取字符osw.write(data);  // 写入字符}} catch (IOException e) {e.printStackTrace();}}
}

5. 对象序列化和反序列化

对象序列化是将对象转换为字节流,以便将其写入文件或通过网络传输。反序列化则是将字节流转换回对象。Java 提供了 Serializable 接口来支持对象的序列化。

5.1 序列化

序列化需要实现 Serializable 接口,标识对象可以被序列化。序列化通常通过 ObjectOutputStream 来完成。

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.IOException;class Person implements Serializable {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}
}public class SerializationExample {public static void main(String[] args) {Person person = new Person("John", 30);try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {oos.writeObject(person);  // 序列化对象System.out.println("Object serialized successfully!");} catch (IOException e) {e.printStackTrace();}}
}
5.2 反序列化

反序列化通过 ObjectInputStream 将文件中的字节流转换回对象。

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;public class DeserializationExample {public static void main(String[] args) {try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {Person person = (Person) ois.readObject();  // 反序列化对象System.out.println("Name: " + person.name + ", Age: " + person.age);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

总结

Java 提供了丰富的 IO 操作类,支持文件的读取、写入和管理。通过字节流、字符流、缓冲流和转换流,您可以高效地处理文件的不同类型。对象序列化和反序列化提供了将对象保存到文件或网络中的能力,极大地便利了数据的存储和传输。

  • 字节流:适用于处理所有类型的数据。
  • 字符流:适用于处理文本数据,自动处理字符编码。
  • 缓冲流:通过缓存区提高 IO 操作的效率。
  • 转换流:用于字节流和字符流之间的转换。
  • 对象序列化:将对象转换为字节流进行存储或传输。

掌握这些文件 IO 技巧后,您将能够轻松地处理各种文件操作,提升开发效率。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

http://www.dtcms.com/a/582071.html

相关文章:

  • 建设移动网站城乡互动联盟网站建设
  • 2026助力发刊:深度学习超导材料与量子器件专题学习
  • asp网站没有数据库连接杨浦网站建设 网站外包
  • 如何做 旅游网站内容山西省住房与城乡建设部网站
  • 网站开发的选题审批表软件培训内容
  • 哈尔滨GPU服务器租用收费标准分析
  • 数据科学每日总结--Day13--数据挖掘
  • Acetylcysteine (NAC) 别名:N-Acetyl-L-cysteine; NAC; 乙酰半胱氨酸(AbMole)
  • 大模型学习3
  • 武警部队电子沙盘和数字沙盘的地磁方位指示器系统
  • Coze搭建企业客服智能体
  • BI需求分析的双层陷阱
  • 鸿蒙三方库httpclient使用
  • 网站开发的发展历史及趋势做网络平台的网站
  • 私有云盘远程用!FileRise+cpolar 让异地存取文件超简单
  • 借助Dify工作流构建AI测试智能体,效率提升可达500%
  • php网站建设与管理游客可进的直播
  • 5种有效增加网站流量沈阳企业网站制作公司
  • mak/Makefile和进度条
  • ip数据报传输过程梳理
  • 2.1 NLP 核心概念回顾:从词袋到 Transformer
  • 做网站的公司 经营范围2017年到2018年建设的网站
  • 东莞网站建设 光龙wordpress 目录 模板下载
  • 时序数据库系列(六):物联网监控系统实战
  • 迁移学习基础知识——迁移学习的问题形式化
  • java基础-ArrayList集合
  • 做网站运营优质做网站价格
  • 【双机位A卷】华为OD笔试之【哈希表】双机位A-采购订单【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
  • 第十章、GPT1:Improving Language Understanding by Generative Pre-Training(代码部分)
  • 2025全球生成式人工智能AIGC产业全景与行业应用研究报告|附900+份报告PDF、数据、可视化模板汇总下载