文件与数据流
- 格式:doc
- 大小:36.00 KB
- 文档页数:5
数据流程图(DFD)数据流程图——描述数据流动、存储、处理的逻辑关系,也称为逻辑数据流程图,一般用DFD (Data Flow Diagram)表示。
一、数据流程图的基本成分数据流程图用到四个基本符号,即:外部实体、数据处理、数据流和数据存储。
现分别介绍如下:1、外部实体外部实体——指系统以外又与系统有联系的人或事物。
它表达该系统数据的外部来源和去处,例如:顾客、职工、供货单位等等。
外部实体也可以是另外一个信息系统。
一般用一个正方形,并在其左上角外边另加一个直角来表示外部实体,在正方形内写上这个外部实体的名称。
为了区分不同的外部实体,可以在正方形的左上角用一个字符表示。
在数据流程图中,为了减少线条的交叉,同一个外部实体可在一张数据流程图中出现多次,这时在该外部实体符号的右下角画小斜线,表示重复。
若重复的外部实体有多个,则相同的外部实体画数目相同的小斜线。
外部实体的表示如图6.1所示。
图6.1外部实体2.数据处理处理指对数据的逻辑处理,也就是数据的变换。
在数据流程图中,用带圆角的长方形表示处理,长方形分为三个部分,如图6.2所示。
图6.2 处理标识部分用来标别一个功能,一般用字符串表示,如P1、P1.1等等。
功能描述部分是必不可少的,它直接表达这个处理的逻辑功能。
一般用一个动词加一个作动词宾语的名词表示。
功能执行部分表示这个功能由谁来完成,可以是一个人,也可以是一个部门,也可以是某个计算机程序。
3.数据流数据流是指处理功能的输人或输出,用一个水平箭头或垂直箭头表示。
箭头指出数据的流动方向。
数据流可以是信件、票据,也可以是电话等。
一般说来,对每个数据流要加以简单的描述,使用户和系统设计员能够理解一个数据流的含义。
对数据流的描述写在箭头的上方,一些含义十分明确的数据流,也可以不加说明,如图6.3所示。
图6.3数据流4.数据存储数据存储表示数据保存的地方。
这里"地方"并不是指保存数据的物理地点或物理介质,而是指数据存储的逻辑描述。
产品文档中的数据流图制作数据流图(Data Flow Diagram,简称DFD)是一种用于描述系统中数据流动的图形化工具,可用于产品文档中。
数据流图制作是产品文档编写中的一项重要任务,它将系统中的各个功能模块以及数据的流动关系进行可视化展示,有助于开发人员和用户更好地理解系统的运作方式。
本文将从数据流图的定义与作用、数据流图的符号与要素、数据流图的制作过程等方面进行论述。
一、数据流图的定义与作用数据流图是一种图形化的工具,用于描述系统内各个功能模块之间数据的流动关系。
它将系统中的数据流、处理功能和数据存储之间的关系进行了抽象和表示,可以帮助开发人员理清系统的逻辑和数据流动方式,便于系统设计和编写产品文档。
数据流图的作用主要体现在以下几个方面:1. 了解系统的功能和数据流动方式:通过数据流图,开发人员和用户可以直观地了解系统的各个功能模块及其数据之间的流动关系,从而更好地理解系统的运作方式。
2. 发现和解决问题:数据流图可以帮助开发人员发现系统中可能存在的问题和瓶颈,并及时采取措施进行优化和改进,提高系统的性能和稳定性。
3. 沟通与协作:数据流图作为一种图形化的工具,可以方便地与开发人员、用户以及其他相关方进行沟通和协作,促进各方对系统的共同理解和认同。
二、数据流图的符号与要素制作数据流图需要使用一些标准符号和要素,以便清晰地表示系统内各个功能模块之间的数据流动关系。
常用的数据流图符号包括以下几类:1. 实体:代表系统内的外部实体,如用户、外部系统等。
通常使用长方形表示。
2. 进程:代表系统内的功能模块,如数据处理、计算等。
通常使用圆形表示。
3. 数据流:代表系统内的数据流动关系,描述数据从一个实体/进程流向另一个实体/进程的过程。
通常使用箭头线表示。
4. 数据存储:代表系统内的数据存储介质,如数据库、文件等。
通常使用长方体表示。
要制作数据流图,需要确定系统内的实体、进程、数据流和数据存储,并使用适当的符号进行标记。
文件流(File Stream)是计算机编程中用于处理文件的一种抽象概念。
它是一种将文件内容视为连续数据流的方式,允许程序以顺序或随机访问的方式读取或写入文件。
文件流通常被用于读取和写入文件,包括文本文件、二进制文件等。
在许多编程语言中,文件流通常由相应的文件流类(File Stream Class)来表示和操作。
通过文件流类,程序可以打开文件、读取文件内容、写入数据到文件、移动文件指针等操作。
常见的文件流类包括输入流(Input Stream)用于读取文件内容,输出流(Output Stream)用于向文件写入数据等。
文件流的概念使得程序能够以流的方式对文件进行操作,这种连续的方式更符合文件数据在磁盘上存储的实际情况,同时也提供了灵活性和效率。
通过文件流,程序可以按照需要从文件中读取数据,并且可以动态地向文件中写入数据,实现了对文件的灵活管理。
总的来说,文件流是一种对文件进行读写操作的抽象概念,它提供了一种便捷而灵活的方式来处理文件数据,是编程中常用的重要概念之一。
linuxshell之终端读写⽂件数据流和重定向,,《,》终端实现⽂件中数据流的读写;重定向命令列表如下:命令说明command > file将输出重定向到 file。
将终端数据写到⽂件file中command < file将输⼊重定向到 file。
将⽂件command >> file将输出以追加的⽅式重定向到 file。
n > file将⽂件描述符为 n 的⽂件重定向到 file。
n >> file将⽂件描述符为 n 的⽂件以追加的⽅式重定向到 file。
n >& m将输出⽂件 m 和 n 合并。
n <& m将输⼊⽂件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输⼊。
需要注意的是⽂件描述符 0 通常是标准输⼊(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
这⾥可以⽤于⽇志打印到⽂件;输出重定向重定向⼀般通过在命令间插⼊特定的符号来实现。
特别的,这些符号的语法如下所⽰:command1 > file1上⾯这个命令执⾏command1然后将输出的内容存⼊file1。
注意任何file1内的已经存在的内容将被新内容替代。
如果要将新内容添加在⽂件末尾,请使⽤>>操作符。
实例执⾏下⾯的 who 命令,它将命令的完整的输出重定向在⽤户⽂件中(users):$ who > users执⾏后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的⽂件。
你可以使⽤ cat 命令查看⽂件内容:$ cat users_mbsetupuser console Oct 31 17:35tianqixin console Oct 31 17:35tianqixin ttys000 Dec 1 11:33输出重定向会覆盖⽂件内容,请看下⾯的例⼦:$ echo "菜鸟教程:" > users$ cat users菜鸟教程:$如果不希望⽂件内容被覆盖,可以使⽤ >> 追加到⽂件末尾,例如:$ echo "菜鸟教程:" >> users$ cat users菜鸟教程:菜鸟教程:$输⼊重定向和输出重定向⼀样,Unix 命令也可以从⽂件获取输⼊,语法为:command1 < file1这样,本来需要从键盘获取输⼊的命令会转移到⽂件读取内容。
3.1 ADVISOR的文件结构3.1.1ADVISOR文件系统的数据流如上图所示。
图中有四种主要的代表类型:z输入脚本文件定义工作空间的变量或者调用其它输入脚本文件,如MC_PM32.M;z模块图表有一些Simulink文件组成。
这些文件含有许多根据输入(如发动机特性图)计算输出(如燃油经济性)的方程;它们都是一些模型,如BD_PAR.M.;z输出脚本文件通过搜索工作空间对模型输出作一些后续处理,包括一些画图程序和一些错误检查程序,如chkoutputs.m。
z控制脚本文件既生成输入,也对输出作一些处理。
例如ADVISOR图形用户界面(GUI)和优化程序。
3.1.2 文件位置ADVISOR根目录下(如 c:\ADVISOR 或 c:\Program Files\ADVISOR)有一些子目录;这些子目录下是含有相应文件的数据、图形用户界面和模型子目录。
3.1.3 文件命名规则模型和数据文件的命名都采用一个前缀加一下划线(’_’)且使用的前缀几乎和定义的变量使用的前缀是一样的。
而在模块图里这一前缀放在尖括号(<>)内。
以下是ADVISOR部件文件类型:变量名称前缀代表的文件类型ACC_*.M附件负载文件CYC_*.M驱动循环文件。
定义变量时以cyc_开头;在模块图里则以<cyc>作为标示;ESS_*.M能量存储系统数据文件。
同样在定义变量时以ess_开头;在模块图里则以<ess>作为标示;EX_*.M排放后处理文件(如催化剂等);FC_*.M燃料转换器数据文件;TX_*.M传动系数据文件,包括变速箱(gb)和主减速器(fd);GC_*.M发电机/控制器数据文件;MC_*.M电机/控制器数据文件;PTC_*.M 传动系控制数据文件。
在定义发动机控制、离合器控制和混合控制策略变量时以vc_和cs_开头;而在模块图中则分别以<vc>和<cs>标示;TC_*.M 扭矩合成装置数据文件;VEH_*.M 整车数据文件;WH_*.M车轮/车轴数据文件;除了上述部件数据文件外,还有另一种类型文件也用前缀定义:BD_*.M-----代表Simulink模块图(模型);所有带前缀文件名用大写字母,而变量名则全部采用小写字母,以免相互混淆。
第七章:输入和输出流第一节:数据流的基本概念1.在java中,把不同类型的输入、输出源抽象为流,其中输入或输出的数据成为数据流,用统一的接口表示。
2.数据流是指一组有顺序的、有起点和终点的字节集合。
程序从键盘接收数据或向文件中写数据,都可以使用数据流来完成。
3.流分为输入数据流和输出数据流。
输入数据流只能读不能写;而输出数据流只能写不能读。
从数据流中读取数据是,必须有一个数据源与该数据流相连(FileInput Stream in = new FileInputStream(“javatest.txt”);)(实例化)4.Java.io包中提供了表示数据流的4个基本抽象类(不可以实例化),分别是InputStream、OutputStream、Reader和Writer。
因此涉及数据流操作的程序中,几乎都要使用引入语句:import java.io.*5.为了使对象的状态能够方便地永久保存下来,java.io包中又提供了以字节流为基础的用于对象的永久化保存状态的机制,通过实现ObjectInput和Object Output接口来完成。
6.输入数据流提供的主要操作方法有:(得到-1,标志数据流结束)int read():从输入流读取一个字节的二进制数据int read( byte [ ] b):将多个字节读到数组中,填满整个数组int read( byte [ ] b ,int off , int len): 从输入流中读取长度为len的数据,从数组b中下标为off的位置开始放置读入的数据,读毕返回读取的字节数。
7.void close(): 关闭数据流int available(): 返回目前可以从数据流中读取的字节数long skip(long l): 跳过数据流中指定数量的字节不读取,返回值表示实际跳过的字节数8.如需要反向读取数据流,则使用回推操作(Push Back)Boolean markSupported(): 用于测试数据流是否支持回推操作void mark(int): 用于标记数据流的当前位置,并划出一个缓冲区,其大小至少为指定参数的大小。
wim格式文件结构
WIM(Windows Imaging Format)是一种用于存储Windows操作系统镜像的文件格式。
它提供了一种有效的方式来捕获、存储和部署Windows操作系统镜像。
WIM文件结构包括以下几个主要部分:
1. 文件头部(Header),WIM文件的头部包含了元数据信息,如版本号、创建时间、压缩算法等。
这些信息对于正确解析WIM文件非常重要。
2. 图像部分(Image Part),WIM文件可以包含一个或多个图像部分,每个图像部分对应一个完整的Windows操作系统镜像。
每个图像部分都包含了操作系统的文件和目录结构以及相关的元数据信息。
3. 文件数据流(File Data Stream),WIM文件中存储的实际文件数据以数据流的形式存在。
这些数据流可以使用不同的压缩算法进行压缩,以节省存储空间。
4. 元数据(Metadata),WIM文件中的元数据包含了有关存储在其中的图像的信息,如文件和目录的属性、权限、时间戳等。
这
些元数据信息对于还原镜像时的正确性非常重要。
5. 压缩算法(Compression Algorithm),WIM文件支持多种压缩算法,包括LZX、XPRESS和LZMS等。
这些算法可以根据需要对文件数据进行压缩,以减小存储空间占用。
总的来说,WIM文件结构是一个复杂的组合体,它包含了各种元数据信息、文件数据流以及压缩算法,这些都是为了有效地存储和管理Windows操作系统镜像而设计的。
理解WIM文件结构对于理解Windows操作系统的部署和管理过程非常重要。
将TI DSP的.out文件转换成数据流形式的二进制bin文件的方法
最近在做的串口升级程序,需要将.out文件转换成二进制文件烧写到flash中脱机使用。
转化方法分为两步:
(1)先将.out文件转换为hex文件:
这里的方法提供参考:
a.先写一个cmd配置文件,以SCI—A启动模式为例,文件名xxx.cmd 内容如下:
1.<span style="font-size: 14px; line-height:
1.5;"> xxx.out</span>
2. -boot
3. -sci8
4. -map xxx_hex.map
5. -o xxx.hex
6. -I
b.接下来有两种选择可生成hex文件:
第一种:编写一个批处理文件,文件名为xxx.bat,内容如下:
hex2000.exe xxx.cmd
将xxx.out文件和xxx.cmd及xxx.bat文件放在同个文件夹中,双击批处理文件xxx.bat就可生成所要的xxx.hex文件.
第二种:通过命令提示符,在上述文件的存放路径下,输入命令:hex2000.exe xxx.cmd,单击回车键,就可生成所要的xxx.hex文件.
(2)通过hex2bin文件转换器可得到需要的二进制xxx.bin文件
变频伺服步进工控产品研发生产技术方案提供商
深圳市伊瑞软件技术有限公司
Shenzhen Erik Software Technology Co., Ltd
扣扣:二五一二二六二四七一。
谈谈NTFS数据流⽂件这个NTFS数据流⽂件,也叫Alternate data streams,简称ADS,是NTFS⽂件系统的⼀个特性之⼀,允许单独的数据流⽂件存在,同时也允许⼀个⽂件附着多个数据流,即除了主⽂件流之外还允许许多⾮主⽂件流寄⽣在主⽂件流之中,它使⽤资源派⽣的⽅式来维持与⽂件相关信息,并且这些寄⽣的数据流⽂件我们使⽤资源管理器是看不到的。
2、为什么NTFS有数据流这个特性?原意是为了和Macintosh的HFS⽂件系统兼容⽽设计的,使⽤这种技术可以在⼀个⽂件资源⾥写⼊相关数据(并不是写⼊⽂件中),⽽且写进去的数据可以使⽤很简单的⽅法把它提取出来作为⼀个独⽴⽂件读取,甚⾄执⾏。
3、为什么资源管理器⾥⾯看不到⽂件所带的数据流⽂件呢?从⽹上找来的原因是:我们之所以⽆法在系统中看到NTFS数据流⽂件,是因为Windows中的很多⼯具对数据流⽂件的⽀持并不是很好,就像“资源管理器”,我们⽆法在“资源管理器”中看到有关数据流⽂件的变化。
不过这个原因很奇怪,同样是MS⾃⼰做的东西,"资源管理器都⽀持不好,还有啥⼯具能⽀持好呢?" ,后来再想,也可能是这样⼀个原因:在当时写有关NTFS⽂件系统的数据流存储的时候很多WINDOWS⼯具没有相应的更新,同时呢NTFS流的显⽰与普通的⽂件不⼀样,需要使⽤其他的枚举⽅式来完成,再有NTFS对⼴⼤普通⽤户桌⾯⽤户来说没有必要去看到,更多的是被专业软件所使⽤,即使显⽰出来也没意义。
4、如何查看,创建,删除NTFS流⽂件?NTFS流⽂件分两种情况,⼀种是附着于宿主⽂件,⼀种是单独的数据流⽂件。
这⾥将介绍两种编辑流⽂件的⽅法,⼀是系统⾃带的命令,⼀是使⽤⼯具。
1) 系统命令编辑流⽂件实例:a) 创建单独的数据流⽂件命令⾏下使⽤下⾯的命令:echo "this is a stream file" > :test1.txtOK,这样创建了的流对于dir或者资源浏览器是完全不可见的,就是说是隐藏的,只有使⽤notepad :test1.txt可以查看。
python的数据流写法Python中的数据流写法有多种方式,可以根据具体的需求和场景选择不同的方法。
下面我将从几个角度来介绍常见的数据流写法。
1. 文件读写:在Python中,可以使用内置的open函数来打开文件并进行读写操作。
通过指定文件路径、打开模式和编码方式,可以实现不同的数据流操作。
例如,使用"r"模式读取文件,使用"w"模式写入文件,使用"a"模式追加内容到文件末尾等。
2. 标准输入输出:Python提供了sys模块中的stdin和stdout对象,可以实现标准输入和标准输出的数据流操作。
可以使用sys.stdin来读取用户输入的数据,使用sys.stdout来输出结果。
这种方式适用于需要与用户进行交互或者通过管道传输数据的场景。
3. 网络数据流:在Python中,可以使用socket模块来进行网络数据流的读写操作。
可以通过创建套接字、建立连接、发送和接收数据等方式来实现网络数据流的传输。
这种方式适用于需要进行网络通信的场景,如客户端和服务器之间的数据交互。
4. 数据库操作:Python中有多个数据库接口模块,如MySQLdb、psycopg2、sqlite3等,可以用于连接和操作不同类型的数据库。
通过执行SQL语句,可以实现数据库的数据流写入和读取操作。
这种方式适用于需要与数据库进行数据交互的场景。
5. 数据流处理框架:对于大规模数据流处理,Python提供了一些流行的框架,如Apache Kafka、Apache Storm、Apache Flink等。
这些框架可以帮助我们处理高速数据流,并提供了相应的API和工具来进行数据流的读写和处理。
总结起来,Python的数据流写法包括文件读写、标准输入输出、网络数据流、数据库操作和数据流处理框架等多种方式。
根据具体的需求和场景,选择合适的写法可以更好地实现数据的读取和写入操作。
文件操作中的对象流和数据流使用方法一、对象流对象流 (Object InputStream) 是一种输入流,它允许我们读取二进制数据。
Java 中的文件输入流 (FileInputStream) 实际上是一个对象流,我们可以通过调用它的 read 方法来读取文件的数据。
下面是一个简单的使用对象流读取文件的示例代码:```FileInputStream fis = new FileInputStream("file.txt"); ObjectInputStream in = new ObjectInputStream(fis);try {// 读取文件数据String content = (String) in.readObject();System.out.println("文件内容:" + content);} catch (IOException e) {e.printStackTrace();} finally {// 关闭输入流in.close();fis.close();}```在上面的示例代码中,我们首先创建了一个文件输入流(FileInputStream),然后创建了一个对象输入流(ObjectInputStream),并将其连接到文件输入流上。
接下来,我们通过调用 readObject 方法来读取文件的数据,并将其转换为字符串对象。
最后,我们打印了文件的内容,并关闭了输入流。
使用对象流有一个好处是它可以读取二进制数据,而不仅仅是文本数据。
另外,对象流还可以处理各种类型的数据,例如对象、数组等。
但是,对象流也有一些缺点,例如它需要花费更多的时间来读取数据,并且不容易进行错误处理。
二、数据流数据流 (DataInputStream) 是一种输入流,它允许我们读取文本数据。
Java 中的文件输入流实际上是一个数据流,我们可以通过调用它的 read 方法来读取文件的数据。
.NET实现http Post文件数据流上传将文件以数据流方式向某指定接口网址上传,整合网络代码实现前后端代码,为解决https网站向http网址传递文件的可能性试验1.引入前端脚本库<script src="jquery.min.js"type="text/javascript"></script><script src="jquery.form.js"type="text/javascript"></script>2.HTML前端上传代码Index.aspx<form enctype="multipart/form-data"><div><input type="file"name="file"/></div></form><script type="text/javascript">$('form input:file').change(function () {$('form').ajaxSubmit({type: 'post',url: 'Upload.ashx?act=upload',success: function (data) {console.log(data);}});});</script>3.后台服务端代码Upload.ashxusing System;using System.Web;using System.IO;using System.Text;using System.Collections.Generic;using ;public class Upload : IHttpHandler {public void ProcessRequest (HttpContext context) {string act = context.Request.QueryString["act"] != null ? context.Request.QueryString["act"].ToString() : "";if (act == "upload"){Dictionary<string, string> postdata = newDictionary<string, string>();postdata.Add("a", "1");postdata.Add("b", "111111");string result =HttpUploadFile("http://localhost:9005/Upload.ashx?act=save", context.Request.Files[0].InputStream, context.Request.Files[0].FileName, "", postdata);context.Response.Write(result);}else if (act == "save"){foreach (string a in context.Request.Params.Keys){//context.Response.Write(a + "=====" +context.Request.Form[a] + "<br/>");}//context.Response.Write(context.Request.Headers["b"]);HttpFileCollection files = context.Request.Files;if (files.Count > 0){string root = context.Server.MapPath("/");HttpPostedFile file = files[0];file.SaveAs(root + DateTime.Now.Ticks.ToString() + "." + file.FileName.Split('.')[1]);context.Response.Write("success");}else{context.Response.Write("nofile");}}context.Response.End();}public static string HttpUploadFile(string url, Stream postedStream, string fileName, string cType, Dictionary<string, string> formDataDic) {if (string.IsNullOrEmpty(url)) return"errorurl";String sReturnString = "";string strBoundary = "----" +DateTime.Now.Ticks.ToString("x");byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");StringBuilder sb = new StringBuilder();sb.Append("--");sb.Append(strBoundary);sb.Append("\r\n");sb.Append("Content-Disposition: form-data; name=\"");sb.Append("file");sb.Append("\"; filename=\"");sb.Append(fileName);sb.Append("\"");sb.Append("\r\n");sb.Append("Content-Type: ");sb.Append(cType);sb.Append("\r\n");sb.Append("\r\n");string strPostHeader = sb.ToString();byte[] postHeaderBytes =Encoding.UTF8.GetBytes(strPostHeader);HttpWebRequest webRequest =(HttpWebRequest)WebRequest.Create(url);webRequest.Method = WebRequestMethods.Http.Post;WebProxy proxy = new WebProxy();eDefaultCredentials = true;webRequest.Proxy = proxy;webRequest.ContentType = "multipart/form-data;boundary=" + strBoundary; ;webRequest.ContentLength = postedStream.Length + postHeaderBytes.Length + boundaryBytes.Length;webRequest.Timeout = 300000;if (formDataDic != null){foreach (string key in formDataDic.Keys){webRequest.Headers.Add(key, formDataDic[key]);}}byte[] fileByte = new byte[postedStream.Length];postedStream.Read(fileByte, 0, fileByte.Length);using (Stream requestStream =webRequest.GetRequestStream()){requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);requestStream.Write(fileByte, 0, fileByte.Length);requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);requestStream.Close();}try{WebResponse resp = webRequest.GetResponse();Stream s = resp.GetResponseStream();StreamReader sr = new StreamReader(s);sReturnString = sr.ReadLine();resp.Close();sr.Close();sr.Dispose();s.Close();s.Dispose();}catch{}return sReturnString;}public bool IsReusable {get {return false;}}}。
file data stream has unexpected number of bytes最近,很多人在使用计算机处理文件时,遇到了一个奇怪的问题——“文件数据流具有意外的字节数”。
这个错误提示似乎是由于文件的大小与其实际内容不匹配所导致的,但具体原因还需要进一步研究。
首先,我们需要了解文件数据流的概念。
文件数据流是指在计算机中读取和写入文件时所使用的数据通道。
数据流可以分为两种类型:字节流和字符流,前者是以字节为单位读取和写入数据,后者是以字符为单位读取和写入数据。
在处理文件时,我们需要根据文件类型来选择合适的数据流类型。
接着,我们需要分析一下可能导致“文件数据流具有意外的字节数”的原因。
首先,这个问题可能与文件的编码格式有关。
不同的编码格式会用不同的方式将文本数据转换为二进制数据,如果我们选择了不正确的编码格式,就会导致数据流中的字节数与文件实际大小不匹配。
另外,这个问题也可能与文件的传输过程有关。
在传输文件时,网络或存储设备可能会对文件进行压缩或加密。
如果我们在读取文件时没有正确解压或解密文件,就可能导致数据流中的字节数与文件实际大小不匹配。
最后,我们需要解决这个问题。
首先,我们可以检查文件的编码格式是否正确,并尝试使用不同的编码格式来读取文件。
如果这个方法无效,我们可以考虑使用专业的数据恢复工具来解决这个问题。
这些工具可以帮助我们恢复损坏的文件数据,并将其转换为正确的数据流格式。
总之,“文件数据流具有意外的字节数”是一个比较常见的问题,但可以通过仔细分析文件的编码格式和传输过程,以及使用专业的数据恢复工具来解决。
在处理文件时,我们需要保持谨慎,避免发生这样的问题。
第8章文件与数据流
一、文件和流的概念
文件是指在各种驱动器上(硬盘、可移动磁盘等)永久或临时存储的数据的有序集合,是进行数据读/写操作的基本对象。
文件通常具有文件名、路径、访问权限等属性。
流从概念上来说类似于单独的磁盘文件,它也是进行读/写操作的对象。
流提供了连续的字节存储空间,通过流可以向后备的存储器写入数据,也可以从后备存储器读取数据。
与磁盘文件直接相关的流称为“文件流”。
除此之外,还有网络流、内存流等其他类型的流。
流用于传输数据时,有两个传输方向:
读:将数据从外部数据源传输到程序中,这是读取流。
写:将数据从程序传输到外部数据源,这是写入流。
二、相关知识
1.流的创建
FileStream fs = new FileStream( "test1.dat",
FileMode.Create, FileAccess.Write);
一般格式:
FileStream fs = new FileStream( string path,
FileMode mode, FileAccess access);
参数含义:
path:指定当前FileStream对象将封装的文件的相
对路径或绝对路径。
可以只是文件名(在程
序所在目录下创建或打开文件)
mode:指定如何打开或创建文件,它的值必须是
FileMode枚举中的值。
access:指定如何访问文件,它的值必须是
FileAccess枚举中的值。
2)将数据写入流
fs.write(byte[] array,int offset,int count);
参数含义:
array:要写入文件流的字节数组
offset:array数组中开始写入文件流的字节的下
标。
count:将要写入流的最大字节数
3)从流中读取数据
fs.ReadByte()从流中读取一个字节(返回已转换
为int的字节),并将流内的位置向前推进一个。
如果已经到达流的末尾,则返回-1。
在读之前,用canRead属性确定当前对象是否支持
读取操作。
4)关闭文件流
fs.close();
关闭文件流并释放与当前文件流关联的任何资
源。
所有表示流的类都是从Stream类继承来的。
FileStream类继承自Stream类,主要用于二进制文件
的输入与输出。
StreamWriter(写入器)和StreamReader(读取器)主要用于文本文件的读写操作。
实例2中相关知识:
1、流的文本读写
StreamReader和StreamWriter主要用于以文本方式对流进行读写操作,它们通常成对使用,它们的构造函数有多
种重载形式。
可以通过指定文件名或指定另一个流对象来
创建读写器对象。
对于StreamWriter对象,还可以指定是改
写还是追加文件内容。
2、读写器的创建
本例中我们使用流对象创建写入器对象:
FileStream fs = new FileStream("phoneBook.txt",
FileMode.Append,FileAccess.Write);
StreamWriter fw = new StreamWriter(fs);
创建读取器对象:
FileStream fs = new FileStream("phoneBook.txt",
FileMode.Open,FileAccess.Read);
StreamReader fr = new StreamReader(fs);
3、读写器的读和写操作
写操作:StreamWriter提供了Write()和WriteLine()方法对流
进行写操作。
不同之处是WriteLine()方法会在每个字
符串后面加上换行符。
这两个方法可以接受的参数类
型很丰富,包括char、int、string、float、double
及object等。
如:string inputStr;
inputStr = txtName.Text +"\t"+ txtPhone.Text;
fw.WriteLine(inputStr);
读操作:StreamReader提供了4种方法对流进行读操作。
Read()、ReadLine()、ReadBlock()、ReadToEnd() do
{ lineStr = fr.ReadLine();
outputStr += lineStr + "\r\n";
}while (lineStr != null);
4、读写器的关闭
fw.Close(); fs.Close();
fr.Close(); fs.Close();
提示:如果同一个文件同时创建了StreamReader和StreamWriter 对象,那么应该先关闭StreamWriter对象,再关闭StreamReader对象。
C#的两种程序形式:控制台应用程序
窗体应用程序
数据类型:整型
实型 float double decimal
float x=1.35f;
字符型 char …a‟…A‟…\n‟…\t‟
字符串 string “hello\n”
自定义类型:结构体枚举数组
运算符及表达式
三种基本结构:顺序循环(while , do…while,for,foreach)选择(if,switch)
break continue
函数异常处理。