(每日持续更新)jdk api之DataInputStream基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

一、java.io

1.15 DataInputStream

DataInputStream 类是 DataInput 接口的实现类,它提供了一组用于从输入流中读取基本数据类型的方法。DataInputStream 允许应用程序以原始数据类型的形式从输入流中读取数据。

以下是关于 DataInputStream 类的主要信息:

DataInputStream 类介绍:
  • 包路径: java.io

  • 父类: FilterInputStream

  • 实现接口: DataInput

DataInputStream 类所有字段:

DataInputStream 类没有定义任何字段。

DataInputStream 类构造方法:
  1. DataInputStream(InputStream in)

    • 构造一个新的 DataInputStream,给定底层输入流 in

DataInputStream 类方法摘要:

以下是一些主要的方法,继承自 DataInput 接口:

  1. int read(byte[] b)

    • 从输入流中读取一些字节数,并将它们存储到缓冲区数组 b 中。

  2. boolean readBoolean()

    • 从输入流中读取一个布尔值。

  3. byte readByte()

    • 从输入流中读取一个字节。

  4. char readChar()

    • 从输入流中读取一个字符。

  5. double readDouble()

    • 从输入流中读取一个双精度浮点数。

  6. float readFloat()

    • 从输入流中读取一个单精度浮点数。

  7. void readFully(byte[] b)

    • 从输入流中读取字节数组,并将其存储到指定的字节数组 b 中。

  8. void readFully(byte[] b, int off, int len)

    • 从输入流中读取指定长度的字节数组,并将其存储到指定的字节数组 b 中,从数组的偏移位置 off 开始。

  9. int readInt()

    • 从输入流中读取一个整数。

  10. String readLine()

    • 从输入流中读取一行文本。

  11. long readLong()

    • 从输入流中读取一个长整数。

  12. short readShort()

    • 从输入流中读取一个短整数。

  13. int readUnsignedByte()

    • 从输入流中读取一个无符号字节,将其作为 int 返回。

  14. int readUnsignedShort()

    • 从输入流中读取一个无符号短整数,将其作为 int 返回。

  15. String readUTF()

    • 从输入流中读取以修饰符长度前缀编码的字符串。

简单使用例子:

以下是一个简单的例子,演示了如何使用 DataInputStream 从二进制文件中读取基本数据类型的信息:

javaCopy code
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
​
public class DataInputStreamExample {
​public static void main(String[] args) {try (DataInputStream dataInputStream = new DataInputStream(new FileInputStream("data.dat"))) {// 从输入流中读取不同类型的数据boolean boolValue = dataInputStream.readBoolean();byte byteValue = dataInputStream.readByte();short shortValue = dataInputStream.readShort();int intValue = dataInputStream.readInt();long longValue = dataInputStream.readLong();float floatValue = dataInputStream.readFloat();double doubleValue = dataInputStream.readDouble();String stringValue = dataInputStream.readUTF();
​// 打印读取的数据System.out.println("Boolean: " + boolValue);System.out.println("Byte: " + byteValue);System.out.println("Short: " + shortValue);System.out.println("Int: " + intValue);System.out.println("Long: " + longValue);System.out.println("Float: " + floatValue);System.out.println("Double: " + doubleValue);System.out.println("String: " + stringValue);
​} catch (IOException e) {e.printStackTrace();}}
}

在这个例子中,我们使用 DataInputStream 包装一个 FileInputStream,然后通过 DataInput 接口的方法逐个读取不同类型的数据。这个例子假设存在一个名为 "data.dat" 的二进制数据文件。

使用场景

DataInputStream 主要用于从输入流中读取基本数据类型的二进制数据。以下是一些使用场景:

  1. 文件解析: 当需要从二进制文件中读取原始数据类型的信息时,例如读取自定义格式的配置文件或数据文件。

    javaCopy code
    try (DataInputStream dataInputStream = new DataInputStream(new FileInputStream("config.dat"))) {int intValue = dataInputStream.readInt();float floatValue = dataInputStream.readFloat();// 处理读取的数据
    } catch (IOException e) {e.printStackTrace();
    }
  2. 网络通信: 在网络通信中,可以使用 DataInputStream 从输入流中读取二进制数据,以解析从网络接收到的消息。

    javaCopy code
    try (DataInputStream dataInputStream = new DataInputStream(socket.getInputStream())) {int messageLength = dataInputStream.readInt();byte[] messageData = new byte[messageLength];dataInputStream.readFully(messageData);// 处理接收到的消息数据
    } catch (IOException e) {e.printStackTrace();
    }
  3. 序列化: 在使用自定义的序列化格式时,可以使用 DataInputStream 读取对象的二进制表示。

    javaCopy code
    try (DataInputStream dataInputStream = new DataInputStream(new FileInputStream("serialized_data.dat"))) {int intValue = dataInputStream.readInt();String stringValue = dataInputStream.readUTF();// 从二进制数据中重新构造对象MyObject reconstructedObject = new MyObject(intValue, stringValue);
    } catch (IOException e) {e.printStackTrace();
    }
  4. 数据导入: 当需要从二进制数据源中导入原始数据类型时,例如从数据库中读取二进制数据列。

    javaCopy code
    try (DataInputStream dataInputStream = new DataInputStream(databaseInputStream)) {int intValue = dataInputStream.readInt();float floatValue = dataInputStream.readFloat();// 处理读取的数据
    } catch (IOException e) {e.printStackTrace();
    }

总体而言,DataInputStream 的主要应用场景是在需要读取原始数据类型的二进制数据时,提供了方便的方法来逐个读取各种基本数据类型。注意,对于对象的序列化和反序列化,通常会使用 ObjectInputStream,它实现了 ObjectInput 接口。

实战例子

在实际项目中,使用 DataInputStream 的复杂场景通常涉及更复杂的数据结构和业务逻辑。下面是一个简化的示例,假设有一个二进制文件 "order_data.dat",其中包含了订单信息,包括订单编号、客户姓名、商品列表等。

首先,我们定义一个 Order 类来表示订单信息:

javaCopy code
import java.io.Serializable;
import java.util.List;
​
public class Order implements Serializable {private static final long serialVersionUID = 1L;
​private int orderId;private String customerName;private List<String> products;
​// 省略构造方法和其他方法
​// Getter 和 Setter 方法// ...
}

然后,我们可以编写一个订单数据读取器类来从二进制文件中读取订单信息:

javaCopy code
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
​
public class OrderDataReader {
​public static void main(String[] args) {try (DataInputStream dataInputStream = new DataInputStream(new FileInputStream("order_data.dat"))) {List<Order> orders = new ArrayList<>();
​// 读取每个订单的信息while (dataInputStream.available() > 0) {int orderId = dataInputStream.readInt();String customerName = dataInputStream.readUTF();int productCount = dataInputStream.readInt();
​List<String> products = new ArrayList<>();for (int i = 0; i < productCount; i++) {String productName = dataInputStream.readUTF();products.add(productName);}
​// 创建 Order 对象并添加到列表中Order order = new Order(orderId, customerName, products);orders.add(order);}
​// 处理读取的订单信息,例如存储到数据库或进行其他业务操作for (Order order : orders) {System.out.println("Order ID: " + order.getOrderId());System.out.println("Customer Name: " + order.getCustomerName());System.out.println("Products: " + order.getProducts());System.out.println("-----------");}
​} catch (IOException e) {e.printStackTrace();}}
}

在这个示例中,我们按照一定的格式将订单信息写入到二进制文件 "order_data.dat" 中,然后使用 DataInputStream 逐个读取每个订单的信息。该示例包含了订单编号、客户姓名和商品列表,实际项目中可能还需要考虑更多的信息和复杂的业务逻辑。

请注意,这只是一个简化的示例,实际项目中可能需要更多的数据验证、错误处理和完整的业务逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/613005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发下的计数器实现方式:AtomicLong、LongAdder、LongAccumulator

一、前言 计数器是并发编程中非常常见的一个需求&#xff0c;例如统计网站的访问量、计算某个操作的执行次数等等。在高并发场景下&#xff0c;如何实现一个线程安全的计数器是一个比较有挑战性的问题。本文将介绍几种常用的计数器实现方式&#xff0c;包括AtomicLong、LongAd…

超市账单管理系统产品数据新增Servlet实现

超市账单管理系统产品数据新增Servlet实现 package com.test.controller; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import ja…

3.4 在开发中使用设计模式

现在&#xff0c;我们应该对设计模式的本质以及它们的组织方式有了初步的认识&#xff0c;并且能够理解ROPES过程在整体设计中的作用。通过之前章节对“体系结构”及其五个视图的探讨&#xff0c;我们打下了坚实的基础。初步了解了UML的基本构建模块后&#xff0c;我们现在可以…

gem5学习(11):将缓存添加到配置脚本中——Adding cache to the configuration script

目录 一、Creating cache objects 1、Classic caches and Ruby 二、Cache 1、导入SimObject(s) 2、创建L1Cache 3、创建L1Cache子类 4、创建L2Cache 5、L1Cache添加连接函数 6、为L1ICache和L1DCache添加连接函数 7、为L2Cache添加内存侧和CPU侧的连接函数 完整代码…

适用于安防 音响 车载等产品中中的音频接口选型分析

在人工智能兴起之后&#xff0c;安防市场就成为了其全球最大的市场&#xff0c;也是成功落地的最主要场景之一。对于安防应用而言&#xff0c;智慧摄像头、智慧交通、智慧城市等概念的不断涌现&#xff0c;对于芯片产业催生出海量需求。今天&#xff0c;我将为大家梳理GLOBALCH…

自动化测试框架pytest系列之强大的fixture功能,为什么fixture强大?一文拆解它的功能参数。(三)

自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 自动化测试框架pytest系列之21个命令行参数介绍(二)-CSDN博客 接上两篇文章继续 &#xff1a; 3.3 pytest支持的初始化和清除函数 学过unittest的都知道 &#xff0c;unittest有四个函数 &#xff0c;分别是 &#xff…

16.linux计划任务管理

linux计划任务管理 文章目录 linux计划任务管理1. crond计划任务概述2. crond配置文件详解3. crond计划任务管理4. crond配置编写实例5. crond计划任务调试 1. crond计划任务概述 什么是计划任务&#xff0c;计划任务类似于我们平时生活中的闹钟。 在Linux系统的计划任务服务c…

判断是否是json字符串

一、在isJson.js文件里创建一个isJson类并抛出 /*** isJson 类用于判断一个字符串是否为有效的 JSON 字符串。* class isJson* param {string} str - 要判断的字符串。* returns {boolean} 如果字符串是有效的 JSON 字符串&#xff0c;则返回 true&#xff1b;否则返回 false。…

PPT插件-大珩助手-快速构建自己的图形

绘图板-快速构建自己的图形 通过手绘的方式&#xff0c;快速构建自己的想法和创意&#xff0c;通过在PPT中插入绘图&#xff0c;植入背景透明的绘图&#xff0c;点击画笔可切换橡皮擦&#xff0c;可以清空画板重新绘制。 素材库-存储图形 通过素材库存储自己的图形 图形调整…

操作系统期末考复盘

简答题4题*5 20分计算题2题*5 10分综合应用2题*10 20分程序填空1题10 10分 1、简答题&#xff08;8抽4&#xff09; 1、在计算机系统上配置OS的目标是什么&#xff1f;作用主要表现在哪个方面&#xff1f; 在计算机系统上配置OS&#xff0c;主要目标是实现:方便性、有…

如何把123转换成字符串的123

在许多编程语言中&#xff0c;将数字123转换为字符串的"123"是非常直接的。以下是几种常见编程语言的示例&#xff1a; Python num 123 str_num str(num) print(str_num) # 输出: 123 JavaScript let num 123; let str_num num.toString(); console…

【WebGIS实例】(12)MapboxGL解决叠加图层的点击事件冒泡

解决方法一&#xff1a; 监听有冲突的图层 map.on(click, layerName, e > {e.preventDefault()console.log(上面的图层)console.log(点击的要素, e.features[0]) })// 下面的那个图层&#xff1a;阻止默认事件&#xff0c;在下面的e可以看到_defaultPrevented: false&#…

three.js 学习笔记(学习中1.10更新) |

文章目录 three.js 学习笔记基础概念透视相机 第一个three.js应用threejs画布尺寸和布局canvas画布宽高度动态变化 坐标辅助器 THREE.AxesHelper实现动画效果requestAnimationFrame时间相关属性和方法 THREE.Clock类 相机控件 轨道控制器OrbitControls 灯光点光源点光源辅助观察…

17.SELinux

SELinux 文章目录 SELinux1、SELinux简介2、SELinux的模式3、管理SELinux上下文4、bool开关 1、SELinux简介 为了保障linux系统的安全&#xff0c;除了firewalld防火墙外&#xff0c;linux系统管理员通常会控制用户和组的权限&#xff0c;这种基于用户和组的安全模型称之为主动…

m1 + swoole(hyperf) + yasd + phpstorm 安装和debug

参考文档 Mac M1安装报错 checking for boost... configure: error: lib boost not found. Try: install boost library Issue #89 swoole/yasd GitHub 1.安装boost库 brew install boostbrew link boost 2.下载yasd git clone https://github.com/swoole/yasd.git 3.编…

Golang 中哪些类型可以作为 map 类型的 key?

目录 可以作为 map 键的类型 不能作为 map 键的类型 最佳实践 小结 在 Go 语言中&#xff0c;map 是一种内置的关联数据结构类型&#xff0c;由一组无序的键值对组成&#xff0c;每个键都是唯一的&#xff0c;并与一个对应的值相关联。本文将详细介绍哪些类型的变量可以作为…

轻量化神奇!看3D模型格式转换工具HOOPS Exchange如何轻松实现减面操作?

现在很多CAD模型都比较复杂&#xff0c;有时候为了一些特殊用途&#xff08;轻量化显示、布尔运算、CAE网格剖分等&#xff09;&#xff0c;需要到对原始模型进行减面操作。在HOOPS Exchange中&#xff0c;就提供了对模型进行减面操作支持&#xff0c;以下内容就是HOOPS Exchan…

亚信安慧AntDB数据库容灾复制原理

AntDB数据库作为通信运营商领域的杰出的数据服务提供者&#xff0c;一直以来都十分重视数据安全问题&#xff0c;不断通过技术进步、方案创新等方式提升数据容灾能力。在信息化的时代&#xff0c;数据已经成为了重要的资源&#xff0c;对于企业来说&#xff0c;如何存储和管理这…

15.vdo管理

vdo管理 文章目录 vdo管理一、VDO基本概念二、常用操作三、验证VDO卷 一、VDO基本概念 VDO&#xff08;Virtual Data Optimize虚拟数据优化&#xff09; 通过压缩或删除存储设备上的数据来优化存储空间。VDO层放置在现有块存储设备例如RAID设备或本地磁盘的顶部。这些块设备也…