Java中DataOutputStream写入基本类型数据的正确方法

发布时间 - 2026-02-02 00:00:00    点击率:

dataoutputstream的writeutf()仅支持string类型,写入int、double等基本类型需使用对应专用方法(如writeint、writedouble),否则编译报错。

在使用 java.io.DataOutputStream 进行二进制序列化时,必须严格匹配数据类型与写入方法——这是初学者常踩的坑。你遇到的错误:

'writeUTF(java.lang.String)' cannot be applied to '(double)'
'writeUTF(java.lang.String)' cannot be applied to '(int)'

根本原因在于:writeUTF() 是专为字符串设计的方法,它将 String 按修改版 UTF-8 编码写入流,并附带长度前缀(2字节)。它不接受任何数值类型(如 int、double、long 等),哪怕你尝试用 String.valueOf() 之外的方式“强转”,编译器也不会接受。

✅ 正确做

法:根据字段实际类型,选用对应的写入方法:

字段类型(示例) 应调用方法 说明
String getAccountHolderName() writeUTF(String) ✅ 原生支持
String getAccountType() writeUTF(String) ✅ 同上
double getBalance() writeDouble(double) ⚠️ 不可用 writeUTF(String.valueOf(balance))(会丢失精度且非标准二进制格式)
int getAccountNumber() writeInt(int) ⚠️ 同样不可用 writeUTF() 或 parseInt() 转换

? 修正后的代码示例:

for (Account accountObj : accounts) {
    System.out.println(accountObj); // 建议用 println 便于调试

    account.writeUTF(accountObj.getAccountHolderName());
    account.writeUTF(accountObj.getAccountType());
    account.writeDouble(accountObj.getBalance());     // ✅ 替换 writeUTF
    account.writeInt(accountObj.getAccountNumber());  // ✅ 替换 writeUTF
}

? 补充说明:

  • 若后续需用 DataInputStream 读取,必须严格按相同顺序、相同方法配对读取(如 writeDouble() → readDouble(),writeInt() → readInt()),否则数据错位或抛出 IOException。
  • writeUTF() 写入的字符串可用 readUTF() 安全读回;但 writeBytes() 或 writeChars() 不兼容 readUTF(),切勿混用。
  • 数值类型绝不应通过 String.valueOf(x) + writeUTF() 间接写入:这会导致可读性下降、解析困难、精度损失(尤其浮点数),且违背二进制协议设计初衷。

? 总结:DataOutputStream 是类型安全的二进制输出工具,其 API 设计即要求“所写即所申明”。牢记 ——

String → writeUTF();int → writeInt();double → writeDouble();boolean → writeBoolean();以此类推。 遵循这一原则,即可彻底规避类型不匹配编译错误,并确保数据可正确、高效、跨平台地持久化与恢复。


# java  # 编码  # app  # 字节  # 工具  # ai  # stream  # 编译错误  # string类  # 数据类型  # String  # Boolean  # 字符串  # int  # double  # 值类型  # 不可用  # 这是  # 这一  # 以此类推  # 报错  # 专为  # 它将  # 不接受  # 这会  # 抛出 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  详解MySQL数据库的安装与密码配置  如何在Tomcat中配置并部署网站项目?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  详解vue.js组件化开发实践  长沙企业网站制作哪家好,长沙水业集团官方网站?  JavaScript模板引擎Template.js使用详解  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何用y主机助手快速搭建网站?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Android Socket接口实现即时通讯实例代码  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何在万网主机上快速搭建网站?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何在阿里云部署织梦网站?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何快速搭建高效WAP手机网站吸引移动用户?  如何快速搭建高效服务器建站系统?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  如何自定义建站之星网站的导航菜单样式?  香港网站服务器数量如何影响SEO优化效果?  如何利用DOS批处理实现定时关机操作详解  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  如何获取上海专业网站定制建站电话?  Laravel如何处理异常和错误?(Handler示例)  Laravel如何配置任务调度?(Cron Job示例)  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  JavaScript如何实现错误处理_try...catch如何捕获异常?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  移动端脚本框架Hammer.js  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  如何快速登录WAP自助建站平台?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  教你用AI将一段旋律扩展成一首完整的曲子  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  网站建设保证美观性,需要考虑的几点问题!  无锡营销型网站制作公司,无锡网选车牌流程?  详解CentOS6.5 安装 MySQL5.1.71的方法  JavaScript中的标签模板是什么_它如何扩展字符串功能  Laravel如何使用Blade模板引擎?(完整语法和示例)