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

举报
喵手 发表于 2025/08/24 21:18:06 2025/08/24
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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 !!!


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

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


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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。