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

在这里插入图片描述

相关文章
|
28天前
|
前端开发 JavaScript Java
java常用数据判空、比较和类型转换
本文介绍了Java开发中常见的数据处理技巧,包括数据判空、数据比较和类型转换。详细讲解了字符串、Integer、对象、List、Map、Set及数组的判空方法,推荐使用工具类如StringUtils、Objects等。同时,讨论了基本数据类型与引用数据类型的比较方法,以及自动类型转换和强制类型转换的规则。最后,提供了数值类型与字符串互相转换的具体示例。
|
2天前
|
存储 Java BI
java怎么统计每个项目下的每个类别的数据
通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
38 17
|
2月前
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
26 3
|
2月前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
2月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
125 2
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
37 2
|
2月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
70 2
|
9天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
11天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
11天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。