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

输入与输出(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 操作通常涉及几个重要的类,例如 FileBufferedReaderBufferedWriter 等,它们帮助我们实现文件的读取、写入和处理。

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 使用 BufferedReaderBufferedWriter

BufferedReaderBufferedWriter 提供了缓冲功能,可以高效地进行文本的读取和写入操作。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();}}
}

  BufferedReaderreadLine() 方法用于按行读取文本文件内容,直到文件结束。

代码示例:使用 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();}}
}

  BufferedWriterwrite() 方法用于写入数据,newLine() 方法用于写入平台独立的换行符。


二、数据流:DataInputStream、DataOutputStream

Java 提供了数据流(Data Stream)来支持读取和写入原始数据类型(如 intfloatdouble 等)。DataInputStreamDataOutputStream 类用于高效地读写这些原始数据。

2.1 使用 DataInputStream 读取数据

DataInputStream 用于读取基础数据类型,例如 intlongfloat 等,保证从流中读取数据时不发生数据丢失。

代码示例:使用 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();}}
}

  在此例中,DataInputStreamdata.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)是将字节流转换为对象的过程。ObjectInputStreamObjectOutputStream 提供了这两个操作。

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(如 BufferedReaderBufferedWriter)适用于一般场景,而数据流和对象序列化提供了对原始数据和对象的高效操作。此外,Java 的 NIO 库为处理大规模数据和高并发应用提供了更高效的解决方案。

  掌握这些 I/O 技巧后,你的程序在文件操作、数据处理和并发编程方面将更加得心应手!

… …

文末

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

… …

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

wished for you successed !!!


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

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


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

http://www.xdnf.cn/news/13229.html

相关文章:

  • PHP使用经纬度获取两个位置的距离以及范围查询
  • Deepseek大模型私有化部署
  • 手游刚开服就被攻击怎么办?如何防御DDoS?
  • 香港虚拟主机安装WordPress
  • vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
  • 学习日记-day25-6.9
  • 分布式系统常见的四种数据一致性模型
  • 即梦图片 3.0 智能参考全量上线,开启 AI 设计零门槛新时代
  • 【链接、装载和库】三、目标文件详解
  • 什么是Java bean的依赖注入
  • 在 Figma 中导出图标为 Iconfont
  • img src 图片缓存问题
  • [软件测试]:什么软件测试?如何设计测试用例?
  • 【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
  • vue3 简易的pc端音频播放器组件
  • 编写整洁的python之装饰器
  • Python环境安装与虚拟环境配置详解
  • 打开GitHub网站因为网络原因导致加载失败问题解决方案
  • 什么是OLAP?OLAP具体有哪些应用?
  • 【旧题新解】第 3 集 对齐输出
  • MySQL-事务(TRANSACTION-ACID)管理
  • FEMFAT许可使用监控工具
  • deepseek: 反汇编 难点+ 工具
  • 数控滑台的的发展:映射了机械制造业的技术进步轨迹
  • 数字ic后端设计从入门到精通6(含fusion compiler, tcl教学)repeater详解
  • 站群服务器的应用场景都有哪些?
  • Promise 链式调用:让异步编程更优雅
  • 西门子S7-200SMART 控制Profinet闭环步进MD-4250-PN (4)仿SinaPos控制块
  • Vuex:Vue.js 应用程序的状态管理模式
  • ArcGIS Pro 3.4 二次开发 - 场景图层