通常,我们喜欢把文件分为二进制文件(binary file)和文本文件(text file)两类。但事实上,所有文件在计算机上都是以二进制方式进行存储的,因此二者并无本质上的区别,它们的区别仅在于对文件内容的解释方式上。


1.概述

  广义上来说,二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名,显然,这个层面下,文本文件属于二进制文件的一种;那么,本文所要讲的,是狭义上的二进制文件和文本文件。
  如前所述,所有的文件都是由一连串的0、1组成,故而在物理上,二进制文件和文本文件无差异,它们的差异是逻辑上的。当我们打开文件时,需要对底层的二进制码作出相应的解释:对于文本文件,应用程序(一般为文本编辑器)会将二进制码解释为文本字符;而对于二进制文件,应用程序(很多,如图像查看器、视频播放器等)会将二进制码解释为其它内容。对于二进制文件和文本文件的区分,以上表述似乎还不能很让人满意,下面我们采用Q&A的形式,细致地剖析这个问题:

  • — Q:简单直接地,什么是文本文件,什么又是二进制文件?
  • — A:文本文件,就是根据字符编码规则解码后,能够全部解码为文本字符的;二进制文件,就是除了文本文件外的所有其它文件,也即,文件底层的二进制码不能根据字符编码规则全部解码为文本字符;换言之,文本文件是根据字符编码规则写入的,而二进制文件是根据其它规则编码写入的;
  • — Q:拿到一个文件,应用程序怎么知道根据什么规则去解码?
  • — A:不同类型的文件有不同的解码规则,因而就有不同的解码器,只要我们选对了解码器(应用程序),解码器自然会根据一套固定的规则去对文件进行解码,文本文件如此,二进制文件(如bmp、rmvb、png)亦如此;
  • — Q:如何选择正确的解码器?
  • — A:最简单的,根据文件扩展名去选择解码器即可,比如,对于.txt文件,这是文本文件,选用记事本或者notepad++均可,对于.bmp文件,这是图像文件(或者说是二进制文件),选用图像查看器即可;不过,文件扩展名是可以随意更改的,因此一个更可靠的方法是根据文件头去选择解码器:一般而言,文件都有文件头,处在文件的开头部分,其中包含着文件的格式信息,比如有个文件的开头两个字节是 0x42 0x4D,对应的ASCII字符是BM,因此我们知道这是一个BMP文件,故而选择图像查看器即可;
  • — Q:如果选错了解码器,文件能打开吗?
  • — A:选错了解码器,由于编解码规则不一致,解释出来的内容自然就成了所谓的“乱码”,比如,用记事本去打开.bmp文件,就会看到一堆乱码,当然也有不是乱码的地方,你会注意到那些地方都显示为字符,因此能被记事本用字符解码规则解释出来;

  相信上述几个问题已经解决了绝大多数人的疑惑,接下来我们分别从文件读写的角度切入,进一步区分二进制文件和文本文件。

2.写(write)

  1. 能存储的数据类型不同
  • 文本文件只能存储char型字符变量;
  • 二进制文件可以存储char/int/short/long/float/……各种变量值;
  1. 每条数据的长度不同
  • 文本文件每条数据通常是固定长度的,以ASCII字符为例,每条数据(每个字符)都是1个字节(也有非定长的编码如UTF-8);
  • 二进制文件每条数据不固定,如short占两个字节,int占四个字节,float占8个字节;
  1. 对换行符的处理不同(详见文本文件换行符)
  • 文本文件的换行符,在不同的操作系统中有所区别:对于DOS\Windows操作系统,当我们向文本文件中写入换行符“\n”时,会自动转换为“\r\n”再写入,当我们从文本文件中读取时,又会自动将“\r\n”再转换为“\n”输出;对于Unix\类Unix操作系统,写入读取均为“\n”,没有转换过程;
  • 二进制文件的换行符,不存在上述问题,写入的是什么就是什么;

3.读(read)

  1. 读取的应用程序不同
  • 文本文件,选用文本编辑器,如记事本、notepad++、vim等;
  • 二进制文件,需要特别的解码器,如bmp文件需要图像查看器,rmvb文件需要视频播放器;

4.二者的比较

  1. 文本文件的优点
  • 一般认为,文本文件编码基于字符定长,译码容易;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式);
  • 由于结构简单,文本文件被广泛用于记录信息。它能够避免其它文件格式遇到的一些问题。此外,当文本文件中的部分信息出现错误时,往往能够比较容易的从错误中恢复出来,并继续处理其余的内容。
  1. 二进制文件的优点
  • 二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间。比如储存数据:3.1415927,文本文件需要 9 个字节,分别储存:3 . 1 4 1 5 9 2 7 这 9 个 ASCII 值,而二进制文件只需要 4 个字节(DB 0F 49 40);
  • 内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。(就像上面的3.1415927需要转换一番);
  • 一些比较精确的数据,使用二进制储存不会造成有效位的丢失。

参考文献

[1] https://www.zhihu.com/question/19971994
[2] https://zhuanlan.zhihu.com/p/20693043
[5] https://baike.baidu.com/item/BMP/35116?fr=aladdin
[9] http://www.cjjjs.com/paper/xmkf/624201593922582.aspx
[10] https://www.dplord.com/2016/03/14/diffenerce-between-binary-file-and-text-file/
以上为本文的全部参考文献,对原作者表示感谢。