文件 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)
字节流用于处理所有类型的输入输出,包括图片、音频、视频等二进制数据。字节流的基类分别是 InputStream
和 OutputStream
,它们定义了从文件或其他数据源读取字节以及写入字节的方法。
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)
字符流是用于处理字符数据(即文本文件)的输入输出流。与字节流不同,字符流可以自动处理字符编码问题,确保文本数据在不同平台之间的正确传输。字符流的基类是 Reader
和 Writer
,它们分别定义了从文件中读取字符和写入字符的方法。
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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
- 点赞
- 收藏
- 关注作者
评论(0)