【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();
}

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

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();
}

输出结果:

true
1
2
333
4444
55555
666666.6
7777777.77
水滴

系列文章

🔥 【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 教程:从入门到精通

在这里插入图片描述

相关文章
|
19天前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
116 3
|
25天前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
59 16
|
2月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
2月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
传感器 分布式计算 安全
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
本文围绕 Java 大数据在智能安防入侵检测系统中的应用展开,剖析系统现状与挑战,阐释多源数据融合及分析技术,结合案例与代码给出实操方案,提升入侵检测效能。
|
6月前
|
自然语言处理 Java 关系型数据库
Java|小数据量场景的模糊搜索体验优化
在小数据量场景下,如何优化模糊搜索体验?本文分享一个简单实用的方案,虽然有点“土”,但效果还不错。
92 0
|
7月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
Java 开发者 Windows
Java 数据类型划分(字符型)|学习笔记
快速学习 Java 数据类型划分(字符型)
175 0
|
Java 开发者
Java 数据类型划分(整型类型)|学习笔记
快速学习 Java 数据类型划分(整型类型)
141 0
|
Java 开发者
Java 数据类型划分(初见 String 类)|学习笔记
快速学习 Java 数据类型划分(初见 String 类)
139 0