精华内容
下载资源
问答
  • 狭义的二进制文件即除文本文件以外的文件。文本文件是一种由很多行字符构成的计算机文件。文本文件存在于计算机系统中,通常在文本文件最后一行放置文件结束标志。文本文件的编码基于字符定长,译码相对要容易一些;...

    定义

    广义的二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名。狭义的二进制文件即除文本文件以外的文件。文本文件是一种由很多行字符构成的计算机文件。文本文件存在于计算机系统中,通常在文本文件最后一行放置文件结束标志。文本文件的编码基于字符定长,译码相对要容易一些;二进制文件编码是变长的,灵活利用率要高,而译码要难一些,不同的二进制文件译码方式是不同的。

    从本质上来说他们之间没有什么区别,因为他们在硬盘上都有一种的存放方式--二进制,但是如果要对他们有些区分的话,那可以这样理解。每个字符由一个或多个字节组成,每个字节都是用的-128—127之间的部分数值来表示的,也就是说,-128——127之间还有一些数据没有对应任何字符的任何字节。如果一个文件中的每个字节的内容都是可以表示成字符的数据,我们就可以称这个文件为文本文件,可见,文本文件只是二进制文件中的一种特例,为了与文本文件相区别,人们又把除了文本文件以外的文件称为二进制文件,由于很难严格区分文本文件和二进制文件的概念,所以我们可以简单地认为,如果一个文件专门用于存储文本字符的数据,没有包含字符以外的其他数据,我们就称之为文本文件,除此之外的文件就是二进制文件。

    使用二进制文件的好处

    为什么要使用二进制文件。原因大概有三个:

    第一是二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间,比如储存 Real*4 的数据:3.1415927,文本文件需要 9 个字节,分别储存:3 . 1 4 1 5 9 2 7 这 9 个 ASCII 值,而二进制文件只需要 4 个字节(DB 0F 49 40)

    第二个原因是,内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。

    第三,就是一些比较精确的数据,使用二进制储存不会造成有效位的丢失。[1]

    二进制文件的储存方式

    列举一个二进制文件如下:

    00000000h:0F 01 00 00 0F 03 00 00 12 53 21 45 58 62 35 34; .........S!EXb54

    00000010h:41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50; ABCDEFGHIGKLMNOP

    这里列出的是在 UltraEdit(UE) 里看到的东西。其实只有红色部分是文件内容。前面的是 UE 加入的行号。后面的是 UE 尝试解释为字符型的参考。

    这个文件一共有 32 字节长。显示为两列,每列 16 个字节。实际上,这仅仅是 UE 的显示而已。真实的文件并不分行。仅仅知道这个文件的内容,如果我们没有任何说明的话,是不能看出任何有用信息的。

    下面我规定一下说明:我们认为,前 4 个字节是一个 4 字节的整型数据(0F 01 00 00 十六进制:10Fh 十进制:271)。这 4 个字节之后的 4 个字节是另一个 4 字节的整型数据(0F 03 00 00 十六进制:30Fh 十进制:783)。其后的 4 个字节(12 53 21 45 )表示一个 4 字节的实型数据:2.5811919E+3。再其后的 4 个字节(58 62 35 34)表示另一个 4 字节的实行数据:1.6892716E-7。而只后的 16 个字节(41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50)我们认为是 16 个字节的字符串(ABCDEFGHIGKLMNOP)

    实际上,二进制文件只是储存数据,并不写明数据类型,比如上面的第 9 字节到第 16 字节(12 53 21 45 58 62 35 34),我们刚才认为是 2 个 4 字节的实型,其实也可以认为是 8 个字节的字符型( S!EXb54)。而后面的 16 个字节的字符串(ABCDEFGHIGKLMNOP),我们也可以认为是 2 个 8 字节的整型,或者 4 个 4 字节的整型,甚至 2 个 8 字节的实型,4 个 4 字节的实型,等等等等。

    因此,面对一个二进制文件,我们不能准确地知道它的含义,我们需要他的数据储存方式的说明。这个说明告诉我们第几个字节到第几个字节是什么类型的数据,储存的数据是什么含义。否则的话,我们只能猜测,或者无能为力。[1]

    如何使用语句操作二进制文件

    我们将上面的那个二进制文件保存为:TestBin.Bin 来举例。

    读取和写入二进制其实是两个很类似的操作,了解了其中之一,另一个也就不难了。

    二进制文件我们通常使用直接读取方式,Open 语句可以写为:

    引用:

    Open( 12 , File = 'TestBin.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4 )

    上面的 Access 表示直接读取方式,Form 表示无格式储存。比较重要的是 RecL 。我们读取数据时,是用记录来描述单位的,每一次读入或写入是一个记录。记录的长度在 Open 时就确定下来,以后不能改变。如果需要改变,只能 Close 以后再此 Open。

    记录长度在某些编译器下表示读取的 4 字节长度的倍数,规定为 4 表示记录长度为 16 字节。有些编译器下就直接表示记录的字节数,规定为 4 则表示记录长度为 4 字节。这个问题需要参考编译器手册。在 VF 系列里,这个值是前面一个含义。可以通过设置工程属性的 Fortran,Data,Use Bytes as RECL= Unit for Unformatted Files 来改变,使之成为后一个含义。在命令行模式下,则使用 /assume:byterecl 这个编译选项。

    确定 RecL 大小是我们需要做的事情,一般来说,不适合太大,也不适合太小。还需要结合数据储存方式来考虑。太小的话,我们需要执行读写的次数就多,太大的话,我们就不方便操作小范围的数据。

    有时候我们甚至会分多次来读取数据,每一次的 RecL 都不同。对于上面的 TestBin.Bin 文件来说,它比较简单,我以 16 字节长度和 8 字节长度两种读取方式来演示,你甚至可以一次 32 个字节长度全部读完。[1]

    用例

    C++程序语言学习过程中常见名词,相对于Binary file的是Text file(纯文本文件)。

    C++中二进制文件读写函数:

    fread

    fwrite

    ifstream.read()

    ofstream.write()

    文件读

    文件写

    等等……

    Java中二进制文件读写函数:

    FileInputStream()

    FileOutputStream()

    文件输入流()

    文件输出流()

    等等……

    那么,这个时候我们肯定会问:

    汉字怎样转化为二进制代码?

    各数制之间的转换

    我们用R表示任何数制的基数,讨论各数制之间的转换。

    1.R进制数转换为十进制数

    二进制、八进制和十六进制数转换为等值的十进制数,只要把它们用多项式表示并在十进制下进行计算,所得的结果就是十进制数。

    2.十进制数转换为R进制数

    十进制数转换为等值的二进制、八进制和十六进制数,需要对整数部分和小数部分分别进行转换。其整数部分用连续除以基数R取余数的方法来完成,小数部分用连续乘以基数R取整数的方法来实现。

    基数   基数   基数   基数   基数

    十进制  10000  1000   100   10    1

    二进制   16    8    4    2    1

    八进制  4096   512    64   8    1

    十六进制 65536  4096   256   16    1

    3.二进制数与八进制数、十六进制数的转换

    二进制数与八进制数的转换应以"3位二进制数对应1位八进制数"%的原则进行。同理,因为24=16,则二进制数与十六进制数的转换应以"4位二进制数对应1位十六进制数"的原则进行。

    四、二进制数的运算

    在计算机中,二进制数的运算包括算术运算和逻辑运算。

    1.二进制数的算术运算

    (1)二进制数加法

    加法原则:逢二进一

    (2)二进制数减法

    减法原则:借一当二

    (3)二进制数乘法

    乘法原则:与算术乘法形式相同

    (4)二进制数除法

    除法原则:与算术除法形式相同

    2.二进制数的逻辑运算

    逻辑运算是以二进制数为基础的,逻辑变量只有两个,用来表示逻辑"真"和"假"。

    (1)逻辑加法("或"运算)

    运算符号:"+"或"∨"

    运算规则:0+0=0;0+1=1;1+0=1;1+1=1;

    (2)逻辑乘法("与"运算)

    运算符号:"×"或"∧"

    运算规则:0×0=0;0×1=0;1×0=0;1×1=1;

    (3)逻辑"非"运算

    运算符号:"-"%运算规则:A&-*=0时,A=1

    五、数据类型及数据单位

    1.数据的两种类型

    计算机中的数据可概括分为两大类:数值型数据和字符型数据。所有的非数值型数据都要经过数字化后才能在计算机中存储和处理。

    2.数据单位

    在计算机中通常使用三个数据单位:位、字节和字。位的概念是:最小的存储单位,英文名称是bit,常用小写b或bit表示。用8位二进制数作为表示字符和数字的基本单元,

    英文名称是byte,称为一字节。通常用大"B"表示。

    1B(字节)=8b(位)

    1KB(千字节)=1024B(字节)

    1MB(兆字节)=1024KB(千字节)

    字长:字长也称为字或计算机字,它是计算机能并行处理的二进制数的位数。

    六、字符编码与汉字编码

    1.字符编码

    目前微型机中普遍采用的字符编码是ASCII码。它是用七位二进制数对127个字符进行编码,其中前32个是一些不可打印的控制符号。

    2.汉字编码及字模信息

    汉字有两种编码:国标码与机内码。

    国标码是"中华人民共和国国家标准信息交换汉字编码",代号为"GB2312-80"。在国标码的字符集中,收集了一级汉字3755个,二级汉字3008个,图形符号682个,共7445个。一个汉字对应一个区位码,由四位数字组成,前两位数字为区码(0~94),后两位数字为位码(0~94)。机内码是指汉字在计算机中的编码

    汉字的机内码占两个字节,分别称为机内码的高位与低位。它们与区位码的关系如下:

    机内码高位=区码+A0H

    机内码低位=位码+A0H

    汉字字库是由所有汉字的字模信息构成的。一个汉字字模信息占若干字节,究竟占多少个字节由汉字的字形决定。

    例如,如果用16×16点阵表示一个汉字,则一个汉字占16行,每行有16个点,在存储时用两个字节存放一行上16个点的信息,对应位为"0"表示该点为"白","1"表示该点为"黑"。因此,一个16×16点阵的汉字占32个字节。

    ---------------------------------------------------------------

    描述2进制的数据结构,用字符串直观,但是效率低,用数组效率高,但是不直观。

    但是道理相同。

    性字转换后的结果:

    010000010000 010010010000 010010010100 111011111110 110010010000 010100010000 010011111110 010000010000 010000010000 010000010000 010111111110 000000000000

    144位编码,这也不可能的,

    性字编码alert asc("性")得到-12076,转化为2进制为-10111100101100 不算正负有14位就够了。

    如果非要补到144位也因该是高位补0。

    function c10to2(x)

    '10进制到2进制的转换

    dim sign, result

    result = ""

    '符号

    sign = sgn(x)

    x = abs(x)

    if x = 0 then

    c10to2 = 0

    exit function

    end if

    do until x = "0"

    result = result & (x mod 2)

    x = x \ 2

    loop

    result = strReverse(result)

    if sign = -1 then

    c10to2 = "-" & result

    else

    c10to2 = result

    end if

    end function

    ---------------------------------------------------------------

    另外一个人的写法:

    function c10to2(x)

    mysign=sgn(x)

    x=abs(x)

    DigS=1

    do

    if x<2^DigS

    二进制编码转汉字:

    1. 汉字信息交换码(国标码)

    《信息交换用汉字 编码字符集·基本集》是我国于1980年制定的国家标准 GB2312-80,代号为国标码,是国家规定的用于汉字信息处理使用的代码依据。

    GB2312-80中规定了信息交换用的6763个汉字和682个非汉字图形符号(包括几种外文字母、数字和符号)的代码。

    6763个汉字又按其 使用频度、组词能力以及用途大小分成一级常用汉字3755个和二级常用汉字3008个。

    一级汉字按拼音字母顺序排列;若遇同音字,则 按起笔的笔形顺序排列;若起笔相同,则按第二笔的笔形顺序排列,依次类推。所谓笔形顺序,就是横、竖、撇、点和折的顺序。二级汉字按 部首顺序排列。

    在此标准中,每个汉字(图形符号)采用双字节表示。每个字节只用低7位,最高位恒为1。由于低7位中有34种状态是用 于控制字符,因此,只有94(128-34=94)种状态可用于汉字编码。这样,双字节的低7位只能表示94×94=8836种状态。

    编码范围

    十进制数码

    基本 ASCII 码

    00000000~01111111

    0~127

    控制字符

    00000000~00100000、01111111

    0~32、127

    可用汉字段

    00100001~01111110

    33~126 (1~94)

    扩充 ASCII 码

    10000000~11111111

    128~255

    控制字符

    10000000~10100000、11111111

    128~160、255

    GB2312-80

    10100001~11111110

    161~254 (1~94)

    此标准的汉字编码表有94行、94列,其行号称为区号,列号称为位号。双字节中,用 高字节表示区号,低字节表示位号。非汉字图形符号置于第1~11区,一级汉字3755个且于第16~55区,二级汉字3008个置于第56~87区。

    每个图形字符的汉字交换码,均用两个字节的低7位二进制码表示。汉字国标码通常用十六进制数表示。

    例如:“中”字的区号为 54,位号为48,计算它的二进制数和十六进制数国标码。

    解:先将区、位号分别加上 32 :

    54+32=86

    48+32=80

    分别转换为二进制数:

    (86)10=01010110

    (80)10=0 1010000

    得到二进制数国标码为:

    01010110 01010000。

    最后通过 8 4 2 1 ── 二进制取位法转换成十六 进制汉字国标码为:5650。

    又如“国”字的区号为25,位号为90,用以上相同的方法得到它的国标码为:

    二进制:00111001 01111010

    十六进制:397A

    ----------------------------------------------------------------

    基于以上原则,则

    11000100,11100011,10111010,11000011

    >(1100 0100 1110 0011)2,(1011 1010 1100 0011)2

    >(C4E3)16,(BAC3)16

    >查表可知:C4E3>>‘你’,BAC3>>‘好’

    展开全文
  • 文件有两种,文本文件和二进制文件。读写文本文件比较简单,也在这里简单说一下;读写二进制文件用到了struct库,涉及一些大端小端、字节填充等概念,稍微有点复杂。文件打开关闭在读写文件之前,需要打开文件,...

    文件有两种,文本文件和二进制文件。读写文本文件比较简单,也在这里简单说一下;读写二进制文件用到了struct库,涉及一些大端小端、字节填充等概念,稍微有点复杂。

    文件打开关闭

    在读写文件之前,需要打开文件,Python不需要导入其他库,直接可以打开关闭文件

    file = open('filename.ext', openmod) #打开文件

    file.close() #关闭文件

    操作模式可以分为两种,一种是文本文件模式,另一种为二进制文件模式

    2717f3176ab6959cd3f0e08bf975c080.png24d2331c79246b23a292f5875e804ab8.png

    读写文本文件

    文件写入就比较简单了

    file.write('string')

    file.write('string\n') # 换行

    file.write('%10s=%10.2f\n' % ('val', 12.3455)) # 格式化字符串

    write函数只能输出字符串,不能像C语言那样定义输出格式。 如果像这么做,需要先对要输出的内容转换为字符串。可以像上例那样格式化字符串,格式化方法与C中的是一致的,适合学过C语言的同学。

    Python也有一个输出多行的函数,同时输出多行

    content = ['I have a dream.\n', 'One day, \n', 'former slaves and slave owners will join together,\n',

    'as brotherhood.\n']

    file.writelines(content)

    writelines()函数不会为你添加换行符,需要自己添加。

    读入文件内容

    file.read() # 读取文件所有内容

    file.read(n) # 读取前n个字符

    需要注意的是read(n)。如果文件中有中文,一个中文字表示一个字符,不管其中内部编码是几个字节。读取完之后,光标移动n个字符。

    顺便讲一讲如何读取中文。如果要正确读取中文,以下条件要满足

    要读的文本文件的编码与打开文件时设置的编码一致。

    其实我们在打开文件时,有一个文件编码参数我们没有设置,用的默认的参数,这个参数可以设置。假如我们的文本文件a.txt用的utf-8进行的编码。就可以进行下面设置。

    file = open('a.txt', 'r', encoding='utf-8')

    如果两者没有设置成一致的,在读取时就会出错。 在Windows中, open方法打开的文件好像默认为GBK编码,如果你的文本文件用的utf-8格式,就会错误。

    除了上面的读取函数之外,还有一个

    line1 = file.readline()

    str2 = file.readline(n) #读取本行的n个字符

    注意line1中包含回车符,读取完line1后,读取位置移动到下一行

    读取完str2后,读取位置移动n个字符,可能还在本行。

    如果n >= 本行的字符数(包含换行符), 最终读取的内容就是本行的字符,读取位置移到下一行;

    如果n

    感觉说的有点啰嗦,就这样吧。

    读写二进制文件

    二进制文件中都是一个一个的字节数据。因此读和写,都是针对字节数据的。

    bytes_all = file.read() #读取文件所有的字节数据

    bytes_read = file.read(n) #读取n个字节数据

    file.write(bytes_read) #将字节数据写到文件

    下面就是讲如何把数据转换为字节数据,以及如何把字节数据解析成原始数据。

    这里用到了Python提供了一个struct库。

    在使用之前先导入struct库

    import struct

    struct库有两个基本操作

    struct.pack(fmt, v1, v2, ...) #将原始数据v1, v2, ...根据fmt格式转换为字节串

    val_arr = struct.unpack(fmt, bytes_arr) #将字节数据byts_arr根据fmt格式转换为原始数据元组 val_arr

    下面是一个简单的例子

    b1 = struct.pack('>hif', 65, 123, 3.14)

    print([hex(i) for i in b1])

    输出

    ['0x0', '0x41', '0x0', '0x0', '0x0', '0x7b', '0x40', '0x48', '0xf5', '0xc3']

    这里稍作解释,后面会有更详细的。

    这里的fmt为’>hif’ 表示数据为大端顺序,h表示一个short类型,也就是2个字节的整数,i表示一个int类型也就是4个字节表示的整数, f表示单精度浮点类型,也是4个字节。 因此这个fmt表示的10个字节的数据。

    可以用下面计算fmt代表的字节数

    struct.calcsize('>hif')

    然后是把字节解析为原始数据

    struct.unpack('>hif', b1)

    输出

    (65, 123, 3.140000104904175)

    在fmt的定义中,有3样东西需要注意:字节顺序,数据由几个字节组成,以及字节填充(对齐)。

    字节顺序:

    是对于多字节的数据,比如一个int类型的数16909060(其十六进制表示为 0x01020304),转换为字节有两种转换方法

    大端表示,最高位在前, 0x01, 0x02, 0x03, 0x04

    小端表示,最低位在前, 0x04, 0x03, 0x02, 0x01

    [hex(i) for i in struct.pack('>i', 16909060)]

    Out[69]: ['0x1', '0x2', '0x3', '0x4']

    [hex(i) for i in struct.pack(', 16909060)]

    Out[70]: ['0x4', '0x3', '0x2', '0x1']

    数据长度,这个大家应该都知道。下面是完整的数据长度列表

    b626aecf234ddcde52f88cd068cec07d.png

    字节填充(对齐),这是以前C语言中的一个概念。比如有一个100个长度的int类型的数组,为了能够找到第61个数据,我只需要把指针移动60个int长度就行了,因为这100个数都是4字节对齐的。

    在Python中,对齐稍微有一点区别。比如h表示的是short,是2字节的。如果启用了对齐设置,那么在任何short类型放置的位置,都需要2字节对齐。如果是i,也就是int类型的数据,就需要4字节对齐。如果是d,也就是double,就需要8字节对齐。放在最前面的数据不需要对齐,始终是从第0个字节开始。当然也可以不用对齐设置,那么数据就是连续排列的。

    像刚刚的’>'就定义了这三样东西:大端字节顺序(big-endian),标准的数据字节数,无字节填充(对齐)。 完成的参数见下表:

    f52b0d93b159a19ee5431360c5070d2f.png

    默认是@,native表示配置方法跟本机环境有关。不同类型的CPU,操作系统,配置不一样。有些CPU可能是采用大端、有些事小端;有些操作系统下int表示4个字节,有些表示8个字节;有些要求对齐,有些不要求对齐。size设置为standard,表示数据类型的长度不随着本地环境而改变。

    可以通过下面的方法,查看本地的字节顺序

    import sys

    print(sys.byteorder)

    我的电脑处理器i7, 系统win10。 显示的little, 也就是小端模式

    后面还有几个例子,来说明x,c, s类型。

    x表示填充字节。如果首字符设置的是不填充,那么一个x代表一个字节。pack中不需要有数据与之对应。

    [hex(i) for i in struct.pack(',16909060)]

    Out[76]: ['0x0', '0x0', '0x4', '0x3', '0x2', '0x1']

    如果首字符设置的是填充,并且在x的位置本来就有填充,那么x就不起作用,除非x的个数超过了本来要填充的数目。

    [hex(i) for i in struct.pack('xxi',16909060)] #x不起作用,因为本身要填充3个字节

    输出:

    ['0x2a', '0x0', '0x0', '0x0', '0x4', '0x3', '0x2', '0x1']

    [hex(i) for i in struct.pack('cxxxxi',b'*', 16909060)] #x起作用,x数超过了3个字节,int对齐到下下一个4字节了

    输出:

    ['0x2a',

    '0x0',

    '0x0',

    '0x0',

    '0x0',

    '0x0',

    '0x0',

    '0x0',

    '0x4',

    '0x3',

    '0x2',

    '0x1']

    c表示的是一个char,其实只能用字节数据,并且字节长度只能是1。 但是可以在c前面加数字,避免连续写几个c(也适用x)。

    [hex(i) for i in struct.pack('<3ci', b'a', b'b', b'c',16909060)]

    Out[75]: ['0x61', '0x62', '0x63', '0x4', '0x3', '0x2', '0x1']

    s表示的是字符串,其实也是只能用字节数据,不过字节长度可以大于1。在s前面加数字,表示这个串的长度。如果后面字节数目不够,就会填充0;如果后面字节数过长,就会截取。

    [hex(i) for i in struct.pack('<1si', b'abc',16909060)]

    Out[90]: ['0x61', '0x4', '0x3', '0x2', '0x1']

    [hex(i) for i in struct.pack('<10si', b'abc',16909060)]

    Out[89]:

    ['0x61',

    '0x62',

    '0x63',

    '0x0',

    '0x0',

    '0x0',

    '0x0',

    '0x0',

    '0x0',

    '0x0',

    '0x4',

    '0x3',

    '0x2',

    '0x1']

    哎,写了这么长,累死了。

    展开全文
  • 大家都知道计算机的存储在物理上是二进制的,所以 文本文件二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。 简单来说, 文本文件是基于字符编码的文件,常见的编码有ASCII编码,...

    大家都知道计算机的存储在物理上是二进制的,所以 文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。 简单来说, 文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。 二进制文件是基于值编码的

    一,文本文件的读取

    1,FileInputStream:按字节读取文件

    1.1,导入包

    import java.io.FileInputStream;

    java.io.InputStream;

    import java.io.*;

    1.2,生成一个InputStream对象

    InputStream in = new FileInputStream("myfile//a.txt");//("myfile//a.txt",true),写入的内容追加在原有内容的后面,不覆盖

    1.3,一个一个字节地读取文件内容

    try {

    int size = in.available();

    char x[] = new char[200];

    for (int i = 0; i < size; i++) {

    x[i] = (char)in.read();

    System.out.print(x[i]);

    }

    }

    catch (IOException ex1) {

    ex1.printStackTrace();

    }

    1.4,关闭对象

    finally{

    try {

    in.close();

    }

    catch (IOException ex2) {

    ex2.printStackTrace();

    }

    }

    =================================================

    2,FileOutputStream:按字节写入文件

    2.1,导入包

    import java.io.*;

    2.2,声明一个OutputStream引用

    OutputStream out =null;

    2.3,构造一个OutputStream对象,并在其中写入内容

    try {

    out = new FileOutputStream("b.txt");

    String str ="java终于完了";

    byte[] b = str.getBytes();

    try {

    out.write(b, 0, b.length);

    }

    catch (IOException ex1) {

    ex1.printStackTrace();

    }

    2.4,关闭对象

    finally{

    try {

    out.close();

    }

    catch (IOException ex2) {

    ex2.printStackTrace();

    }

    }

    =================================

    3,BufferedReader:按字符读取内容

    3.1,导入包

    import java.io.*;

    3.2,声明一个FileReader和BufferedReader的引用

    FileReader fr  = null;

    BufferedReader buf =null;

    3.3,构造一个FileReader和BUfferedReader的对象

    fr = new FileReader("myfile//a.txt");

    buf = new BufferedReader(fr);

    3.4,按行读取文件内容

    try {

    String s = buf.readLine();

    while(s!=null)

    {

    System.out.println(s);

    s =buf.readLine();

    }

    }

    catch (IOException ex1) {

    ex1.printStackTrace();

    }

    3.5,关闭对象连接

    finally{

    try {

    buf.close();

    fr.close();

    }

    catch (IOException ex2) {

    ex2.printStackTrace();

    }

    }

    ====================================

    4,BufferWriter:按字符写入内容

    4.1,导入包

    import java.io.*;

    4.2,声明一个FileWriter和BufferedWriter的引用

    FileWriter fw  = null;

    BufferedWriter buf = null;

    4.3,构造一个FileWriter和BUfferedWriter的对象,并写入内容

    try {

    fw = new FileWriter("c.txt");

    buf = new BufferedWriter(fw);

    buf.write("你好!!");

    }

    catch (IOException ex) {

    ex.printStackTrace();

    }

    4.4,关闭对象连接

    finally{

    try {

    buf.close();

    fw.close();

    }

    catch (IOException ex1) {

    ex1.printStackTrace();

    }

    }

    ====================================

    二,二进制文件的读写

    1,导入包

    import java.io.*;

    2,生成FileInputStream,DataInputStream,FileOutputStream,DataOutputStream的对象

    FileInputStream fin = new FileInputStream("d://x.jpg");

    DataInputStream da = new DataInputStream(fin);

    FileOutputStream fout = new FileOutputStream("e://b.jpg");

    DataOutputStream dout = new DataOutputStream(fout);

    3,写入数据

    int temp ;

    try {

    while ( (temp = da.read()) != -1) {

    dout.write(temp);

    }

    }

    catch (IOException ex1) {

    ex1.printStackTrace();

    }

    4,关闭连接

    finally{

    try {

    fin.close();

    da.close();

    fout.close();

    dout.close();

    }

    catch (IOException ex2) {

    ex2.printStackTrace();

    }

    }

    5 将文件转成二进制流,然后进行写入数据操作

    public class IOTest

    {

    public static void main(String[] args) throws FileNotFoundException

    {

    FileOutputStream fout = new FileOutputStream("e:\\2.xls");

    DataOutputStream dout = new DataOutputStream(fout);

    byte[] buffer = getByteFromFile("c:\\1.xls");

    int count, i;

    try

    {

    for (i = 0; i < buffer.length; i++)

    {

    dout.write(buffer[i]);

    }

    }

    catch (IOException e)

    {

    e.printStackTrace();

    }

    finally

    {

    try

    {

    fout.close();

    dout.close();

    }

    catch (IOException ex2)C语言中文本文件与二进制文件的区别 一、文本文件与二进制文件的定义 大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。 简单来说,文本文件是基于字符编码的文件,常

    {

    ex2.printStackTrace();

    }

    }

    }

    private static byte[] getByteFromFile(String file)

    {

    File f = new File(file);

    if (f == null)

    {

    return null;

    }

    try

    {

    FileInputStream stream = new FileInputStream(f);

    ByteArrayOutputStream out = new ByteArrayOutputStream(1024);

    byte[] b = new byte[1024];

    int n;

    while ((n = stream.read(b)) != -1)

    out.write(b, 0, n);

    stream.close();

    out.close();

    return out.toByteArray();

    }

    catch (IOException e)

    {

    }

    return null;

    }

    }

    展开全文
  • 首先在物理上文本文件和二进制文件并没有区别,都是以二进制01的形式存放于存储介质中,他们的区别只是逻辑上的区别,这两种方式只是在编码层次上有差别。文本文件是基于字符编码的文件,常见的编码有ASCII编码,...

    首先在物理上文本文件和二进制文件并没有区别,都是以二进制01的形式存放于存储介质中,他们的区别只是逻辑上的区别,这两种方式只是在编码层次上有差别。文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。

    对于读到的二进制流的解释方式可以分为按文本方式和按二进制方式打开,按文本方式比如ASCII码形式解释,就把读到的二进制流每8比特8比特的翻译,存储是反过程,如果按照二进制的方式打开,则没有任何编码解码的过程。

    一:c的文本读写和二进制读写基本没有区别,只是文本读写会对回车换行进行转化,二进制读写不会有转化的过程。

    二:Java提供了很多进行文件输入输出的类,这些类可以分为文本I/O类和二进制I/O类。文本I/O将数据解释成字符的序列,二进制I/O将数据解释成原始的二进制数。文本在文件中如何存储依赖于文件的编码方式。Java对文本I/O提供自动编码与解码

    在文本文件中存储的数据是以人能读懂的方式表示的,而在二进制文件中存储的数据是用二进制形式来表示的。人读不懂二进制文件,它们是为程序读取而设计的。例如,Java源程序存储在文本文件中,可以使用文本编辑器阅读,但是Java的类存储在二进制文件中,使用Java虚拟机阅读。二进制文件的好处是处理它们的效率比文本文件高

    文本文件是字符的序列构成的,二进制文件是由位的序列构成的。例如,十进制整数199在文本文件中是以三个字符序列‘1’、‘9’、‘9’来存储的,而在二进制文件中它是以byte类型的值C7存储的

    1、文本输入输出

    C#用于文本输入输出的类:StreamReader/streamWriter

    Java用于文本输入输出的类:

    Reader:一个读取字符的抽象基类

    Writer:一个向文件中写入字符的抽象基类

    FileReader:以主机上默认的编码方式从文件中读取字符的类

    FileWriter:以主机上的默认编码方式向文件中写入字符的类

    BufferedReader:一个从缓冲区读取字符的类

    BufferedWriter:一个向缓冲区写入字符的类

    PrintWriter:以文本方式输出基本类型值、字符和字符串

    PrintStream:与PrintWriter类似,只是向控制台输出

    PrintWriter类和PrintSream类可以将对象、字符串和数值以文本的方式输出

    out是定义在System类中类型为PrintStream的一个静态变量。默认情况下,out表示标准输出设备,也就是屏幕。可以使用System.setOut(PrintStream)设置新的out

    InputStreamReader类:以指定的编码方案从文件中读取字符的类

    OutpitStreamWriter类:以指定的编码方案向文件中写入字符的类

    InputStreamReader类和OutpitStreamWriter类用于实现字符和字节之间的转化。写入OutpitStreamWriter的字符用指定的编码方案翻译为字节,同样,从InputStreamReader类读出的字符用指定的编码方案解码为字符。可以使用InputStreamReader类和OutpitStreamWriter类的构造函数指定编码方案,如果没有指定它,采用系统默认的编码方案

    InputStreamReader类和OutpitStreamWriter类的getEncoding()方法返回这个数据流使用的编码方案名称

    java程序使用的是统一码(Unicode),从FileReader流中读取一个字符时,返回该字符的统一码。字符在文件中的编码可能不是统一码,Java自动将统一码转换为文件指定的编码

    2、二进制输入输出

    文本输入输出需要进行编码与解码操作,向文件写入字符时,Java虚拟机将输出字符的统一码转化为文件指定的编码,对应地,从文件读取字符时,将文件中指定的编码转化为统一码。二进制输入输出不要求这些转化,向文件写入字节,就是将源字节复制到文件中,从文件读取字节,就是将文件中的字节原样返回

    例如,假设使用文本I/O将字符‘9’写入文件。由于字符‘9’的统一码是0x0039,所以会根据文件的编码方案将统一码为0x0039转化成新的编码。如果用二进制I/O将一个值存入文件,那么该整数在内存中的精确值被复制到文件中

    由于二进制I/O不需要编码和解码,所以要比文件I/O效率高。二进制文件与主机的编码方案无关,因而是可移植的,所以Java程序可以在任何机器上访问Java程序创建的二进制文件。这也是把Java的类文件存储为二进制文件的原因,因为Java类文件可以在任何具有Java虚拟机的机器上运行

    C#二进制输入输出的类:FileStream

    Java用于二进制输入输出的类:

    InputStream:用于字节输入流的抽象基类

    OutputStream:用于字节输出流的抽象基类

    FileInputStream:一个从文件读取字节的类

    FileOutputStream:一个向文件写入字节的类

    DataInputStream:用于读取基本类型数据值和字符串的类

    DataOutputStream:用于输出基本类型数据值和字符串的类

    BufferedInputStream:一个从缓冲区读取字节的类

    BufferedOutputStream:一个向缓冲区内写入字节的类

    FilterInputStream类和FilterOutputStream类:

    过滤器数据流是为某种目的过滤字节的数据流。基本字节数如流提供的读取方法只能用来读取字节。如果想要读取整数值、双精度值或字符串,需要一个过滤器类来包装输入流。使用过滤器类就可以读取整数值双精度值或字符串,而不仅仅是字节或字符

    DataInputStream扩展了FilterInputStream类并实现了DataInput接口,实现了定义在DataInput接口中读取基本类型值和字符串的方法

    DataOutputStream扩展了FilterOutputStream类并实现了DataOutput接口,实现了定义在DataOutput接口中输出基本类型值和字符串的方法

    3、小结

    从本质上说所有文件都是二进制文件,文本I/O是在二进制I/O基础上提供的一层抽象,它封装了字符的编码和解码过程。在文本I/O中自动进行编码与解码。对于二进制输入,要想能够以正确的类型和正确的顺序读取,并须准确地了解数据是如何让写入的

    将一个字节写入字节流时,字节的确切值发送到输出流。将一个字符写入字符流时,字符按照编码方案转换成它对应的数值。

    从字节流中读取一个字节时,是从输入流读出一个字节的值。而从字符流中读取一个字符时,读取稽几个字节依赖于编码系统

    ACSII码占8位,Java使用的是16位的Unicode码。当一个统一码无法转换为ACSII码时,转换为字符‘?’。例如,如果想把统一码‘u03b1’写到字符流中,送入到字符流的是数值63(表示字符‘?’)。

    文本文件依赖于主机所使用的编码系统,所以将一个文本文件从一台机器转到另一台机器上时,如果两台机器的编码不同,可能会出现错误

    展开全文
  • 一,文本文件的读取1,FileInputStream:按字节读取文件1.1,导入包import java.io.FileInputStream;java.io.InputStream;import java.io.*;1.2,生成一个InputStream对象InputStream in = new FileInputStream(...
  • (转)文本文件和二进制文件

    千次阅读 2021-01-17 16:59:35
    Java对文本I/O提供自动编码与解码在文本文件中存储的数据是以人能读懂的方式表示的,而在二进制文件中存储的数据是用二进制形式来表示的。人读不懂二进制文件,它们是为程序读取而设计的。例如,Java源程...
  • 首先在物理上文本文件和二进制文件并没有区别,都是以二进制01的形式存放于存储介质中,他们的区别只是逻辑上的区别,这两种方式只是在编码层次上有差别。文本文件是基于字符编码的文件,常见的编码有ASCII编码,...
  • 不同的二进制文件需要不同的软件来打开,例如BMP文件,需要一个读图的软件来打开才能看到里面保存的图像,MP3文件需要一个播放器软件才能听到里面的音频。而文本文件只需要记事本就可以打开查看里面的内容。 2 ...
  • 存储:不管是文本文件还是二进制文件,都是与二进制的形式存储在计算机中。 展现:文本二进制是文件的不同展现形式。 文本文件:当文件由单一统一的编码方式进行编码时,则为文本文件,如UTF-8(.txt文件或.py文件...
  • 一个完整的程序一般都包括数据的存储读取;我们在前面写的程序数据都没有进行实 际的存储,因此 python 解释器执行完数据就消失了。实际开发中,我们经常需要从外部存 储介质(硬盘、光盘、U ...二进制文件: 二进制
  • 六、C语言实现文本文件和二进制文件的拷贝 1、代码实现 #include<stdio.h> #include<assert.h> //文本文件拷贝 void TxtFileCopy(FILE* des, FILE* arc) { assert(arc != NULL);//添加断言==if(arc==...
  • h1 谈论二进制和文本文件存储不在物理层面,是两种不同的转换方式而已,计算机存储的话都以二进制格式进行存储的; h1 二进制转换方式的存储特点: h2 没有精度丢失; h2 存储空间大部分情况比文本文件更节省空间...
  • 本程序要自己创建个文本格式的输入文件a1.txt,...然后再将二进制文件还原并存入a3.txt文件。具体代码如下:#include #include #include #define NSIZE 8void print_2(int val2);/***********文本文件转二进制*****...
  • 那么,文本文件和二进制文件有什么区别呢? 根据我们以往的经验,文本文件通常用来保存肉眼可见的字符,比如 .txt 文件、.c 文件、.dat 文件等,用文本编辑器打开这些文件,我们能够顺利看懂文件的内容。而二进制...
  • 1.linux平台下文本文件和二进制文件的读写在linux平台下进行文件读写时,文本模式和二进制模式没有区别。在文件读写时,调用fopen,无论以文本模式还是二进制模式打开文件,之后在进行文件读取和写入,其结果都是...
  • 0那么断定这个文件是二进制的,这在纯英文的环境下可以工作,但是如果一个文本包含了中文字符,那么这个文1、文本文件的复制package test;import java.io.BufferedReader;import java.io.BufferedWriter;import java...
  • 稍微了解C程序设计的人都知道,文本文件和二进制文件在计算机上面都是以0,1存储的,那么两者怎么还存在差别呢?对于编程人员来说,文本文件和二进制文件就是一个声明,指明了你应该以什么方式(文本方式/二进制)打开...
  • 使用 C 语言的 fopen 打开文件时,可以指定的 mode 有 12 个,其中 6 个包含"b"使用 C++ 的 fstream 打开文件时,可用的模式组合有 24 个(?),其中 12 个包含"binary"使用 python 的 open 打开文件,除了可以使用 C ...
  • 我觉得,对于编程人员,文本文件和二进制文件就是一个声明,指明了你应该以什么方式(文本方式/二进制)打开这个文件,用什么函数读写这个文件(读写函数),怎么判断读到这个文件结尾。具体的说:1。以哪种方式...
  • 本示例阐释二进制文件的基本输入输出(使用 BinaryReader、BinaryWriter FileStream 类。 在如何创建日志文件标题下面有一个类似的主题。读写二进制信息使您可以创建使用通过其他输入输出方法无法访问的文件...
  • 掌握C语言二进制文件读写方式;掌握CPP文本文件读写方式;掌握CPP二进制文件读写方式;二:C语言文本文件读写1. 文本文件写入//采用C模式对Txt进行写出void TxtWrite_Cmode(){//准备数据int index[50] ;double x_pos...
  • (2012-04-13 07:22:09)标签:文本文件二进制linux如何杂谈请教个问题,Linux下如何区分二进制文件和文本文件?RT,我想全文索引硬盘中的文本文件(包括程序文件、脚本、txt等等),但如果是二进制文件就不进行索引了。...
  • 谈这个问题,我们首先看一下什么样的文件是文本文件,而什么样的文件又是二进制文件。 什么文件是文本文件呢?我们常见的txt, html, javascript, css, java,python等文件都是文本文件,他们都可以通过windows中的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 388,904
精华内容 155,561
关键字:

文本文件和二进制文件