文档章节

浅尝二进制文件和文本文件……

Iridium
 Iridium
发布于 2017/02/19 11:34
字数 710
阅读 22
收藏 0

虽然电脑上的文件本质上都是二进制的,但 Java 还是把流分成了两类:字节流和字符流,两种流的输出,前者亦称为二进制文件,後者则称为文本文件。下面来考察下

字节流输出的二进制文件

  1. 首先示范 Java 流工具和 Linux xxd 的使用: 代码片段
        FileOutputStream fos = new FileOutputStream("binary_output");
        DataOutputStream dos = new DataOutputStream(fos);

        dos.writeBoolean(false);
        dos.close();

执行后,通过工具 xxd 查看:

$ xxd -b binary_output 
00000000: 00000000                                     

可见,布尔值 false 一个 byte (8 bits) 存储,所有位皆为0.

  1. 再考察 true 的存储形式:
        dos.writeBoolean(true);
$ xxd -b binary_output 
00000000: 00000001        

很清楚地看到 true 也是以一个 byte 来存储的,最后一位为1.

  1. 继续考察其他:
        dos.write('\n');
$ xxd -b binary_output 
00000000: 00001010                                               .

换行符号的 ASCII 码是10, 即二进制数1010. 换行符号也是用一个 byte 来存储的。 3. int

        dos.writeInt(3);
$ xxd -b binary_output 
00000000: 00000000 00000000 00000000 00000011          

一个 int 数字,用 4 bytes 存储。 4. double

        dos.writeDouble(3.14);
$ xxd -b binary_output 
00000000: 01000000 00001001 00011110 10111000 01010001 11101011  @...Q.
00000006: 10000101 00011111                             

可见,需要8 bytes 才能存储一个 double 数字。

  1. float
        dos.writeFloat(3.14f);
$ xxd -b binary_output 
00000000: 01000000 01001000 11110101 11000011            

可见,4 bytes 即可存储一个 float 数字。 以上浮点数的二进制文件中的存储形式,还需翻下资料才能理解。TODO

  1. 汉字
        dos.write('曹');
$ xxd -b binary_output 
00000000: 11111001                                               .

(11111001)<sub>2</sub> = (F9)<sub>16</sub> 这里不太理解,汉字UTF-8编码是66F9,但这里只有後面两位,百思不得其解。TODO

  1. 英文字母
        dos.write('A');
$ xxd -b binary_output 
00000000: 01000001                                        

(01000001)<sub>2</sub> = (41)<sub>16<sub>,即字母AASCII 编码。

  1. 以上综合输出
        dos.writeBoolean(true);
        dos.write('\n');
        dos.writeInt(3);
        dos.writeDouble(3.14);
        dos.writeFloat(3.14f);
        dos.write('曹');
        dos.write('A');
$ xxd -b binary_output 
00000000: 00000001 00001010 00000000 00000000 00000000 00000011  ......
00000006: 01000000 00001001 00011110 10111000 01010001 11101011  @...Q.
0000000c: 10000101 00011111 01000000 01001000 11110101 11000011  ..@H..
00000012: 11111001 01000001                                      .A

字符流产生的文本文件

同样的内容,如果存储到文本文件中,再用 xxd 查看,会得到什么? 保存文本文件:text.txt,内容如下:

true
33.143.14f曹A
$ xxd -b text.txt 
00000000: 01110100 01110010 01110101 01100101 00001010 00110011  true.3
00000006: 00110011 00101110 00110001 00110100 00110011 00101110  3.143.
0000000c: 00110001 00110100 01100110 11100110 10011011 10111001  14f...
00000012: 01000001                                                                                                 A

很明显,这些内容全部当文本保存成二进制文件了,故曰文本文件。

总结

文本文件,是为了对人类可读,多了一个转字符串的中间环节,实际上存到计算机上的都是人类可见的那些“字面量”。比如对布尔型值true,二进制文件存它的值,只需要8 bits即可,前面7 bits填0,最後一个 bit 填1即可。而保存为文本文件的话,实际上保存的是"t", "r", "u", "e"这四个字母对应的UTF-8编码的二进制值。 所以,二进制比较省空间,文本文件比较好读。

© 著作权归作者所有

共有 人打赏支持
Iridium
粉丝 3
博文 9
码字总数 4676
作品 0
成都
架构师
私信 提问
Linux - 文件的分割(split)与合并(cat)

一、关于 在Linux下,切割和合并文件可以使用split和cat命令来实现。 二、文件切割 文件切割模式分为两种:文本文件和二进制模式。 1、文本模式 文本模式只适用于文本文件,用这种模式切割后...

leonardos
2018/07/02
0
0
C&C++文件操作

  流式文件操作   这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下以下是引用片段:   typedef struct {   int level; /* fill/empty level of buffer */   uns...

微一
2013/01/04
373
2
初学Python——文件操作第二篇

前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求。下面来一一分析。 一、Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操...

学霸初养成
2018/04/19
0
0
浅尝超融合之Nutanix(下)安装篇

上一篇中介绍了超融合和Nuntaix,了解了超融合技术和Nutanix超融合解决方案的软硬件架构,本篇主要是介绍Nutanix社区版的安装。 安装准备 Nutanix CE(Community Edition)是NOS(Nutanix Opera...

huangbo929
2017/02/04
0
0
der pem cer crt key pfx等概念及区别

证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、CRT、CRL 、OCSP、SCEP等。 一、编码格式 X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参...

wushank
2018/06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

winscp中使用sudo的方法

用截图了解如何在 WinSCP 中使用 sudo。 首先你需要检查你尝试使用 WinSCP 连接的 sftp 服务器的二进制文件的位置。 你可以使用以下命令检查 SFTP 服务器二进制文件位置: [root@kerneltalk...

Linux就该这么学
25分钟前
1
0
四、MyBatis中查询执行流程

一、查询执行大致流程 在MyBatis中,查询执行的大致流程如下:

yangjianzhou
31分钟前
1
0
系统幂等设计

前言 幂等简单的定义: 系统中的多次操作,不管多少次,都应该产生一样的效果,或返回一样的效果。 比如实际的业务请求为创建一个活动,理论上需要根据业务形态开发幂等创建活动的接口,这样...

春哥大魔王的博客
56分钟前
3
0
DevSecOps 运维模式中的安全性

导读 本文想从技术的角度谈谈我对云计算数据中心 DevSecOps 运维模式中的安全性的理解,和过去几年我在云服务业务连续性管理方面的探索。 现在公有云服务商都不约而同地转向 DevSecOps 模式。...

问题终结者
58分钟前
0
0
java 基础脑图 转载来的

NotFound403
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部