0

0

详解Java中的DataInputStream与DataOutputStream_原始数据类型的跨平台读写

P粉602998670

P粉602998670

发布时间:2026-02-22 15:58:51

|

393人浏览过

|

来源于php中文网

原创

datainputstream读int卡住或读错,因其严格按大端序读4字节,若写入非dataoutputstream、流截断或对齐错位,会导致阻塞、错误值(如-16909060)或eofexception;必须配对使用dataoutputstream,注意缓冲区flush和字节序兼容性。

详解java中的datainputstream与dataoutputstream_原始数据类型的跨平台读写

为什么 DataInputStreamint 会卡住或读错?

因为底层依赖字节序(big-endian)且严格按固定长度读取,一旦写入端不是用 DataOutputStream 写的,或者流被提前截断、对齐错位,readInt() 就会阻塞等待剩余 4 字节,或把前几个字节拼成错误值。

  • 常见错误现象:readInt() 阻塞在 socket 流中;读出 -16909060 这类明显异常的整数;EOFException 突然抛出
  • 必须配套使用:DataOutputStream 写,DataInputStream 读 —— 它们共享同一套二进制协议,不兼容 ObjectOutputStream 或自定义 byte[] 拼接
  • 注意缓冲区边界:如果上层用了 BufferedInputStream,但没调用 flush()DataOutputStream 可能只写了部分字节,DataInputStream 就会等不到完整 int
  • 示例:写入 dos.writeInt(256),底层一定是 0x00 0x00 0x01 0x00(大端),读时也必须按此顺序解析

DataOutputStream.writeUTF() 和普通字符串写入的区别在哪?

它不是直接写字符串字节,而是先写 2 字节长度(short),再写 UTF-8 编码内容 —— 所以能安全跨平台读回,但要求长度 ≤ 65535 字节,且不支持 surrogate pair 的完整 Unicode 表达(如某些 emoji)。

  • 容易踩的坑:writeUTF("a".repeat(70000)) 会抛 UTFDataFormatException,因为长度超 0xFFFF
  • writeBytes() 完全不同:writeBytes() 不写长度头,也不转 UTF-8,遇到非 ASCII 字符会丢高字节,基本只适合 ASCII 场景
  • 性能影响:比直接写 String.getBytes(StandardCharsets.UTF_8) 多一次长度计算 + 2 字节开销,小字符串差异不大,高频写长文本时可考虑绕过
  • 读端必须用 readUTF(),否则手动跳过长度头容易错位,后续所有读操作都会偏移

跨平台时字节序和类型大小真的一致吗?

Java 规范强制 DataInputStream/DataOutputStream 使用 big-endian 和固定宽度(int 总是 4 字节,double 总是 8 字节),所以只要两端都是标准 JVM 实现,就不存在字节序或类型大小问题 —— 但 C/C++ 或 Python 的 struct 模块默认可能是 little-endian,这时必须显式指定 >(big)模式。

  • 典型兼容场景:Java 服务写 dos.writeLong(System.currentTimeMillis()),Python 用 struct.unpack('>Q', data) 读,不能用 <q></q>
  • 注意浮点精度:float / double 按 IEEE 754 存储,Java 和主流语言一致,但某些嵌入式平台或旧系统可能用非标准实现(极少见)
  • 别信“本地平台”:即使在 x86 Linux 上跑 Java,DataOutputStream 依然输出 big-endian —— 它不看 CPU,只认 Java 规范

不用 DataInputStream,还有更稳的原始类型序列化方案吗?

有,但要看场景:如果只是 Java 内部通信,ByteBuffer(配合 order(ByteOrder.BIG_ENDIAN))更轻量、无流阻塞风险;如果要跨语言,Protocol Buffers 或 FlatBuffers 更可靠,它们自带 schema 和版本管理,而 DataInputStream 是裸协议,字段增删改极易导致运行时错位。

立即学习Java免费学习笔记(深入)”;

  • ByteBuffer 优势:可重复读写、位置可控、不依赖流状态,适合内存内数据打包
  • 陷阱:DataInputStreamreadLine() 已废弃且行为诡异(只识别 \n,不处理 \r\n),绝对不要用,改用 BufferedReader
  • 真正容易被忽略的一点:DataInputStream 本身不缓冲,每次 readXxx() 都可能触发底层 I/O —— 如果频繁读小数据,包一层 BufferedInputStream 能显著提升性能,但记得 flush 对应的 BufferedOutputStream

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

311

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

223

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

77

2026.02.12

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

810

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

592

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

616

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.04

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1030

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.8万人学习

C# 教程
C# 教程

共94课时 | 9.9万人学习

Java 教程
Java 教程

共578课时 | 70万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号