精华内容
下载资源
问答
  • VB文件的读写操作

    2010-12-17 20:39:35
     记录:计算机处理数据的基本单位,由若干个相互关联的数据项组成。相当于表格中的一行。  文件:记录的集合,相当于一张表。  文件类型:顺序文件随机文件、二进制文件。  访问模式:计算机访问文件的方式...

    1.  文件的有关概念

     记录:计算机处理数据的基本单位,由若干个相互关联的数据项组成。相当于表格中的一行。

     文件:记录的集合,相当于一张表。

     文件类型:顺序文件、随机文件、二进制文件。

     访问模式:计算机访问文件的方式,VB中有顺序、随机、二进制三种访问模式。

    2. 顺序访问模式

        顺序访问模式的规则最简单,指读出或写入时,从第一条记录“顺序”地读到最后一条记录,不可以跳跃式访问。该模式专门用于处理文本文件,每一行文本相当于一条记录,每条记录可长可短,记录与记录之间用“换行符”来分隔。

      顺序文件的写入步骤:打开、写入、关闭;  读出步骤:打开、读出、关闭。

    (1)打开文件

      打开文件的命令是Open,格式为:

              Open “文件名” For 模式  As [#] 文件号 [Len=记录长度]

      说明:

       1)文件名可以是字符串常量也可以是字符串变量

       2)模式可以是下面之一:

           OutPut:打开一个文件,将对该文件进行写操作

           Input:打开一个文件,将对该文件进行读操作

           Append:打开一个文件,将在该文件末尾追加记录

       3) 文件号是一个介于1-511之间的整数,打开一个文件时需要指定一个文件号,这个文件号就代表该文件,直到文件关闭后这个号才可以被其他文件所使用。可以利用FreeFile()函数获得下一个可以利用的文件号。

           例: Open  "D:\sj\aaa"  For  Output  As  #1   

        意思是:打开D:\SJ下aaa文件供写入数据,文件号为#1

    (2)写操作

       将数据写入磁盘文件所用的命令是:Write# 或Print#。语法格式:

      1) Print #文件号,[输出列表]
        
         例: Open “D:\SJ\TEST.DAT” For  Output  As  #1

            Print  #1,Text1.Text        '把文本框的内容一次性写入文件

           Close  #1

      2)Write #文件号,[输出列表]

            其中的输出列表一般指用逗号,分隔的数值或字符串表达式。Write #与Print #的功能基本相同,区别是Write #是以紧凑格式存放,在数据间插入逗号,并给字符串加上双引号。

    (3)  关闭文件

       结束各种读写操作后,必须将文件关闭,否则会造成数据丢失。关闭文件的命令是Close。

       Close  [#]文件号[,[#]文件号]……

       例: Close  #1,#2,#3

    (4) 读操作

      1) Input #文件号,变量列表

       作用:将从文件中读出的数据分别赋给指定的变量。

        注意:与Write #配套才可以准确地读出。

      2)Line  Input #文件号,字符串变量

        用于从文件中读出一行数据,并将读出的数据赋给指定的字符串变量,读出的数据中不包含回车符和换行符,可与Print #配套用。

      3)Input$(读取的字符数,#文件号)

        该函数可以读取指定数目的字符。

        与读文件有关的两个函数:

        LOF():返回某文件的字节数

        EOF():检查指针是否到达文件尾。

        例:将一个文本文件读入文本框的三种方法。

    3.随机访问模式

         该模式要求文件中的每条记录的长度都是相同的,记录与记录之间不需要特殊的分隔符号。只要给出记录号,可以直接访问某一特定记录,其优点是存取速度快,更新容易。

     (1)  打开与关闭

        打开:Open “文件名” For  Random  As [#] 文件号 [Len=记录长度]

        关闭:Close  #文件号

           注意:文件以随机方式打开后,可以同时进行写入和读出操作,但需要指明记录的长度,系统默认长度为128个字节。

     (2)读与写

        读操作:Get  [#]文件号,[记录号],变量名

        说明:Get命令是从磁盘文件中将一条由记录号指定的记录内容读入记录变量中;记录号是大于1的整数,表示对第几条记录进行操作,如果忽略不写,则表示当前记录的下一条记录。

           写操作:Put  [#]文件号,[记录号],变量名

         说明:Put命令是将一个记录变量的内容,写入所打开的磁盘文件指定的记录位置;记录号是大于1的整数,表示写入的是第几条记录,如果忽略不写,则表示在当前记录后插入一条记录。

    4.  二进制访问模式

      打开:Open “文件名” For  Binary  As [#] 文件号 [Len=记录长度]

         关闭:Close  #文件号

         该模式是最原始的文件类型,直接把二进制码存放在文件中,没有什么格式,以字节数来定位数据,允许程序按所需的任何方式组织和访问数据,也允许对文件中各字节数据进行存取和访问。

        该模式与随机模式类似,其读写语句也是Get 和Put,区别是二进制模式的访问单位是字节,随机模式的访问单位是记录。在此模式中,可以把文件指针移到文件的任何地方,刚开始打开时,文件指针指向第一个字节,以后随文件处理命令的执行而一旦。文件一旦打开,就可以同时进行读写。

    摘自:网络整理


    相关参考


    VB查找替代字符串的函数

    VB换行气泡提示类

    VB/VBA通用路径选择对话框

    ASCII码表0-255完整版 附详细注释

    VBKeyAscii

    VB取得TextBoxRichTextBox光标所在的行和列(支持汉字)

    VB取得TextBoxRichTextBox光标所在的行和列(支持汉字)

    VB如何实现Undo(撤消)功能

    VB计算文本文件的行数

    VB获取快捷方式原文件路径

    微软 Small Basic 简体中文版 已经发布了

    VB操作Excel 非常详细 [网摘]

    VB如何判断文件正被占用/已被打开

    VB添加listbox 的水平卷动轴

    VB打开资源管理器并指定文件

    VB根据窗体自动调整窗体内控件大小 注:实用,可以直接引用

    VB中的指针技术

    Visual Basic编程常见问题及解答(1

    Visual Basic编程常见问题及解答(2

    Visual Basic编程常见问题及解答(3

    VisualBasic变量、常数和数据类型及过程概述

    VB6的后期绑定和前期绑定

    VB用户控件制作讲解与实例

    VB制作OCX控件的步骤

    VBFSO的调用的两种方法

    VB操作EXCEL

    VB判断文件及目录的存在性

    VB网站(最新、经典源代码、技术文章、基础知识)

    VB得到指定文件夹下的文件列表

    VB产生随机任意大小文件挤满硬盘

    VB文件的读写操作

    VB创建超链接 打开指定网站的几种方法

    VB 源码 删除重复行程序 函数

    VB 计算自己程序段所用时间

    VB 获取路径名各部分 (获取文件路径,获取文件名,获取文件扩展名)自编

    几行VB代码拿下注册表

    VB 在浏览器中打开指定网址

    VB窗口置顶

    vb ListBox 之中点击右键弹出菜单

    展开全文
  • 存储基本概念

    2019-07-20 22:06:13
    存储基本概念 2019-07-20 ...存储一些基本概念 一些专业术语解释 ...从逻辑上存储通常分为块...块存储:块存储(DAS/SAN)通常应用在某些专有系统中,这类应用要求很高的随机读写...

    存储基本概念

    • 存储的一些基本概念
    • 一些专业的术语解释
    • 持续更新ing

    从逻辑上存储通常分为块存储文件存储对象存储

    存储分类及应用

    • 块存储:块存储(DAS/SAN)通常应用在某些专有的系统中,这类应用要求很高的随机读写性能和高可靠性,上面搭载的通常是Oracle/DB2这种传统数据库,连接通常是以FC光纤(8Gb/16Gb)为主,走光纤协议。如果要求稍低一些,也会出现基于千兆/万兆以太网的连接方式,MySQL这种数据库就可能会使用IP SAN,走iSCSI协议。通常使用块存储的都是系统而非用户,并发访问不会很多,经常出现一套存储只服务一个应用系统,例如如交易系统,计费系统。典型行业如金融,制造,能源,电信等。块存储通常都是通过光纤网络连接,服务器/小机上配置FC光纤HBA卡,通过光纤交换机连接存储(IP SAN可以通过千兆以太网,以iSCSI客户端连接存储),主机端以逻辑卷(Volume)的方式访问。连接成功后,应用访问存储是按起始地址,偏移量Offset的方法来访问的。
    • 文件存储:文件存储(NAS)相对来说就更能兼顾多个应用和更多用户访问,同时提供方便的数据共享手段。毕竟大部分的用户数据都是以文件的形式存放,在PC时代,数据共享也大多是用文件的形式,比如常见的的FTP服务,NFS服务,Samba共享这些都是属于典型的文件存储。几十个用户甚至上百用户的文件存储共享访问都可以用NAS存储加以解决。在中小企业市场,一两台NAS存储设备就能支撑整个IT部门了。CRM系统,SCM系统,OA系统,邮件系统都可以使用NAS存储统统搞定。甚至在公有云发展的早几年,用户规模没有上来时,云存储的底层硬件也有用几套NAS存储设备就解决的,甚至云主机的镜像也有放在NAS存储上的例子。文件存储的广泛兼容性和易用性,是这类存储的突出特点。但是从性能上来看,相对SAN就要低一些。NAS存储基本上是以太网访问模式,普通千兆网,走NFS/CIFS协议。文件存储通常只要是局域网内,千兆/百兆的以太网环境皆可。网线连上,服务器端通过操作系统内置的NAS客户端,如NFS/CIFS/FTP客户端挂载存储成为一个本地的文件夹后访问,只要符合POXIS标准,应用就可以用标准的open,seek, write/read,close这些方法对其访问操作。
    • 对象存储:对象存储概念出现得晚一些,存储标准化组织SINA早在2004年就给出了定义,但早期多出现在超大规模系统,所以并不为大众所熟知,相关产品一直也不温不火。一直到云计算和大数据的概念全民强推,才慢慢进入公众视野。前面说到的块存储和文件存储,基本上都还是在专有的局域网络内部使用,而对象存储的优势场景却是互联网或者公网,主要解决海量数据,海量并发访问的需求。基于互联网的应用才是对象存储的主要适配(当然这个条件同样适用于云计算,基于互联网的应用最容易迁移到云上,因为没出现云这个名词之前,他们已经在上面了),基本所有成熟的公有云都提供了对象存储产品,不管是国内还是国外。对象存储常见的适配应用如网盘、媒体娱乐,医疗PACS,气象,归档等数据量超大而又相对“冷数据”和非在线处理的应用类型。这类应用单个数据大,总量也大,适合对象存储海量和易扩展的特点。网盘类应用也差不多,数据总量很大,另外还有并发访问量也大,支持10万级用户访问这种需求就值得单列一个项目了(这方面的扫盲可以想想12306)。归档类应用只是数据量大的冷数据,并发访问的需求倒是不太突出。另外基于移动端的一些新兴应用也是适合的,智能手机和移动互联网普及的情况下,所谓UGD(用户产生的数据,手机的照片视频)总量和用户数都是很大挑战。毕竟直接使用HTTP get/put就能直接实现数据存取,对移动应用来说还是有一定吸引力的。对象存储的访问通常是在互联网,走HTTP协议,性能方面,单独看一个连接的是不高的(还要解决掉线断点续传之类的可靠性问题),主要强大的地方是支持的并发数量,聚合起来的性能带宽就非常可观了。对象存储不在乎网络,而且它的访问比较有特色,只能存取删(put/get/delete),不能打开修改存盘。只能取下来改好后上传,去覆盖原对象。//因为中间是不可靠的互联网啊,不能保证你在修改时候不掉线啊。所谓你在这头,对象在那头,所爱对象隔山海,山海不可平。

    应用

    • 块存储:通过某种协议(e.g.SAS、SCSI、SAN、iSCSI)从后端存储 Assigned、Attached 块设备(Volume),然后分区格式化、创建文件系统并 mount 到操作系统,然后就可以在此文件系统之上存储数据,或者也可以直接使用裸硬盘来存储数据(e.g. 数据库系统)
    • 文件存储:通过 NFS、CIFS 等协议,mount 远程文件系统到本地操作系统。NAS、NFS 服务器,以及各种分布式文件系统提供的都是这种存储。
    • 对象存储:对象存储是以对象形式存储数据的存储系统,最大的优势就是可以让用户更加灵活的处理海量数据。操作系统客户端可以通过对象存储提供的存储网关接口(一般是 HTTP/S)来上传或下载存储数据。

    参考文献

    RAID (Redundant Array of Independent Disks)

    • 独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),简称磁盘阵列。利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的提升性能或数据冗余或是两者同时提升。
    • 在运作中,取决于 RAID 层级不同,数据会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,例如.RAID 0,RAID 1,RAID 5,RAID 6,RAID 7,RAID 01,RAID 10,RAID 50,RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。
    • 简单来说,RAID把多个硬盘组合成为一个逻辑硬盘,因此,操作系统只会把它当作一个硬盘。RAID常被用在服务器计算机上,并且常使用完全相同的硬盘作为组合。由于硬盘价格的不断下降与RAID功能更加有效地与主板集成,它也成为普通用户的一个选择,特别是需要大容量存储空间的工作,如:视频与音频制作。
    • JBOD(Just a Bunch Of Disks)指将数个物理硬盘,在操作系统中合并成一个逻辑硬盘,以直接增加容量。

    RAID0 条带化

    • RAID0 是一种简单的、无数据校验的数据条带化技术。实际上不是一种真正的 RAID ,因为它并不提供任何形式的冗余策略。 RAID0 将所在磁盘条带化后组成大容量的存储空间,将数据分散存储在所有磁盘中,以独立访问方式实现多块磁盘的并读访问。由于可以并发执行 I/O 操作,总线带宽得到充分利用。再加上不需要进行数据校验,RAID0 的性能在所有 RAID 等级中是最高的。理论上讲,一个由 n 块磁盘组成的 RAID0 ,它的读写性能是单个磁盘性能的 n 倍,但由于总线带宽等多种因素的限制,实际的性能提升低于理论值。
    • RAID0 具有低成本、高读写性能、 100% 的高存储空间利用率等优点,但是它不提供数据冗余保护,一旦数据损坏,将无法恢复。 因此, RAID0 一般适用于对性能要求严格但对数据安全性和可靠性不高的应用,如视频、音频存储、临时数据缓存空间等。

    RAID1 镜像

    • RAID1 称为镜像,它将数据完全一致地分别写到工作磁盘和镜像 磁盘,它的磁盘空间利用率为 50% 。 RAID1 在数据写入时,响应时间会有所影响,但是读数据的时候没有影响。 RAID1 提供了最佳的数据保护,一旦工作磁盘发生故障,系统自动从镜像磁盘读取数据,不会影响用户工作。
    • RAID1 与 RAID0 刚好相反,是为了增强数据安全性使两块 磁盘数据呈现完全镜像,从而达到安全性好、技术简单、管理方便。 RAID1 拥有完全容错的能力,但实现成本高。 RAID1 应用于对顺序读写性能要求高以及对数据保护极为重视的应用,如对邮件系统的数据保护。

    RAID2 2n海明码校验

    • RAID2 称为纠错海明码磁盘阵列,其设计思想是利用海明码实现数据校验冗余。海明码是一种在原始数据中加入若干校验码来进行错误检测和纠正的编码技术,其中第 2n 位( 1, 2, 4, 8, … )是校验码,其他位置是数据码。因此在 RAID2 中,数据按位存储,每块磁盘存储一位数据编码,磁盘数量取决于所设定的数据存储宽度,可由用户设定。图 4 所示的为数据宽度为 4 的 RAID2 ,它需要 4 块数据磁盘和 3 块校验磁盘。如果是 64 位数据宽度,则需要 64 块 数据磁盘和 7 块校验磁盘。可见, RAID2 的数据宽度越大,存储空间利用率越高,但同时需要的磁盘数量也越多。
    • 海明码自身具备纠错能力,因此 RAID2 可以在数据发生错误的情况下对纠正错误,保证数据的安全性。它的数据传输性能相当高,设计复杂性要低于后面介绍的 RAID3 、 RAID4 和 RAID5 。
    • 但是,海明码的数据冗余开销太大,而且 RAID2 的数据输出性能受阵列中最慢磁盘驱动器的限制。再者,海明码是按位运算, RAID2 数据重建非常耗时。由于这些显著的缺陷,再加上大部分磁盘驱动器本身都具备了纠错功能,因此 RAID2 在实际中很少应用,没有形成商业产品,目前主流存储磁盘阵列均不提供 RAID2 支持。

    RAID3 校验盘

    • RAID3 是使用专用校验盘的并行访问阵列,它采用一个专用的磁盘作为校验盘,其余磁盘作为数据盘,数据按位可字节的方式交叉存储到各个数据盘中。RAID3 至少需要三块磁盘,不同磁盘上同一带区的数据作 XOR 校验,校验值写入校验盘中。 RAID3 完好时读性能与 RAID0 完全一致,并行从多个磁盘条带读取数据,性能非常高,同时还提供了数据容错能力。向 RAID3 写入数据时,必须计算与所有同条带的校验值,并将新校验值写入校验盘中。一次写操作包含了写数据块、读取同条带的数据块、计算校验值、写入校验值等多个操作,系统开销非常大,性能较低。
    • 如果 RAID3 中某一磁盘出现故障,不会影响数据读取,可以借助校验数据和其他完好数据来重建数据。假如所要读取的数据块正好位于失效磁盘,则系统需要读取所有同一条带的数据块,并根据校验值重建丢失的数据,系统性能将受到影响。当故障磁盘被更换后,系统按相同的方式重建故障盘中的数据至新磁盘。
    • RAID3 只需要一个校验盘,阵列的存储空间利用率高,再加上并行访问的特征,能够为高带宽的大量读写提供高性能,适用大容量数据的顺序访问应用,如影像处理、流媒体服务等。目前, RAID5 算法不断改进,在大数据量读取时能够模拟 RAID3 ,而且 RAID3 在出现坏盘时性能会大幅下降,因此常使用 RAID5 替代 RAID3 来运行具有持续性、高带宽、大量读写特征的应用。

    RAID4 块组织校验盘

    • RAID4 与 RAID3 的原理大致相同,区别在于条带化的方式不同。 RAID4 (图 6 )按照 块的方式来组织数据,写操作只涉及当前数据盘和校验盘两个盘,多个 I/O 请求可以同时得到处理,提高了系统性能。 RAID4 按块存储可以保证单块的完整性,可以避免受到其他磁盘上同条带产生的不利影响。
    • RAID4 在不同磁盘上的同级数据块同样使用 XOR 校验,结果存储在校验盘中。写入数据时, RAID4 按这种方式把各磁盘上的同级数据的校验值写入校验 盘,读取时进行即时校验。因此,当某块磁盘的数据块损坏, RAID4 可以通过校验值以及其他磁盘上的同级数据块进行数据重建。
    • RAID4 提供了 非常好的读性能,但单一的校验盘往往成为系统性能的瓶颈。对于写操作, RAID4 只能一个磁盘一个磁盘地写,并且还要写入校验数据,因此写性能比较差。而且随着成员磁盘数量的增加,校验盘的系统瓶颈将更加突出。正是如上这些限制和不足, RAID4 在实际应用中很少见,主流存储产品也很少使用 RAID4 保护。

    RAID5 校验数据散列分布

    • RAID5 应该是目前最常见的 RAID 等级,它的原理与 RAID4 相似,区别在于校验数据分布在阵列中的所有磁盘上,而没有采用专门的校验磁盘。对于数据和校验数据,它们的写操作可以同时发生在完全不同的磁盘上。因此, RAID5 不存在 RAID4 中的并发写操作时的校验盘性能瓶颈问题。另外, RAID5 还具备很好的扩展性。当阵列磁盘 数量增加时,并行操作量的能力也随之增长,可比 RAID4 支持更多的磁盘,从而拥有更高的容量以及更高的性能。
    • RAID5 (图 7)的磁盘上同时存储数据和校验数据,数据块和对应的校验信息存保存在不同的磁盘上,当一个数据盘损坏时,系统可以根据同一条带的其他数据块和对应的校验数据来重建损坏的数据。与其他 RAID 等级一样,重建数据时, RAID5 的性能会受到较大的影响。
    • RAID5 兼顾存储性能、数据安全和存储成本等各方面因素,它可以理解为 RAID0 和 RAID1 的折中方案,是目前综合性能最佳的数据保护解决方案。 RAID5 基本上可以满足大部分的存储应用需求,数据中心大多采用它作为应用数据的保护方案。

    RAID6 校验数据冗余分布 双重校验

    • 前面所述的各个 RAID 等级都只能保护因单个磁盘失效而造成的数据丢失。如果两个磁盘同时发生故障,数据将无法恢复。 RAID6 (如图 8 )引入双重校验的概念,它可以保护阵列中同时出现两个磁盘失效时,阵列仍能够继续工作,不会发生数据丢失。 RAID6 等级是在 RAID5 的基础上为了进一步增强数据保护而设计的一种 RAID 方式,它可以看作是一种扩展的 RAID5 等级。
    • RAID6 不仅要支持数据的恢复,还要支持校验数据的恢复,因此实现代价很高,控制器的设计也比其他等级更复杂、更昂贵。 RAID6 思想最常见的实现方式是采用两个独立的校验算法,假设称为 P 和 Q ,校验数据可以分别存储在两个不同的校验盘上,或者分散存储在所有成员磁盘中。当两个磁盘同时失效时,即可通过求解两元方程来重建两个磁盘上的数据。
    • RAID6 具有快速的读取性能、更高的容错能力。但是,它的成本要高于 RAID5 许多,写性能也较差,并有设计和实施非常复杂。因此, RAID6 很少得到实际应用,主要用于对数据安全等级要求非常高的场合。它一般是替代 RAID10 方案的经济性选择。

    RAID00 RAID01 RAID10 RAID100 RAID30 RAID50 RAID53 RAID60

    • 标准 RAID 等级各有优势和不足。自然地,我们想到把多个 RAID 等级组合起来,实现优势互补,弥补相互的不足,从而达到在性能、数据安全性等指标上更高的 RAID 系统。目前在业界和学术研究中提到的 RAID 组合等级主要有 RAID00 、 RAID01 、 RAID10 、 RAID100 、 RAID30 、 RAID50 、 RAID53 、 RAID60 ,但实际得到较为广泛应用的只有 RAID01 和 RAID10 两个等级。当然,组合等级的实现成本一般都非常昂贵,只是在 少数特定场合应用。
    RAID01 和 RAID10
    • 一些文献把这两种 RAID 等级看作是等同的,本文认为是不同的。 RAID01 是先做条带化再作镜像,本质是对物理磁盘实现镜像;而 RAID10 是先做镜像再作条带化,是对虚拟磁盘实现镜像。相同的配置下,通常 RAID01 比 RAID10 具有更好的容错能力,原理如图 9 所示。
    • RAID01 兼备了 RAID0 和 RAID1 的优点,它先用两块磁盘建立镜像,然后再在镜像内部做条带化。 RAID01 的数据将同时写入到两个磁盘阵列中,如果其中一个阵列损坏,仍可继续工作,保证数据安全性的同时又提高了性能。 RAID01 和 RAID10 内部都含有 RAID1 模式,因此整体磁盘利用率均仅为 50% .

    image
    image

    参考链接

    ROM (Read Only Memory)

    ROM

    • 一种非易失性只读存储器。在制造过程中,将资料以一特制光罩(mask)烧录于线路中,其资料内容在写入后就不能更改,所以有时又称为“光罩式只读内存”(mask ROM)。成本相对较低,常常用于电脑中的开启启动如启动光盘,BIOS芯片等,以及作为固件存放一些硬件的驱动程序。

    PROM

    • 可编程只读存储器(Programmable ROM,PROM)其内部有行列式的镕丝,可依用户(厂商)的需要,利用电流将其烧断,以写入所需的数据及程序,镕丝一经烧断便无法再恢复,亦即数据无法再更改。

    EPROM

    • 可抹除可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)可利用高电压将数据编程写入,但抹除时需将线路曝光于紫外线下一段时间,数据始可被清空,再供重复使用。因此,在封装外壳上会预留一个石英玻璃所制的透明窗以便进行紫外线曝光。写入程序后通常会用贴纸遮盖透明窗,以防日久不慎曝光过量影响数据。

    OTPROM

    • 一次编程只读存储器(One Time Programmable Read Only Memory,OTPROM)内部所用的芯片与写入原理同EPROM,但是为了节省成本,封装上不设置透明窗,因此编程写入之后就不能再抹除改写。

    EEPROM

    • 电子抹除式可复写只读存储器(Electrically Erasable Programmable Read Only Memory,EEPROM)之运作原理类似EPROM,但是抹除的方式是使用高电场来完成,因此不需要透明窗。

    FLASH

    • 闪存(Flash memory)的每一个记忆胞都具有一个“控制闸”与“浮动闸”,利用高电场改变浮动闸的临限电压即可进行编程动作。闪存主要分为NAND型与NOR型。现在NAND常用于固态硬盘、U盘、存储卡等用途,NOR则用于BIOS ROM芯片等用途。
    NOR Flash
    • NOR Flash需要很长的时间进行抹写,但是它提供完整的寻址与数据总线,并允许随机存取存储器上的任何区域,这使的它非常适合取代老式的ROM芯片。当时ROM芯片主要用来存储几乎不需更新的代码,例如电脑的BIOS或机上盒(Set-top Box)的固件。NOR Flash可以忍受一万到一百万次抹写循环,它同时也是早期的可移除式快闪存储媒体的基础。
    NAND Flash
    • NAND Flash式东芝在1989年的国际固态电路研讨会(ISSCC)上发表的, 要在NandFlash上面读写数据,要外部加主控和电路设计。。NAND Flash具有较快的抹写时间, 而且每个存储单元的面积也较小,这让NAND Flash相较于NOR Flash具有较高的存储密度与较低的每比特成本。同时它的可抹除次数也高出NOR Flash十倍。然而NAND Flash 的I/O接口并没有随机存取外部地址总线,它必须以区块性的方式进行读取,NAND Flash典型的区块大小是数百至数千比特。
    EMMC
    • emmc存储器eMMC (Embedded Multi Media Card) 为MMC协会所订立的,eMMC 相当于 NandFlash+主控IC ,对外的接口协议与SD、TF卡一样,主要是针对手机或平板电脑等产品的内嵌式存储器标准规格。eMMC的一个明显优势是在封装中集成了一个控制器,它提供标准接口并管理闪存,使得手机厂商就能专注于产品开发的其它部分,并缩短向市场推出产品的时间。这些特点对于希望通过缩小光刻尺寸和降低成本的NAND供应商来说,同样的重要。

    RAM (Random Access Memory)

    • 与CPU直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。

    SRAM (Static Random Access Memory)

    • 是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存是不同的。

    DRAM (Dynamic Random Access Memory)

    • 主要的作用原理是利用电容内存储电荷的多寡来代表一个二进制比特(bit)是1还是0。由于在现实中晶体管会有漏电电流的现象,导致电容上所存储的电荷数量并不足以正确的判别数据,而导致数据毁损。因此对于DRAM来说,周期性地充电是一个无可避免的要件。由于这种需要定时刷新的特性,因此被称为“动态”存储器。
    Function DRAM SRAM
    刷新 需要刷新。如果存储单元没有被刷新,存储的信息就会丢失。 不需要刷新。这种存储器只要保持通电,里面储存的数据就可以恒常保持
    速度 慢(相对于SRAM), 由于需要不断地刷新数据
    集成度 低。管子数量多,结构复杂,因此集成度低
    静态功耗 高,电容结构,需要对电容刷新充电
    动态功耗 高。管子数量多。
    价格
    用途 内存条 CPU中cache,一级缓存,二级缓存
    SDRAM 同步动态随机存取內存(synchronous dynamic random-access memory)
    • 是有一个同步接口的动态随机存取內存(DRAM)。通常DRAM是有一个异步接口的,这样它可以随时响应控制输入的变化。而SDRAM有一个同步接口,在响应控制输入前会等待一个时钟信号,这样就能和计算机的系统总线同步。时钟被用来驱动一个有限状态机,对进入的指令进行管线(Pipeline)操作。这使得SDRAM与没有同步接口的异步DRAM(asynchronous DRAM)相比,可以有一个更复杂的操作模式。
    • SDRAM从发展到现在已经经历了五代,分别是:第一代SDR SDRAM,第二代DDR SDRAM,第三代DDR2 SDRAM,第四代DDR3 SDRAM,第五代,DDR4 SDRAM。
      image

    SSD (Solid-State Drive)

    • 固态硬盘或固态驱动器(英语:Solid-state drive或Solid-state disk,简称SSD),是一种主要以闪存(NAND Flash)作为永久性存储器的计算机存储设备,此处固态主要相对于以机械臂带动磁头转动实现读写操作的磁盘而言,NAND或者其他固态存储以电位高低或者相位状态的不同记录0和1,用集成电路代替了物理旋转磁盘。
    • SSD 组成:Flash Controller (闪存控制器) and NAND Flash Memory chips (NAND 闪存芯片)
    • 固态硬盘采用SATA 3、M.2或者PCI Express、mSATA、U.2、ZIF、IDE、CF、CFast等接口。但由于价格及存储空间与机械硬盘有巨大差距,固态硬盘当前仍无法完全取代机械式硬盘。

    易失性存储器

    • 由易失性存储器制成的固态硬盘主要用于临时性存储。因为这类存储器需要靠外界电力维持其记忆,所以由此制成的固态硬盘还需要配合电池才能使用。易失性存储器,例如SDRAM,具有访问速度快的特点。利用这一特点,可以将需要运行的程序从传统硬盘复制到易失性存储器中,然后再交由计算机运行,这样可以避免由于传统硬盘的引导延迟、搜索延迟等对程序以及系统造成的影响。
    • 由易失性存储器制成的固态硬盘通常会依靠电池来保证完成应急备份:当电源意外中断时,靠电池驱动的这类固态硬盘可以有足够的时间将数据转移到传统硬盘中。当电力恢复后,再从传统硬盘中恢复数据。

    非易失性存储器

    • 非易失性存储器的数据访问速度介于易失性存储器和传统硬盘之间。和易失性存储器相比,非易失性存储器一经写入数据,就不需要外界电力来维持其记忆。因此更适于作为传统硬盘的替代品。
    • 闪存当中的NAND Flash是最常见的非易失性存储器。小容量的NAND闪存可被制作成带有USB接口的移动存储设备,亦即人们常说的“U盘”。随着生产成本的下降,将多个大容量闪存模块集成在一起,制成以闪存为存储介质的固态硬盘已经是当前的趋势。
    参考链接

    iSCSI (Internet Small Computer System Interface)

    • Internet小型计算机系统接口,又称为IP-SAN,是一种基于因特网及SCSI-3协议下的存储技术,由IETF提出,并于2003年2月11日成为正式的标准。
    • iSCSI利用了TCP/IP的port 860 和 3260 作为沟通的渠道。透过两部计算机之间利用iSCSI的协议来交换SCSI命令,让计算机可以透过高速的局域网集线来把SAN模拟成为本地的储存设备。
    • iSCSI使用 TCP/IP 协议(一般使用TCP端口860和3260)。 本质上,iSCSI 让两个主机通过 IP 网络相互协商然后交换 SCSI 命令。这样一来,iSCSI 就是用广域网仿真了一个常用的高性能本地存储总线,从而创建了一个存储局域网(SAN)。不像某些 SAN 协议,iSCSI 不需要专用的电缆;它可以在已有的交换和 IP 基础架构上运行。然而,如果不使用专用的网络或者子网( LAN 或者 VLAN ),iSCSI SAN 的部署性能可能会严重下降。于是,iSCSI 常常被认为是光纤通道(Fiber Channel)的一个低成本替代方法,而光纤通道是需要专用的基础架构的。但是,基于以太网的光纤通道(FCoE)则不需要专用的基础架构。

    SCSI (Small Computer System Interface)

    • 概念:一种用于计算机和外部设备之间(硬盘、光驱、软驱、打印机等)系统级接口的独立处理器标准。SCSI是一种智能的通用接口标准,它是各种计算机和外部设备之间的接口标准。SCSI标准定义命令、通信协议以及实体的电气特性(换成OSI的说法,就是占据物理层、链接层、套接层、应用层),最大部分的应用是在存储设备上(例如硬盘、磁带机),除外,SCSI可以连接的设备包括有扫描仪、光学设备(像CD、DVD)、打印机等等,SCSI命令中有条列出支持的设备SCSI周边设备

    SAN (Storage Area Network)

    • 开放系统的存储:内置存储 和 外挂存储
    • 外挂存储根据连接的方式分为直连式存储(Direct-Attached Storage,简称DAS)和网络化存储(Fabric-Attached Storage,简称FAS);网络化存储根据传输协议又分为:网络接入存储(Network-Attached Storage,简称NAS)和存储区域网络(Storage Area Network,简称SAN)。
    • DAS: (Direct Attached Storage)直接附加存储,直接附加存储是指将存储设备通过总线(SCSI、PCI、IDE等)接口直接连接到一台服务器上使用。
    • NAS: (Network Attached Storage)网络附加存储。在NAS存储结构中,存储系统不再通过I/O总线附属于某个服务器或客户机,而直接通过网络接口与网络直接相连,由用户通过网络访问。
    • SAN: (Storage Area Network)存储区域网络,是一种高速的、专门用于存储操作的网络,通常独立于计算机局域网(LAN)。SAN将主机(管理server,业务server等)和存储设备连接在一起,能够为其上的任意一台主机和任意一台存储设备提供专用的通信通道。SAN将存储设备从服务器中独立出来,实现了服务器层次上的存储资源共享。SAN将通道技术和网络技术引入存储环境中,提供了一种新型的网络存储解决方案,能够同时满足吞吐率、可用性、可靠性、可扩展性和可管理性等方面的要求。
      • FC-SAN: FC-SAN顾名思义就是直接通过FC(光纤)通道来连接磁盘阵列,数据通过发送SCSI命令来直接与硬件进行通信,从而提高了整体的速率。
      • IP-SAN: IP-SAN(IP存储)的通信通道是使用IP通道,而不是光纤通道,把服务器与存储设备连接起来的技术,除了标准已获通过的iSCSI,还有FCIP、iFCP等正在制定的标准。而iSCSI发展最快,已经成了IP存储一个有力的代表。
        image

    iSCSI的使用

    • iSCSI技术在工作形式上分为服务端(target)与客户端(initiator),iSCSI服务端即用于存放硬盘存储资源的服务器,作为前面创建RAID磁盘阵列组的存储端,能够为用户提供可用的存储资源。而iSCSI客户端则是用户使用的软件,用于获取远程服务端的存储资源
    • IQN (iSCSI Qualified Name):“iSCSI限定名称”。每个发起端和目标需要唯一名称进行表示最好的作法是使用一个在INTERNET上可能独一无二的名称
    • iSCSI Client/Host:系统中的iSCSI客户端或主机(也称为iSCSI initiator),诸如服务器,连接在IP网络并对iSCSI target发起请求以及接收响应。每一个iSCSI主机通过唯一的IQN来识别,类似于光纤通道的WWN。要在IP网络上传递SCSI块命令,必须在iSCSI主机上安装iSCSI驱动。推荐通过GE适配器(每秒1000 megabits)连接至iSCSI target。如同标准10/100适配器,大多数Gigabit适配器使用Category 5 或Category 6E线缆。适配器上的各端口通过唯一的IP地址来识别。
    • iSCSI Target:iSCSI target是接收iSCSI命令的设备。此设备可以是终端节点,如存储设备,或是中间设备,如IP和光纤设备之间的连接桥。每一个iSCSI target通过唯一的IQN来标识,存储阵列控制器上(或桥接器上)的各端口通过一个或多个IP地址来标识。
    参考链接

    LVM (Logical Volumn Manager)

    • 逻辑卷管理,主要解决的问题是,弹性调整文件系统的容量。
    • 与传统的磁盘与分区相比,LVM为计算机提供了更高层次的存储,通过在磁盘分区和文件系统之间增加一个逻辑层,提供一个抽象的逻辑盘卷。
      image
    参考链接

    磁盘基础知识

    • 盘面:硬盘一般含有一个或多个盘片,一个盘片包含两个盘面。一个盘面对应一个磁头。
    • 磁道:每个盘面被划成多个狭窄的同心圆环,这样的圆环叫做磁道。
    • 扇区:每个磁道的每段圆弧叫做一个扇区,是读写的最小单位。
    • 柱面:所有盘面上的同一磁道,在竖直方向构成一个圆柱,称为柱面。
      image
    • 磁盘容量 = 磁头数(盘面数) × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
    • 磁盘读取响应时间
      • 寻道时间:磁头从开始移动到数据所在磁道所需要的时间,寻道时间越短,I/O操作越快。目前磁盘的平均寻道时间一般在3-15ms,一般都在10ms左右。
      • 旋转延迟:盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间,旋转延迟取决于磁盘转速。普通硬盘一般都是7200rpm,慢的5400rpm。
      • 数据传输时间:完成传输所请求的数据所需要的时间。
    块/簇 -> 外存
    • 磁盘块/簇(虚拟出来的)。 块是操作系统中最小的逻辑存储单位。操作系统与磁盘打交道的最小单位是磁盘块。
    • 通俗的来讲,在Windows下如NTFS等文件系统中叫做簇;在Linux下如Ext4等文件系统中叫做块(block)。每个簇或者块可以包括2、4、8、16、32、64…2的n次方个扇区。
    • 为什么存在磁盘块?
      • 读取方便:由于扇区的数量比较小,数目众多在寻址时比较困难,所以操作系统就将相邻的扇区组合在一起,形成一个块,再对块进行整体的操作。
      • 分离对底层的依赖:操作系统忽略对底层物理存储结构的设计。通过虚拟出来磁盘块的概念,在系统中认为块是最小的单位。
    页 -> 内存
    • 操作系统经常与内存和硬盘这两种存储设备进行通信,类似于“块”的概念,都需要一种虚拟的基本单位。所以,与内存操作,是虚拟一个页的概念来作为最小单位。与硬盘打交道,就是以块为最小单位。
    总结
    • 扇区: 硬盘的最小读写单元
    • 块/簇: 是操作系统针对硬盘读写的最小单元
    • page: 是内存与操作系统之间操作的最小单元
    • 扇区 <= 块/簇 <= page

    磁盘分区

    • MBR 分区表:(1) 主要开机区(MBR)446 bytes; (2) 分区表(Partition Table)64 bytes
    • GPT 分区表:分区容量扩充较多,支持更大容量的磁盘。
    参考链接
    Elvis

    The easy way or the right way.

    展开全文
  • c# 文件读写类详解

    2021-02-01 23:24:04
    最近在工作中使用到了文件操作类,但是发现自己对这块基础... 查找:重新设置流当前位置,以便随机读写。但并不是所有流类型都支持查找,如网络流类没有当前位置的概念,就不支持查找。 Stream是虚拟类,它以及它

    最近在工作中使用到了文件操作类,但是发现自己对这块基础掌握还是比较薄弱。因此决定对这块内容好好学习,并记录自己的学习理解。

    一、目前对于文件处理主要是使用流来操作,那么我们首先了解一下什么是流(stream)。流是一个用于传输数据的对象。

    流具有如下3种基本操作:

    • 写入:将数据从内存缓冲区传输到外部源;
    • 读取:将数据从外部源传输到内存缓冲区;
    • 查找:重新设置流的当前位置,以便随机读写。但并不是所有的流类型都支持查找,如网络流类没有当前位置的概念,就不支持查找。

    Stream是虚拟类,它以及它的派生类都提供了Read和Write方法,可以支持在字节级别上对数据进行读写。Read方法从当前字节流读取字节放至内存缓冲区,Write方法把内存缓冲区的字节写入当前流中。

    封装的其他流类

    但仅支持字节级别的数据处理会给开发人员带来不便。将定应用程序需要将字符数据写入到流中,则需要先将字符数据转化为字节数组之后才能调用Write方法写入流。因此,除了Stream及其派生类的读写方法之外,.Net框架同样提供了其他多种支持流读写的类:

      • BinaryReader:从Streams读取编码的字符串和基元数据类型;
      • BinaryWriter:向Streams写入编码的字符串和基元数据类型;
      • StreamReader:通过使用Encoding将字符转换为字节,向Streams写入字符;
      • StreamWriter:通过使用Encoding进行字符和字节的转换,可直接从Streams中读取字符;

    二、常用的文件读写类
    1)FileStream (文件流) 主要用于在二进制文件中读取二进制数据
    2)StreamReader (流读取器)和StreamWriter (流写入器) 专门用于读取文本格式的流产品
    3)BinaryReader和BinaryWriter 专门读写二进制格式的流产品

    三、文件读写类的具体使用

    1、FileStream

    Filestream为文件提供 Stream,既支持同步读写操作,也支持异步读写操作。下面的示例展示了部分 FileStream 构造函数。

    var path = @"d:\MyTest.txt";
                string str = "看数据会不会被覆盖掉";
                byte[] buffer = Encoding.Default.GetBytes(str);
                byte[] bufferRead = new byte[1024 * 1024 * 5];    //声明一个5M大小的字节数组
                ///path参数可以是文件名,包括通用命名约定中的文件 (UNC) 共享。
                // 为构造函数提供对文件的读 / 写访问权限,并打开共享读取访问(也就是说,通过此或其他进程打开文件以进行写入的请求将失败,直到该 FileStream 对象关闭,但读取尝试将成功) 。
                // 不能使用此构造函数打开只读文件; 相反,必须使用接受 FileAccess 值设置为的参数的构造函数 FileAccess.Read 。
                using (FileStream aFile1 = new FileStream(path, FileMode.OpenOrCreate))
                {
                    //向文件中写入数据
                    //aFile1.Write(buffer);
                    //读取文件数据
                    aFile1.Read(bufferRead, 0, bufferRead.Length);
                    var content = Encoding.Default.GetString(bufferRead);
                    Console.WriteLine(content);
                }            
                ///打开文件并选择对该文件的读/写权限,如果该文件不存在则创建该文件,并且具备对该文件的读写权限.这里要注意你运行的软件需要对该文件夹有访问权限否则会引发异常,显示你无权限。
                FileStream aFile2 = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                ///打开文件并可以设置文件读写权限以及对文件的访问类型
                FileStream aFile3 = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite,FileShare.Read);
                ///这个是一个功能比较强大但是实际使用中较少是的一种构造函数
                ///share FileShare
                // 枚举值的按位组合,这些枚举值确定进程共享文件的方式。
                // bufferSize Int32
                // 一个大于零的正 Int32 值,表示缓冲区大小。 默认缓冲区大小为 4096。
                // useAsync Boolean
    
                FileStream aFile4 = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read, 4096, false);

     

    在Filestream初始化时一般来说需要以下几个基础信息:

    (1)FileMode:指定操作系统打开文件的方式。该枚举具有以下属性

    Append 6

    若存在文件,则打开该文件并查找到文件尾,或者创建一个新文件。 这需要 Append 权限。 FileMode.Append 只能与 FileAccess.Write 一起使用。 试图查找文件尾之前的位置时会引发 IOException 异常,并且任何试图读取的操作都会失败并引发 NotSupportedException 异常。

    Create 2

    指定操作系统应创建新文件。 如果此文件已存在,则会将其覆盖。 这需要 Write 权限。 FileMode.Create 等效于这样的请求:如果文件不存在,则使用 CreateNew;否则使用 Truncate。 如果该文件已存在但为隐藏文件,则将引发 UnauthorizedAccessException异常。

    CreateNew 1

    指定操作系统应创建新文件。 这需要 Write 权限。 如果文件已存在,则将引发 IOException异常。

    Open 3

    指定操作系统应打开现有文件。 打开文件的能力取决于 FileAccess 枚举所指定的值。 如果文件不存在,引发一个 FileNotFoundException 异常。

    OpenOrCreate 4

    指定操作系统应打开文件(如果文件存在);否则,应创建新文件。 如果用 FileAccess.Read 打开文件,则需要 Read权限。 如果文件访问为 FileAccess.Write,则需要 Write权限。 如果用 FileAccess.ReadWrite 打开文件,则同时需要 Read 和 Write权限。

    Truncate 5

    指定操作系统应打开现有文件。 该文件被打开时,将被截断为零字节大小。 这需要 Write 权限。 尝试从使用 FileMode.Truncate 打开的文件中进行读取将导致 ArgumentException 异常。

    (2)FileAccess:定义文件的读取、写入或读/写访问权限的常量。该枚举具有以下属性

    Read 1

    对文件的读访问。 可从文件中读取数据。 与 Write 组合以进行读写访问。

    ReadWrite 3

    对文件的读写访问权限。 可从文件读取数据和将数据写入文件。

    Write 2

    文件的写访问。 可将数据写入文件。 与 Read 组合以进行读写访问。

    (3)FileShare:包含用于控制其他 FileStream 对象对同一文件可以具有的访问类型的常数。

    Delete 4

    允许随后删除文件。

    Inheritable 16

    使文件句柄可由子进程继承。 Win32 不直接支持此功能。

    None 0

    谢绝共享当前文件。 文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。

    Read 1

    允许随后打开文件读取。 如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。 但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。

    ReadWrite 3

    允许随后打开文件读取或写入。 如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。 但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。

    Write 2

    允许随后打开文件写入。 如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。 但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。

    (4)bufferSize:一个大于零的正 Int32 值,表示缓冲区大小。 默认缓冲区大小为 4096。

    (5)useAsync (Boolean):

    指定使用异步 I/ O 还是同步 I/ O。 但是,请注意,基础操作系统可能不支持异步 I/ O,因此在指定 true 后,根据所用平台,句柄可能同步打开。当异步打开时,BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) 和 BeginWrite(Byte[], Int32, Int32, AsyncCallback, Object) 方法在执行大量读或写时效果更好,但对于少量的读 / 写,这些方法速度可能要慢得多。 如果应用程序打算利用异步 I/ O,将 useAsync 参数设置为 true。 正确使用异步 I/ O 可以使应用程序的速度加快 10 倍, 但是如果在没有为异步 I / O 重新设计应用程序的情况下使用异步 I/ O,则可能使性能降低 10 倍。

    使用 FileStream 类来读取、写入、打开和关闭文件系统上的文件,以及操作与文件相关的其他操作系统句柄,包括管道、标准输入和标准输出。 您可以使用 Read 、 Write 、 CopyTo 和 Flush 方法执行同步操作,或者使用 ReadAsync 、 WriteAsync 、 CopyToAsync 和 FlushAsync 方法执行异步操作。 使用异步方法来执行占用大量资源的文件操作,而不会阻止主线程。 在 Windows 8.x 应用商店 应用或 桌面 应用中一个耗时的流操作可能阻塞 UI 线程并让您的应用看起来好像不工作时,这种性能的考虑就显得尤为重要了。 FileStream 缓冲输入和输出以提高性能。

    由于Filestrean操作字节的,因此可以操作任意一种类型的文件,但是与此同时也限制了它日常的使用。因此当你使用write方法时需要先将非byte类型的输入内容进行转换为字节。

    2、StreamReader (流读取器)和StreamWriter (流写入器)

    (1)StreamReader 设计用于特定编码的字符输入,而 Stream 类用于字节输入和输出。 用于 StreamReader 读取标准文本文件中的行信息。

         此类型实现 IDisposable 接口。 在使用完类型后,您应直接或间接释放类型。 若要直接释放类型,请在 try/catch 块中调用其 Dispose 方法。 若要间接释放类型,请使用 using(在 C# 中)或 Using(在 Visual Basic 中)等语言构造。 有关详细信息,请参阅 IDisposable 接口主题中的“使用实现 IDisposable 的对象”一节。

    StreamReader 除非另外指定,否则默认为 UTF-8 编码,而不是默认为当前系统的 ANSI 代码页。 UTF-8 正确地处理 Unicode 字符,并为操作系统的本地化版本提供一致的结果。 如果使用属性获取当前字符编码,则 CurrentEncoding 该值在第一种方法之后才是可靠的 Read ,因为在首次调用方法之前不会进行编码自动检测 Read 。默认情况下, StreamReader 不是线程安全的。 

    属性

    BaseStream

    返回基础流。

    CurrentEncoding

    获取当前 StreamReader 对象正在使用的当前字符编码。

    EndOfStream

    获取一个值,该值指示当前的流位置是否在流结尾。

    方法

    Close()

    关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。

    CreateObjRef(Type)

    创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。

    (继承自 MarshalByRefObject)
    DiscardBufferedData()

    清除内部缓冲区。

    Dispose()

    释放由 TextReader 对象使用的所有资源。

    (继承自 TextReader)
    Dispose(Boolean)

    关闭基础流,释放 StreamReader 使用的未托管资源,同时还可以根据需要释放托管资源。

    Equals(Object)

    确定指定对象是否等于当前对象。

    (继承自 Object)
    GetHashCode()

    作为默认哈希函数。

    (继承自 Object)
    GetLifetimeService()

    已过时。

    检索控制此实例的生存期策略的当前生存期服务对象。

    (继承自 MarshalByRefObject)
    GetType()

    获取当前实例的 Type

    (继承自 Object)
    InitializeLifetimeService()

    已过时。

    获取生存期服务对象来控制此实例的生存期策略。

    (继承自 MarshalByRefObject)
    MemberwiseClone()

    创建当前 Object 的浅表副本。

    (继承自 Object)
    MemberwiseClone(Boolean)

    创建当前 MarshalByRefObject 对象的浅表副本。

    (继承自 MarshalByRefObject)
    Peek()

    返回下一个可用字符,但不使用它。

    Read()

    读取输入流中的下一个字符并使该字符位置提升一个字符。

    Read(Char[], Int32, Int32)

    从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区。

    Read(Span<Char>)

    将当前流中的字符读入范围。

    ReadAsync(Char[], Int32, Int32)

    从当前流中异步读取指定的最大字符,并且从指定的索引位置开始将该数据写入缓冲区。

    ReadAsync(Memory<Char>, CancellationToken)

    将当前流中的字符异步读入内存块。

    ReadBlock(Char[], Int32, Int32)

    从当前流中读取指定的最大字符数并从指定的索引位置开始将该数据写入缓冲区。

    ReadBlock(Span<Char>)

    从当前流中读取字符并将数据写入缓冲区。

    ReadBlockAsync(Char[], Int32, Int32)

    从当前流中异步读取指定的最大字符,并且从指定的索引位置开始将该数据写入缓冲区。

    ReadBlockAsync(Memory<Char>, CancellationToken)

    从当前流中异步读取字符并将数据写入缓冲区。

    ReadLine()

    从当前流中读取一行字符并将数据作为字符串返回。

    ReadLineAsync()

    从当前流中异步读取一行字符并将数据作为字符串返回。

    ReadToEnd()

    读取来自流的当前位置到结尾的所有字符。

    ReadToEndAsync()

    异步读取来自流的当前位置到结尾的所有字符并将它们作为一个字符串返回。

    ToString()

    返回表示当前对象的字符串。

    (继承自 Object)

    (2)实现一个 TextWriter,使其以一种特定的编码向流中写入字符。

    下面的示例演示如何使用 StreamWriter 对象写入一个文件,该文件列出 C 驱动器上的目录,然后使用 StreamReader 对象读取和显示每个目录名称。 一种很好的做法是在语句中使用这些对象, using 以便正确地释放非托管资源。 using当使用对象的代码已完成时,该语句会自动对 Dispose 该对象调用。

    static void Main(string[] args)
            {
                // Get the directories currently on the C drive.
                DirectoryInfo[] cDirs = new DirectoryInfo(@"c:\").GetDirectories();
    
                // Write each directory name to a file.
                using (StreamWriter sw = new StreamWriter("CDriveDirs.txt"))
                {
                    foreach (DirectoryInfo dir in cDirs)
                    {
                        sw.WriteLine(dir.Name);
                    }
                }
    
                // Read and show each line from the file.
                string line = "";
                using (StreamReader sr = new StreamReader("CDriveDirs.txt"))
                {
                    while ((line = sr.ReadLine()) != null)
                    {
                        Console.WriteLine(line);
                    }
                }
            }

    StreamWriter 专用于特定编码的字符输出,而从派生的类 Stream 则设计用于字节输入和输出。

     重要:

          此类型实现 IDisposable 接口。 在使用完类型后,您应直接或间接释放类型。 若要直接释放类型,请在 try/catch 块中调用其 Dispose 方法。 若要间接释放类型,请使用 using(在 C# 中)或 Using(在 Visual Basic 中)等语言构造。 

    StreamWriter 除非另外指定,否则默认为使用实例 UTF8Encoding 。 的此实例 UTF8Encoding 在构造时没有字节顺序标记 (BOM) ,因此其 GetPreamble 方法返回一个空字节数组。 此构造函数的默认 UTF-8 编码对无效字节引发异常。 此行为不同于属性中的编码对象提供的行为 Encoding.UTF8 。 若要指定一个 BOM 并确定无效字节是否引发了异常,请使用接受编码对象作为参数的构造函数,例如 StreamWriter(String, Boolean, Encoding) 或 StreamWriter 。

    默认情况下, StreamWriter 不是线程安全的。

    属性

    AutoFlush

    获取或设置一个值,该值指示 StreamWriter 在每次调用 Write(Char) 之后是否都将其缓冲区刷新到基础流。

    BaseStream

    获取同后备存储连接的基础流。

    Encoding

    获取在其中写入输出的 Encoding

    FormatProvider

    获取控制格式设置的对象。

    (继承自 TextWriter)
    NewLine

    获取或设置由当前 TextWriter 使用的行结束符字符串。

    (继承自 TextWriter)

    2、BinaryReader、BinaryWriter

    C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操作,于是StreamWriter和 StreamReader类增强了FileStream,它让我们在字符串级别上操作文件,但有的时候我们还是需要在字节级上操作文件,却又不是一个字节 一个字节的操作,通常是2个、4个或8个字节这样操作,这便有了BinaryWriter和BinaryReader类,它们可以将一个字符或数字按指定 个数字节写入,也可以一次读取指定个数字节转为字符或数字。例如为了操作图像、压缩文件等二进制流文件,可以使用BinaryReader类和BinaryWriter类,用于二进制模式的读写流。BinaryReader的每个读方法都有一个对应的写方法,比如针对不同的数据结构,BinaryReader类提供了ReadByte、ReadBoolean、ReadInt、ReadInt16、ReadString等,与之对应的BinaryReader类则提供了多个重载的Write方法,分别对应上面的读方法,所以使用起来非常方便。例如,当Write方法传递的参数是Int32类型时,利用BinaryWriter的Write方法可用将Int32类型数据转化为长度为4的字节数组,并将字节流传递给一个Stream对象。

    (1)BinaryReader

    BinaryReader类提供简化从流中读取基元数据类型的方法。 例如,可以使用 ReadBoolean 方法将下一个字节作为布尔值读取,并将流中的当前位置提升一个字节。 类包含支持不同数据类型的 read 方法。

    在创建类的新实例时 BinaryReader ,提供从中读取的流,还可以选择指定编码的类型以及是否在释放对象后保持流处于打开状态 BinaryReader 。 如果未指定编码类型,将使用 UTF-8。

    (2)BinaryWriter

    BinaryWriter类提供简化将基元数据类型写入流的方法。 例如,可以使用 Write 方法将布尔值作为单字节值写入流。 类包含支持不同数据类型的写入方法。

    当你创建类的新实例时 BinaryWriter ,你提供要写入的流,并根据需要指定编码的类型以及是否在释放对象后保持流处于打开状态 BinaryWriter 。 如果未指定编码类型,将使用 UTF-8。

    展开全文
  • 这里写目录标题13.1 文件概述13.1.1 基本概念和常识1.二进制思维2.文件类型3.文本文件的编码4....在本节,我们主要介绍文件有关的一些基本概念和常识,Java中处 理文件的基本思路和类结构,以及接下来的章

    13.1 文件概述

             在本节,我们主要介绍文件有关的一些基本概念和常识,Java中处 理文件的基本思路和类结构,以及接下来的章节安排。

    13.1.1 基本概念和常识

             下面,我们先介绍一些基本概念和常识,包括二进制思维、文件类 型、文本文件的编码、文件系统和文件读写等。

    1.二进制思维

             为了透彻理解文件,我们首先要有一个二进制思维所有文件, 不论是可执行文件、图片文件、视频文件、Word文件、压缩文件、txt 文件,都没什么可神秘的,它们都是以0和1的二进制形式保存的。我们 所看到的图片、视频、文本,都是应用程序对这些二进制的解析结果。

             作为程序员,我们应该有一个编辑器,能查看文件的二进制形式, 比如UltraEdit,它支持以十六进制进行查看和编辑。比如,一个文本文 件,看到的内容为:

    在这里插入图片描述
             打开十六进制编辑,看到的内容如图13-1所示。

    在这里插入图片描述

             左边的部分就是其对应的十六进制,“hello"对应的十六进制 是"68656C 6C 6F”,对应ASCII码编号"104101108108111",“马"对应的 十六进制是"E9A9AC”,这是"马"的UTF-8编码。

    2.文件类型

             虽然所有数据都是以二进制形式保存的,但为了方便处理数据,高 级语言引入了数据类型的概念。文件处理也类似,所有文件都是以二进 制形式保存的,但为了便于理解和处理文件,文件也有文件类型的概 念。

             文件类型通常以扩展名的形式体现,比如,PDF文件类型的扩展名 是.pdf,图片文件的一种常见扩展名是.jpg,压缩文件的一种常见扩展名 是.zip。每种文件类型都有一定的格式,代表着文件含义和二进制之间的映射关系。比如一个Word文件,其中有文本、图片、表格,文本可 能有颜色、字体、字号等,doc文件类型就定义了这些内容和二进制表 示之间的映射关系。有的文件类型的格式是公开的,有的可能是私有 的,我们也可以定义自己私有的文件格式。

             对于一种文件类型,往往有一种或多种应用程序可以解读它,进行 查看和编辑,一个应用程序往往可以解读一种或多种文件类型。在操作 系统中,一种扩展名往往关联一个应用程序,比如.doc后缀关联Word应 用。用户通过双击试图打开某扩展名的文件时,操作系统查找关联的应 用程序,启动该程序,传递该文件路径给它,程序再打开该文件。

             需要说明的是,给文件加正确的扩展名是一种惯例,但并不是强制 的,如果扩展名和文件类型不匹配,应用程序试图打开该文件时可能会 报错。另外,一个文件可以选择使用多种应用程序进行解读,在操作系 统中,一般通过右键单击文件,选择打开方式即可。

             文件类型可以粗略分为两类:一类是文本文件另一类是二进制文件文本文件的例子有普通的文本文件(.txt),程序源代码文件 (.java)、HTML文件(.html)等;二进制文件的例子有压缩文件 (.zip)、PDF文件(.pdf)、MP3文件(.mp3)、Excel文件(.xlsx) 等

             基本上,文本文件里的每个二进制字节都是某个可打印字符的一部分,都可以用最基本的文本编辑器进行查看和编辑,如Windows上的notepad、Linux上的vi二进制文件中,每个字节就不一定表示字符, 可能表示颜色、字体、声音大小等,如果用基本的文本编辑器打开,一 般都是满屏的乱码,需要专门的应用程序进行查看和编辑

    3.文本文件的编码

             对于文本文件,我们还必须注意文件的编码方式。文本文件中包含 的基本都是可打印字符,但字符到二进制的映射(即编码)却有多种方 式,如GB18030、UTF-8,我们在第2章详细介绍过各种编码,这里就不 赘述了。

             对于一个给定的文本文件,它采用的是什么编码方式呢?一般而言,我们是不知道的。那应用程序用什么编码方式进行解读呢?一般使 用某种默认的编码方式,可能是应用程序默认的,也可能是操作系统默 认的,当然也可能采用一些比较智能的算法自动推断编码方式。

             对于UTF-8编码的文件,我们需要特别说明。有一种方式,可以标 记该文件是UTF-8编码的,那就是在文件最开头加入三个特殊字节 (0xEF 0xBB 0xBF),这三个特殊字节被称为BOM头BOM是Byte Order Mark(即字节序标记) 的缩写。比如,对前面的hello.txt文件,带 BOM头的UTF-8编码的十六进制形式如图13-2所示。

    在这里插入图片描述

             图13-1和图13-2所示都是UTF-8编码,看到的字符内容也一样,但 二进制内容不一样,一个带BOM头,一个不带BOM头

             需要注意的是,不是所有应用程序都支持带BOM头的UTF-8编码文件,比如PHP就不支持BOM,如果PHP源代码文件带BOM头,PHP运行 就会出错。碰到这种问题时,前面介绍的二进制思维就特别重要,不要只看文件的显示,还要看文件背后的二进制

             另外,我们需要说明下文本文件的换行符。在Windows系统中,换 行符一般是两个字符"\r\n",即ASCII码的13(’\r’)和10(’\n’),在 Linux系统中,换行符一般是一个字符"\n"

    4.文件系统

             文件一般是放在硬盘上的,一个机器上可能有多个硬盘,但各种操作系统都会隐藏物理硬盘概念,提供一个逻辑上的统一结构。在 Windows中,可以有多个逻辑盘,如C、D、E等,每个盘可以被格式化 为一种不同的文件系统,常见的文件系统有FAT32和NTFS。在Linux 中,只有一个逻辑的根目录,用斜线/表示。Linux支持多种不同的文件 系统,如Ext2/Ext3/Ext4等。不同的文件系统有不同的文件组织方式、 结构和特点,不过,一般编程时,语言和类库为我们提供了统一的 API,我们并不需要关心其细节。

             在逻辑上,Windows中有多个根目录,Linux中有一个根目录,每 个根目录下有一棵子目录和文件构成的树。每个文件都有文件路径 的概念,路径有两种形式:一种是绝对路径 ,另一种是相对路径

             所谓绝对路径,是从根目录开始到当前文件的完整路径,在 Windows中,目录之间用反斜线分隔,如C:\code\hello.java,在Linux 中,目录之间用斜线分隔,如/Users/laoma/Desktop/code/hello.java。在 Java中,java.io.File类定义了一个静态变量File.separator,表示路径分隔 符,编程时应使用该变量而避免硬编码

             所谓相对路径,是相对于当前目录 而言的。在命令行终端上,通 过cd命令进入的目录就是当前目录;在Java中,通过 System.getProperty(“user.dir”)可以得到运行Java程序的当前目录。相对路径不以根目录开头,比如在Windows上,当前目录为D:\laoma, 相对路径为code\hello.java,则完整路径为D:\laoma\code\hello.java。

             每个文件除了有具体内容,还有元数据信息 ,如文件名、创建时 间、修改时间、文件大小等。文件还有一个是否隐藏 的性质。在Linux 系统中,如果文件名以.开头,则为隐藏文件;在Windows系统中,隐藏 是文件的一个属性,可以进行设置。

             大部分文件系统的文件和目录具有访问权限 的概念,对所有者、 用户组可以有不同的权限,具体权限包括读、写、执行。

             文件名有大小写是否敏感 的概念。在Windows系统中,一般是大小 写不敏感的,而Linux则一般是大小写敏感的。也就是说,同一个目录下,abc.txt和ABC.txt在Windows中被视为同一个文件,而在Linux中则 被视为不同的文件

             操作系统中有一个临时文件 的概念。临时文件位于一个特定目 录,比如Windows 7中,临时文件一般位于“C:\Users\用户名 \AppData\Local\Temp”;Linux系统中,临时文件位于/tmp。操作系统会有一定的策略自动清理不用的临时文件。临时文件一般不是用户手工创建的,而是应用程序产生的,用于临时目的

    5.文件读写

             文件是放在硬盘上的,程序处理文件需要将文件读入内存,修改后,需要写回硬盘。操作系统提供了对文件读写的基本API,不同操作 系统的接口和实现是不一样的,不过,有一些共同的概念。Java封装了 操作系统的功能,提供了统一的API

             一个基本常识是:硬盘的访问延时,相比内存,是很慢的操作系统和硬盘一般是按块批量传输,而不是按字节,以摊销延时开销,块 大小一般至少为512字节,即使应用程序只需要文件的一个字节,操作 系统也会至少将一个块读进来。一般而言,应尽量减少接触硬盘,接触 一次,就一次多做一些事情。对于网络请求和其他输入输出设备,原则 都是类似的

             另一个基本常识是:一般读写文件需要两次数据复制比如读文件,需要先从硬盘复制到操作系统内核,再从内核复制到应用程序分配的内存中。操作系统运行所在的环境和应用程序是不一样的,操作系统所在的环境是内核态,应用程序是用户态,应用程序调用操作系统的功能,需要两次环境的切换,先从用户态切到内核态,再从内核态切到用 户态。这种用户态/内核态的切换是有开销的,应尽量减少这种切换。

             为了提升文件操作的效率,应用程序经常使用一种常见的策略,即使用缓冲区读文件时,即使目前只需要少量内容,但预知还会接着读取,就一次读取比较多的内容,放到读缓冲区,下次读取时,如果缓 冲区有,就直接从缓冲区读,减少访问操作系统和硬盘。写文件时,先 写到写缓冲区,写缓冲区满了之后,再一次性调用操作系统写到硬盘。 不过,需要注意的是,在写结束的时候,要记住将缓冲区的剩余内容同步到硬盘。操作系统自身也会使用缓冲区,不过,应用程序更了解读写模式,恰当使用往往可以有更高的效率。

             操作系统操作文件一般有打开和关闭的概念打开文件会在操作系统内核建立一个有关该文件的内存结构,这个结构一般通过一个整数索引来引用,这个索引一般称为文件描述符这个结构是消耗内存 的,操作系统能同时打开的文件一般也是有限的,在不用文件的时候, 应该记住关闭文件 。关闭文件一般会同步缓冲区内容到硬盘,并释放占据的内存结构

             操作系统一般支持一种称为内存映射文件 的高效的随机读写大文 件的方法,将文件直接映射到内存,操作内存就是操作文件。在内存映 射文件中,只有访问到的数据才会被实际复制到内存,且数据只会复制 一次,被操作系统以及多个应用程序共享。

    13.1.2 Java文件概述

             在Java中处理文件有一些基本概念和类,包括流、装饰器设计模 式、Reader/Writer、随机读写文件、File、NIO、序列化和反序列化,下 面分别介绍。

    1.流

             在Java中(很多其他语言也类似),文件一般不是单独处理的,而是视为输入输出(Input/Output,IO)设备的一种。Java使用基本统一的 概念处理所有的IO,包括键盘、显示终端、网络等

             这个统一的概念是 ,流有输入流输出流之分。输入流就是可以从中获取数据输入流的实际提供者可以是键盘、文件、网络等输出流就是可以向其中写入数据,输出流的实际目的地可以是显示终端、 文件、网络等

             Java IO的基本类大多位于包java.io中。类InputStream表示输入流, OutputStream表示输出流,而FileInputStream表示文件输入流, FileOutputStream表示文件输出流

             有了流的概念,就有了很多面向流的代码,比如对流做加密、压缩、计算信息摘要、计算检验和等,这些代码接受的参数和返回结果都 是抽象的流,它们构成了一个协作体系,这类似于之前介绍的接口概 念、面向接口的编程,以及容器类协作体系一些实际上不是IO的数据源和目的地也转换为了流,以方便参与这种协作,比如字节数组,也包装为了流ByteArrayInputStream和ByteArrayOutputStream

    2.装饰器设计模式

             基本的流按字节读写,没有缓冲区,这不方便使用。Java解决这个 问题的方法是使用装饰器设计模式引入了很多装饰类,对基本的流增 加功能,以方便使用一般一个类只关注一个方面,实际使用时,经常会需要多个装饰类

             Java中有很多装饰类,有两个基类过滤器输入流FilterInputStream过滤器输出流FilterOutputStream过滤类似于自来水管道,流入的是 水,流出的也是水,功能不变,或者只是增加功能。它有很多子类,这 里列举一些:

             1)对流起缓冲装饰的子类是BufferedInputStream和 BufferedOutputStream。

             2)可以按8种基本类型和字符串对流进行读写的子类是 DataInputStream和DataOutput-Stream。

             3)可以对流进行压缩和解压缩的子类有GZIPInputStream、 ZipInputStream、GZIPOutput-Stream和ZipOutputStream。

             4)可以将基本类型、对象输出为其字符串表示的子类有 PrintStream。

             众多的装饰类使得整个类结构变得比较复杂,完成基本的操作也需 要比较多的代码;其优点是非常灵活,在解决某些问题时也很优雅。

    3.Reader/Writer

             以InputStream/OutputStream为基类的流基本都是以二进制形式处理 数据的,不能够方便地处理文本文件,没有编码的概念能够方便地按字符处理文本数据的基类是Reader和Writer,它也有很多子类:

             1)读写文件的子类是FileReader和FileWriter。

             2)起缓冲装饰的子类是BufferedReader和BufferedWriter。

             3)将字符数组包装为Reader/Writer的子类是CharArrayReader和 CharArrayWriter。

             4)将字符串包装为Reader/Writer的子类是StringReader和 StringWriter。

             5)将InputStream/OutputStream转换为Reader/Writer的子类是 InputStreamReader和OutputStreamWriter。

             6)将基本类型、对象输出为其字符串表示的子类是PrintWriter。

    4.随机读写文件

             大部分情况下,使用流或Reader/Writer读写文件内容,但Java提供 了一个独立的可以随机读写文件的类RandomAccessFile,适用于大小已 知的记录组成的文件。该类在日常应用开发中用得比较少,但在一些系 统程序中用得比较多。

    5.File

             上面介绍的都是操作数据本身,而关于文件路径、文件元数据、文 件目录、临时文件、访问权限管理等,Java使用File这个类来表示。

    6.NIO

             以上介绍的类基本都位于包java.io下,Java还有一个关于IO操作的 包java.nio,nio表示New IO,这个包下同样包含大量的类。

             NIO代表一种不同的看待IO的方式,它有缓冲区和通道的概念利 用缓冲区和通道往往可以达成和流类似的目的,不过,它们更接近操作系统的概念,某些操作的性能也更高比如,复制文件到网络,通道可 以利用操作系统和硬件提供的DMA机制(Direct Memory Access,直接 内存存取),不用CPU和应用程序参与,直接将数据从硬盘复制到网卡

             除了看待方式不同,NIO还支持一些比较底层的功能,如内存映射 文件、文件加锁、自定义文件系统、非阻塞式IO、异步IO等

             不过,这些功能要么是比较底层,普通应用程序用到得比较少,要 么主要适用于网络IO操作,我们大多不会介绍,只会介绍内存映射文 件。

    7.序列化和反序列化

             简单来说,序列化就是将内存中的Java对象持久保存到一个流中, 反序列化就是从流中恢复Java对象到内存。序列化和反序列化主要有两个用处:一是对象状态持久化二是网络远程调用,用于传递和返回对象

             Java主要通过接口Serializable和类 ObjectInputStream/ObjectOutputStream提供对序列化的支持,基本的使用 是比较简单的,但也有一些复杂的地方。不过,Java的默认序列化有一 些缺点,比如,序列化后的形式比较大、浪费空间,序列化/反序列化 的性能也比较低,更重要的问题是,它是Java特有的技术,不能与其他 语言交互

             XML是前几年最为流行的描述结构性数据的语言和格式,Java对象也可以序列化为XML格式。XML容易阅读和编辑,且可以方便地与其 他语言进行交互。XML强调格式化但比较“笨重”JSON是近几年来逐 渐流行的轻量级的数据交换格式,在很多场合替代了XML,也非常容 易阅读和编辑Java对象也可以序列化为JSON格式,且与其他语言进行交互

             XML和JSON都是文本格式,人容易阅读,但占用的空间相对大一 些,在只用于网络远程调用的情况下,有很多流行的、跨语言的、精简 且高效的对象序列化机制,如ProtoBuf、Thrift、MessagePack等。其 中,MessagePack是二进制形式的JSON,更小更快

             文件看起来是一件非常简单的事情,但实际却没有那么简单,Java 的设计也不是太完美,包含了大量的类,这使得对于文件的理解变得困 难。为便于理解,我们将采用以下思路在接下来的章节中进行探讨。

             首先,我们介绍如何处理二进制文件,或者将所有文件看作二进制,介绍如何操作对于常见操作,我们会封装,提供一些简单易用的方法。下一步,我们介绍如何处理文本文件,我们会考虑编码、按行处 理等,同样,对于常见操作,我们会封装,提供简单易用的方法。接下 来,我们介绍文件本身和目录操作File类,我们也会封装常见操作。以 上这些内容是文件处理的基本技术,我们会在本章进行讨论。

             在日常编程中,我们经常会需要处理一些具体类型的文件,如属性 文件、CSV文件、Excel文件、HTML文件和压缩文件,直接使用字节 流/字符流来处理一般是很不方便的,往往有一些更为高层的API,关于 这些,我们下章介绍。此外,下章还会介绍比较底层的对文件的操作 RandomAccessFile类、内存映射文件,以及序列化。文件看上去应该很 简单,但实际却包含很多内容,让我们耐住性子,下一节,先从二进制 开始。

    参考目录

    绝大多数内容来自于:Java编程的逻辑 作者: 马俊昌(13.1 文件概述)

    Java官方文档
    https://docs.oracle.com/javase/specs/index.html

    展开全文
  • 文件系统实现概念

    2016-10-18 21:50:26
    文件系统永远在外存中,存储大量数据。 文件能够原地改写,即能够读出一块,并修改,再写回。...(2)基本文件系统:发送高层命令给设备驱动程序用以对磁盘进行读写。 (3)文件组织模块:从逻辑块--
  • 1、简介 HBase是一个分布式、面向列开源数据库。基于HadoopHDFS存储。不同于一般关系数据库,它...HBase建立在Hadoop文件系统之上,利用了Hadoop文件系统容错能力; HBase提供随机实时读写访问能力; ...
  • c语言的文件处理

    2012-01-20 00:38:58
     文件的基本概念  文件的基本函数  文件的顺序读写  文件随机读写  文件简单应用  §13.1 C文件概述  文件的定义:所谓文件一般指存储在外部介质(如磁盘磁带)上数据的集合。  操作系统是以...
  • 其中字节流主要指以字节为单位进行数据读写的流,可以读写任意类型的文件。 其中字符流主要指以字符(2个字节)为单位进行数据读写的流,只能读写文本文件。 按照读写数据的方向不同,分为 输入流 和 输出流(站在...
  • 文章目录碎碎念一、随机存储文件流(RandomAccessFile)1.概念2.构造器3.读写4.覆盖5.插入6.应用7.小结二、NIO.2中Path、Paths、Files类使用(了解)1.NIO 概述2.NIO. 23.Path 、Paths 和Files 核心API4.Path接口5....
  • C++程序设计【八】之 文件操作

    千次阅读 多人点赞 2021-03-01 11:22:10
    文章目录第八章:文件操作一、文件基本概念文件流类1.文件的概念2.C++文件流类二、打开和关闭文件1.打开文件2.关闭文件三、文件读写操作1.读写文本文件2.读写二进制文件3.用成员函数put() 和 get()读写文件4.文本...
  • 文件随机读写四.文件检测函数五.C库文件六.总结 一.文件 1.文件的基本概念   所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。 实际上在前面的各章中我们已经多次使用了文件...
  • C流式文件操作

    千次阅读 2014-05-13 10:07:47
    文件的基本概念  所谓"文件"是指一组相关数据的有序集合。文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来。从不同的角度可对文件作不同的分类。   从用户的角度看,分为普通文件
  •   块设备是I/O设备中的一类,当应用层对该设备读写时,是按扇区大小来读写数据的,若读写的数据小于扇区的大小,就会需要缓存区, 可以随机读写设备的任意位置处的数据,例如 普通文件(.txt,.c等),硬盘,U盘,SD...
  • Java面向对象程序设计输入/输出流与文件处理深圳职业技术学院软件技术专业 内容提要 1 输入输出流基本概念 2 输入输出节点流 3 输入输出过滤流 4 文件的随机读写 ......Java类库中,将信息写入内存类是 A.java.io....
  • Java(11)文件操作

    2021-02-01 20:36:18
    基本概念 1.1.数据持久化 只存储类属性 存储对象-对象序列化 1.2.文件的数据结构 1.框架 2.文件组织 记录-record 域-field 字节-byte 位-bit 1.3.缓冲 临时存放位置 1.4.流 1.概念 数据序列 2.流...
  • 文章目录文件概念什么是文件文件的分类一个简单的文件读写基本步骤代码演练常用函数单个字符IO流在这里插入图片描述格式化IO流行指针IO流二进制IO流随机存取函数在这里插入图片描述错误IO流 思维导图: 文件概念 ...
  • linux 文件系统

    2021-03-08 16:20:50
    基本概念准备 块设备与字符设备  块设备与字符设备都属于物理外设 块设备是随机对数据片段进行读写的 字符设备是以顺序对数据片段进行读写的  磁盘、CD-ROM盘、闪存就属于块设备。键盘、串口属于字符设备。 ...
  • 涵盖文件的基本概念、二制文件和字节流、文本文件和字符流、文件和目录操作,以及文件处理的一些高级技术,包括常见文件类型的处理、随机读写文件、内存映射文件、标准序列化机制,以及Jackson序列化。 第五部分...
  • java输入输出系统.pptx

    2020-02-25 02:39:58
    过滤流 94文件随机访问 File类 案例分析:多种流的实现System.in和System.out对象 105本章目录教学目标掌握流的基本概念掌握Java中各种常用输入/输出流的基本用法能够熟练地编写应用程序解决文件读写问题教学重点...
  • 第十三周学习总结

    2019-05-30 22:30:23
    这周我们学习了文件复制,利用字节流完成文件读写操作,以文件字符流来实现文件读写操作,还有随机存取文件的读写操作,还有许多基本概念:数据从程序到文件,叫做输出,引入流概念,那就叫输出流,这个流是以字节...
  • 8.1I/O概述 8.2文件 8.3字节流和字符流处理 8.4标准流 8.5其它常用的流 8.6小结 8.1 I/O概述 8.1.1流的概念 8.1.2Java中的输入/输出流 8.2文件 8.2.1File类 8.2.2文件输入输出流 8.2.3读写文件的基本数据类型 ...
  • HDFS 分布式存储基石

    2019-03-01 11:23:23
    基本概念 基于JAVA实现一个分布式文件系统 基于unix/linux 是Hadoop最重要核心组件 支持顺序写入,而非随机定位读写 HDFS前提和设计目标 存储超大文件 HDFS 适合存储大文件,单个文件大小通常在...
  • ​ HBASE (HDFS区别,它可以提供数据的随机读写和实时访问,实现对表数据读写功能) ​ zookeeper (监控,维护) 3.优势 ​ 1.高扩展 ​ 2.低成本 ​ 3.成熟生态圈 4.HDFS 4.1基本概念 ​ 块(Block):HDF

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 130
精华内容 52
关键字:

文件随机读写的基本概念