全文目录:
开篇语
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
在 Java 编程中,输入与输出(I/O)是非常常见且关键的操作。无论是从文件中读取数据,还是将数据写入文件,或者通过网络发送和接收信息,I/O 都是不可或缺的部分。今天,我们将深入探讨 Java 中的文件读写、数据流的使用、对象序列化与反序列化,以及新一代 I/O(NIO)的基本概念和使用方式。
一、文件读写:File、BufferedReader、BufferedWriter等
在 Java 中,文件 I/O 操作通常涉及几个重要的类,例如 File
、BufferedReader
、BufferedWriter
等,它们帮助我们实现文件的读取、写入和处理。
1.1 使用 File
类进行文件操作
File
类主要用于表示文件和目录,它可以用于检查文件是否存在、创建文件或目录、删除文件等基本操作。
代码示例:使用 File
类操作文件
import java.io.File;
import java.io.IOException;
public class FileExample {
public static void main(String[] args) {
File file = new File("example.txt");
// 创建文件
try {
if (file.createNewFile()) {
System.out.println("文件创建成功!");
} else {
System.out.println("文件已存在。");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
createNewFile()
方法尝试创建一个新文件。如果文件已经存在,方法将返回 false
。
1.2 使用 BufferedReader
和 BufferedWriter
BufferedReader
和 BufferedWriter
提供了缓冲功能,可以高效地进行文本的读取和写入操作。BufferedReader
用于读取字符输入流,BufferedWriter
用于写入字符输出流。
代码示例:使用 BufferedReader
读取文件
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedReader
的 readLine()
方法用于按行读取文本文件内容,直到文件结束。
代码示例:使用 BufferedWriter
写入文件
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterExample {
public static void main(String[] args) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
writer.write("Hello, Java I/O!");
writer.newLine(); // 写入换行符
writer.write("BufferedWriter is fast.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedWriter
的 write()
方法用于写入数据,newLine()
方法用于写入平台独立的换行符。
二、数据流:DataInputStream、DataOutputStream
Java 提供了数据流(Data Stream)来支持读取和写入原始数据类型(如 int
、float
、double
等)。DataInputStream
和 DataOutputStream
类用于高效地读写这些原始数据。
2.1 使用 DataInputStream
读取数据
DataInputStream
用于读取基础数据类型,例如 int
、long
、float
等,保证从流中读取数据时不发生数据丢失。
代码示例:使用 DataInputStream
读取数据
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class DataInputStreamExample {
public static void main(String[] args) {
try (DataInputStream dis = new DataInputStream(new FileInputStream("data.dat"))) {
int intValue = dis.readInt();
double doubleValue = dis.readDouble();
System.out.println("读取的整数: " + intValue);
System.out.println("读取的浮点数: " + doubleValue);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在此例中,DataInputStream
从 data.dat
文件中读取整数和浮点数。读取数据时,类型必须与写入时的类型匹配。
2.2 使用 DataOutputStream
写入数据
DataOutputStream
用于将原始数据类型写入流,它能够保证数据以标准格式写入。
代码示例:使用 DataOutputStream
写入数据
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataOutputStreamExample {
public static void main(String[] args) {
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.dat"))) {
dos.writeInt(123); // 写入整数
dos.writeDouble(45.67); // 写入浮点数
} catch (IOException e) {
e.printStackTrace();
}
}
}
在此例中,DataOutputStream
将一个整数和一个浮点数写入到 data.dat
文件。
三、对象序列化与反序列化:ObjectInputStream、ObjectOutputStream
对象序列化(Serialization)是指将对象转换为字节流的过程,反序列化(Deserialization)是将字节流转换为对象的过程。ObjectInputStream
和 ObjectOutputStream
提供了这两个操作。
3.1 对象序列化与反序列化
要进行对象序列化,类必须实现 Serializable
接口。该接口标记类的对象可以被序列化。
代码示例:对象序列化与反序列化
import java.io.*;
// 定义一个类,实现 Serializable 接口
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) {
// 创建对象并序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
Person person = new Person("John", 30);
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化对象
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();
}
}
}
在此例中,我们将 Person
对象序列化为字节流存储到 person.ser
文件中,然后再通过反序列化读取该对象并恢复其内容。
四、NIO(New I/O)简介
NIO(New I/O)是 Java 提供的另一种 I/O 库,用于进行更高效的 I/O 操作,尤其在大规模数据处理和高并发场景中表现更好。NIO 的核心组件包括:
- Buffer:用来存储数据的容器。
- Channel:与 Buffer 进行数据交互的通道。
- Selector:用于非阻塞模式下多路复用的选择器。
NIO 的主要优势是支持异步和非阻塞 I/O,这使得它非常适合于网络编程和大文件处理。
4.1 基本 NIO 操作
代码示例:使用 NIO 读取文件
import java.nio.file.*;
import java.io.IOException;
public class NIOExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
String content = new String(Files.readAllBytes(path));
System.out.println("文件内容: " + content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
这个例子展示了如何使用 NIO 中的 Files.readAllBytes()
方法读取文件内容。与传统的 I/O 操作相比,NIO 提供了更强大的灵活性和效率,尤其在高性能应用中。
总结:高效的输入输出处理
Java 的 I/O 库提供了多种工具来处理文件、数据流、对象序列化等操作。在处理文件和数据时,使用合适的类可以显著提升代码的效率和可读性。传统的 I/O(如 BufferedReader
和 BufferedWriter
)适用于一般场景,而数据流和对象序列化提供了对原始数据和对象的高效操作。此外,Java 的 NIO 库为处理大规模数据和高并发应用提供了更高效的解决方案。
掌握这些 I/O 技巧后,你的程序在文件操作、数据处理和并发编程方面将更加得心应手!
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!