讲师中心 微信公众号
AI工具推荐 视频效率加速

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

星杰姑娘_1559

星杰姑娘_1559

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

|

413人浏览过

|

来源于php中文网

原创

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

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

为什么 DataInputStream 读 int 会卡住或读错?

因为底层依赖字节序(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-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

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

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

3151

2023.10.31

php数据类型
php数据类型

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

554

2025.10.31

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

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

542

2026.02.12

string转int
string转int

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

6759

2023.08.02

css中float用法
css中float用法

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

6927

2024.04.28

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

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

804

2025.10.23

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

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

1798

2023.08.03

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

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

2864

2023.09.04

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn