输入与输出(I/O):文件与数据流的处理艺术!
全文目录:
- 开篇语
- 前言
- 一、文件读写:File、BufferedReader、BufferedWriter等
- 1.1 使用 `File` 类进行文件操作
- 代码示例:使用 `File` 类操作文件
- 1.2 使用 `BufferedReader` 和 `BufferedWriter`
- 代码示例:使用 `BufferedReader` 读取文件
- 代码示例:使用 `BufferedWriter` 写入文件
- 二、数据流:DataInputStream、DataOutputStream
- 2.1 使用 `DataInputStream` 读取数据
- 代码示例:使用 `DataInputStream` 读取数据
- 2.2 使用 `DataOutputStream` 写入数据
- 代码示例:使用 `DataOutputStream` 写入数据
- 三、对象序列化与反序列化:ObjectInputStream、ObjectOutputStream
- 3.1 对象序列化与反序列化
- 代码示例:对象序列化与反序列化
- 四、NIO(New I/O)简介
- 4.1 基本 NIO 操作
- 代码示例:使用 NIO 读取文件
- 总结:高效的输入输出处理
- 文末
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!