java流与文件——读写二进制数据(DataOutput + DataInput)

2023-11-08

【0】README

0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——读写二进制数据(DataOutput + DataInput)的相关知识;
0.2) for complete my diy code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter1/BinaryIO.java


【1】DataOutput

1.0)DataOutput 接口定义 了 下面用于以二进制格式写数组, 字符, boolean 和 字符串的方法:
writeChars, writeByte, writeInt, writeShort, writeLong, writeFloat, writeDouble, writeChar, writeBoolean, writeUTF;
1.1)例如, writeInt 总是将一个整数写出为 4字节的二进制数量值;
1.2)不管它有多少位, writeDouble 总是将一个double值写出为 8 字节的二进制数量值;
1.3)这样产生的结果并非人可阅读的, 但是对于给定类型的每个值, 所需的空间总是相同的, 而且将其读回也比解析文本要更快;(干货——解析二进制数据比解析文本数据要更快)

Attention)

  • A1)在 java中,所有的值都按照 高位在前的模式写出, 不管使用何种处理器, 这使得java 数据文件独立于平台;
  • A2) 如 1234(10)=4D2(16): 高位在前顺序为 00 00 04 D2 ; 而 低位在前顺序为 D2 04 00 00;

【2】 writeUTF方法:

2.1)writeUTF方法 使用修订版的8位 Unicode转换格式写出字符串;这种方式与直接使用标准的UTF-8 编码方式不同, 其中, Unicode码元序列首先用 UTF-16 表示, 其结果之后使用 UTF-8 规则进行编码;
2.2)修订后的 编码方式对于编码大于 0xFFFF 的字符的处理有所不同, 这是为了向后兼容在Unicode 还没有超过16 位时构建的虚拟机;
这里写图片描述

Attention) (干货——如何使用 writeChars 和 writeUTF 方法)

  • A1)因为没有其他方法会使用 UTF-8 的这种修订, 所以你应该只在写出用于 java 虚拟机的字符串时才使用 writeUTF方法;例如,当需要编写一个生产字节码序列的程序时;
  • A2)而对于其他场合, 都应该使用 writeChars 方法;

【3】DataInput方法: 为了读回数据, 可以使用在 DataInput 接口中定义的下列方法:

  • readInt, readShort, readLong, readFloat, readDouble, readChar, readBoolean, readUTF;

3.1)读入二进制数据: DataInputStream 类实现了DataInput接口, 为了从文件中读取二进制数据, 可以将 DataInputStream与某个字节源进行组合, 如 FileInputStream:
DataInputStream dis = new DataInputStream(new FileInputStream(“employee.dat”));
3.2)写出二进制数据: DataOutputStream dos = new DataOutputStream(new FileOutputStream(“employee.dat”));
这里写图片描述


【4】随机访问文件(RandomAccessFile 同时实现了 DataInput 和 DataOutput 接口)

4.0)RandomAccessFile 类 : 可以 在文件中任何位置查找或写入数据;(干货——这是引入 RandomAccessFile 类的原因)
4.1) RandomAccessFile类可以在文件中的任何位置查找或读写数据;
4.2)磁盘文件都是可以随机访问的, 但是从网络而来的数据流却不是;
4.3)打开一个随机访问文件,只用于读入或同时用于读写;

RandomAccessFile in= new RandomAccessFile("employee.dat", "r");
RandomAccessFile inOut = new RandomAccessFile("employee.dat", "rw");

4.4)seek 方法:随机访问文件有一个表示下一个将被读入或写出的字节所处的位置的文件指针, seek 方法可以将这个文件指针设置到 文件中任意字节 的位置;

  • 4.4.1)假设想读入第三条数据:
    long n = 3;
    in.seek((n-1) * RECORD_SIZE);
  • 4.4.2)如果你希望修改数据,请切记将文件指针重置到开始处:
    in.seek((n-1) * RECORD_SIZE);
    e.writeData(out);
  • 4.4.3)length 方法:确定文件大小,使用 length 方法;

4.5) 整数和浮点值在二进制格式中都有固定的尺寸, 但处理 字符串就有些麻烦了, 我们提供了 两个助手方法来读写具有固定尺寸的字符串:

  • writeFixedString 方法: 写出从字符串开头开始的指定数量的码元;
  • readFixedString 方法: 从输入流中读入字符, 直至读入size 个码元, 或者直至到具有0值的字符值, 然后跳过输入字段中剩余的 0值;为了提高效率,使用 StringBuilder 类来读入字符串;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java流与文件——读写二进制数据(DataOutput + DataInput) 的相关文章

随机推荐

  • sql-labs 闯关 11~20

    sql labs 闯关 11 20 友善爱国公正敬业爱国爱国诚信自由友善爱国公正诚信民主和谐敬业平等 复习笔记1 内容 POST请求介绍 sql labs第11关 POST请求 基于错误 单引号 字符型 sql labs第12关 POST请
  • C++ 工厂模式

    简单工厂 简单工厂 定义一个类负责创建其他对象类的实例 而被创建的对象类一般都有共同的基类 一般来说简单工厂如果想创建一个对象类 只需要根据名字进行实例化 工厂就会创建相应的对象类 特点 简单的对不同类对象的创建进行了一层很薄的封装 inc
  • vi 常用命令行

    vi 常用命令行 1 vi 模式 a 一般模式 vi 处理文件时 一进入该文件 就是一般模式了 b 编辑模式 在一般模式下可以进行删除 复制 粘贴等操作 却无法进行编辑操作 等按下 i I o O a A r R 等 字母之后才能进入编辑模
  • 关于我用iVX沉浸式体验了一把0代码项目创建(2)

    关于iVX 前面已经写过两篇文章了 感兴趣的同学可以去看我前面两篇文章 传送门 云原生IDE iVX 1 iVX的系统架构 1 1 举一个例子 1 2 iVX前端技术框架 1 3 后台技术框架 1 4 后台应用逻辑分层 2 iVX体验 2
  • Windows和linux上安装maven3

    一 Windows上安装maven3 系统环境 Windows 7 64位旗舰版 jdk1 6 0 17 1 下载maven3 http maven apache org download html 下载 apache maven 3 1
  • 论文阅读_扩散模型_DM

    英文名称 Deep Unsupervised Learning using Nonequilibrium Thermodynamics 中文名称 使用非平衡热力学原理的深度无监督学习 论文地址 http arxiv org abs 1503
  • NTC PTC 压敏电阻 在电源电路中的作用

    NTC PTC 压敏电阻 在电源电路中的作用 来自dianyuan com 问题1 NTC电阻串联在交流电路中主要是起什么作用 它是怎样工作 请大侠指点 谢谢 问题2 压敏电阻并联在交流侧电路中主要是起什么作用 它是怎样工作 如果没有以上两
  • 理解DALL·E 2, Stable Diffusion和 Midjourney工作原理

    原文 理解DALL E 2 Stable Diffusion和 Midjourney的工作原理 知乎 者按 随着AIGC的兴起 各位小伙伴们对文生图工具DALL E 2 Stable Diffusion和Midjourney一定并不陌生 本
  • word转换成pdf,包括导航目录和图片不变黑

    1 word转换成pdf 包括导航目录和图片不变黑 有些时候将word转换成pdf 我们会发现生成的文件要么不带导航目录 要么就是图片显示有问题 比如变黑 变黑是因为某些图片在作图时修改了透明度 因此转换时会被转换为黑色 下面来说说解决办法
  • UDP之多播/组播

    目录 一 什么是多播 组播 为什么出现多播 组播 二 组播地址 三 主机网卡对应的编号 ifconfig命令 ip ad ip adress 获取网卡对应的编号 四 多播实现 一 什么是多播 组播 为什么出现多播 组播 由上节课讲到的广播
  • imu内参标定,从数据录制到标定结果过程记录

    一 准备录制 这部分内容主要参考了博主 huawwenwnewn 的文章http t csdn cn yvkdz 非常感谢 1 建立工作空间在imu data cpp 写入以下内容 mkdir p publish ws src cd pub
  • 永磁同步电机矢量控制到无速度传感器控制学习教程(PMSM)(一)

    一个阶段的学习结束了 整理了之前的过程中的学习成果 已经过了工作的年纪 在这里稍微出一下自己做的一套永磁同步电机的教程 从基础的矢量控制 到应用性较强的MTPA 弱磁控制等 最后深入到无速度传感器的控制 搜集了三种无速度的方法 足够大家从基
  • C语言 define

    本文结合 C Primer Plus 和网上的资料 c c 中define用法详解及代码示例 MachineChen的博客 CSDN博客 define在c语言中用法 对C语言中的define做一个总结 每行 define 逻辑行 都由3部分
  • string[]数组转为int[]数组方法

    string arrTemp 22 23 222 int intArray intArray Array ConvertAll
  • 嵌入式 Linux 入门(四、Linux 下的编辑器 — 让人爱恨交加的 vi )

    大家好 是矜辰所致 嵌入式 Linux入 门第四课 了解 Linux 下的编辑器 掌握 vi 编辑器的使用 目录 前言 一 Linux 下的编辑器 1 1 gedit 编辑器 1 2 Vi 编辑器 font color 0033FF 1 3
  • leetcode:2023/4/7

    1040 移动石子直到连续II class Solution public int numMovesStonesII int stones int n stones length Arrays sort stones if stones n
  • 关于数据库中FK的简单理解以及应用

    问题来源 思考如果有两张表 应该以什么样的方式将两者关联起来 直接用两个表中的字段进行关联 还是使用第三张关系表进行关联 说明 FK foreign key PK primary key 注 下面提到的 一对一 一对多 多对一 是指一个表的
  • Centos系统常见配置(详细)总结

    目录 一 简介 二 具体内容 1 设置静态ip 2 重启网络 3 ssh登录时自动运行命令 4 新增用户并创建家目录 5 终端显示bash 4 2 6 更换yum源 7 centos系统串口终端自动登陆 8 系统启动通过rc local自动
  • Mysql Sql查询之Limit 用法

    面试题 你知道mysql 中limit的用法吗 你是怎么使用的 在一条sql语句中 limit 1 表示什么 limit 1 3 又是什么意思 这道题本人答的很烂 在mysql中 limit关键字主要用于指定查询结果从哪条记录开始显示 一共
  • java流与文件——读写二进制数据(DataOutput + DataInput)

    0 README 0 1 本文描述转自 core java volume 2 旨在理解 java流与文件 读写二进制数据 DataOutput DataInput 的相关知识 0 2 for complete my diy code ple