【Java I/O 流】数据输入输出流:DataInputStream 和 DataOutputStream

简介: 数据流与要是将 Java 的基础数据类型读取或写入流中,它有如下特点:> 数据流是一个处理流,它必须套接在节点流之上。数据流在读取和写入时的顺序要一致。否则,读取的数据会失真,造成乱码。

在这里插入图片描述

❤️ 个人主页: 水滴技术
🚀 支持水滴: 点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏: Java 教程:从入门到精通

大家好,我是水滴~~

数据流与要是将 Java 的基础数据类型读取或写入流中,它有如下特点:

数据流是一个处理流,它必须套接在节点流之上。
数据流在读取和写入时的顺序要一致。否则,读取的数据会失真,造成乱码。

DataOutputStream(数据输出流)

数据输出流是一个处理流,它必须套接在一个节点流之上,比如: FileOutputStreamByteArrayOutputStream 等。

构造函数

DataOutputStream 只有一个构造函数。

DataOutputStream(OutputStream out)

创建一个数据输出流的实例,入参是一个字节流,可以是 FileOutputStreamByteArrayOutputStream 等节点流实例。

常用方法

DataOutputStream 继承了 FilterOutputStream ,而 FilterOutputStream 又继承了 OutputStream,该数据输出流拥有常规的写入操作。

数据输出流提供了一些额外的写入方法,用于写入 Java 基础数据类型的数据:

方法名 字节数 描述
writeBoolean(boolean v) 1 写入一个 boolean 类型数据
writeByte(int v) 1 写入一个 byte 类型数据
writeShort(int v) 2 写入一个 short 类型数据
writeChar(int v) 2 写入一个 char 类型数据
writeInt(int v) 4 写入一个 int 类型数据
writeLong(long v) 8 写入一个 long 类型数据
writeFloat(float v) 4 写入一个 float 类型数据
writeDouble(double v) 8 写入一个 double 类型数据
writeUTF(String str) / 写入一个 String 类型数据,编码格式为 UTF-8

代码示例

该代码使用 FileOutputStream 做为节点流,往文件中输入数据。

代码示例:

public static void write1() throws IOException {
    // 创建一个文件输出流实例
    FileOutputStream fos = new FileOutputStream("c:/io/12_1.txt");
    // 创建一个数据输出流,并使用文件输出流作为底层流
    DataOutputStream dos = new DataOutputStream(fos);

    // 写入一个 boolean 型
    dos.writeBoolean(true);
    // 写入一个 byte 型
    dos.writeByte(1);
    // 写入一个 char 型
    dos.writeChar('2');
    // 写入一个 short 型
    dos.writeShort(333);
    // 写入一个 int 型
    dos.writeInt(4444);
    // 写入一个 long 型
    dos.writeLong(55555);
    // 写入一个 float 型
    dos.writeFloat(666666.6f);
    // 写入一个 double 型
    dos.writeDouble(7777777.77);
    // 写入一个 String 型,编码格式为 UTF-8
    dos.writeUTF("水滴");

    // 关闭流并释放资源
    dos.close();
}
AI 代码解读

输出的文件不能被直接查看,内容为乱码,必须使用数据输入流读取,并且读取顺序要与写入顺序一致。

DataInputStream(数据输入流)

数据输入流同样是一个处理流,它也必须套接在一个节点流之上,比如:FileInputStream、ByteArrayInputStream 等。

构造函数

DataInputStream 只有一个构造函数。

DataInputStream(InputStream in)

创建一个数据输入流的实例,入参是一个字节流,可以是 FileInputStreamByteArrayInputStream 等节点流实例。

常用方法

DataInputStream 继承了 FilterInputStream ,而 FilterInputStream 又继承了 InputStream,该数据输出流拥有常规的写入操作。

数据输入流提供了一些额外的读取方法,用于读取 Java 基础数据类型的数据:

方法名 字节数 描述
boolean readBoolean() 1 读取一个 boolean 类型数据
byte readByte() 1 读取一个 byte 类型数据
readShort() 2 读取一个 short 类型数据
readChar() 2 读取一个 char 类型数据
int readInt() 4 读取一个 int 类型数据
long readLong() 8 读取一个 long 类型数据
float readFloat() 4 读取一个 float 类型数据
double readDouble() 8 读取一个 double 类型数据
String readUTF() / 读取一个 String 类型数据,编码格式为 UTF-8

代码示例

读取的数据顺序必要要与写入一致,下面代码与DataOutputStream 的代码示例顺序一致,可以正常读取。

代码示例:

public static void read1() throws IOException {
    // 创建一个文件输入流,做为节点流
    FileInputStream fis = new FileInputStream("c:/io/12_1.txt");

    // 创建一个数据输入流,做为转换流
    DataInputStream dis = new DataInputStream(fis);
    // 读取一个 boolean 型
    System.out.println(dis.readBoolean());
    // 读取一个 byte 型
    System.out.println(dis.readByte());
    // 读取一个 char 型
    System.out.println(dis.readChar());
    // 读取一个 short 型
    System.out.println(dis.readShort());
    // 读取一个 int 型
    System.out.println(dis.readInt());
    // 读取一个 long 型
    System.out.println(dis.readLong());
    // 读取一个 float 型
    System.out.println(dis.readFloat());
    // 读取一个 double 型
    System.out.println(dis.readDouble());
    // 读取一个 String 型,编码格式为 UTF-8
    System.out.println(dis.readUTF());

    // 关闭流并释放资源
    dis.close();
}
AI 代码解读

输出结果:

true
1
2
333
4444
55555
666666.6
7777777.77
水滴
AI 代码解读

系列文章

🔥 【Java I/O 流】文件的操作——java.io.File 类详解

🔥 【Java I/O 流】I/O 流的原理与流的分类

🔥 【Java I/O 流】字节输入输出流:InputStream & OutputStream

🔥 【Java I/O 流】文件字节输入输出流:FileInputStream & FileOutputStream(文件读写案例)

🔥 【Java I/O 流】字符输入输出流:Reader 和 Writer

🔥 【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter

🔥 【Java I/O 流】字节缓冲流:BufferedInputStream 和 BufferedOutputStream

🔥 【Java I/O 流】字符缓冲流:BuffreadReader 和 BufferedWriter

🔥 【Java I/O 流】字节数组流:ByteArrayInputStream 和 ByteArrayOutputStream

热门专栏

👍 《Java 教程:从入门到精通

👍 《MySQL 教程:从入门到精通

在这里插入图片描述

相关文章
Java|小数据量场景的模糊搜索体验优化
在小数据量场景下,如何优化模糊搜索体验?本文分享一个简单实用的方案,虽然有点“土”,但效果还不错。
56 0
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
126 4
|
6月前
|
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
150 21
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
205 7
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
643 1
Java多线程基础
本文主要讲解多线程相关知识,分为两部分。第一部分涵盖多线程概念(并发与并行、进程与线程)、Java程序运行原理(JVM启动多线程特性)、实现多线程的两种方式(继承Thread类与实现Runnable接口)及其区别。第二部分涉及线程同步(同步锁的应用场景与代码示例)及线程间通信(wait()与notify()方法的使用)。通过多个Demo代码实例,深入浅出地解析多线程的核心知识点,帮助读者掌握其实现与应用技巧。
|
5月前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
304 60
【Java并发】【线程池】带你从0-1入门线程池
|
3月前
|
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
149 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问