文件操作及序列化

上传人:pu****.1 文档编号:570157464 上传时间:2024-08-02 格式:PPT 页数:32 大小:350.50KB
返回 下载 相关 举报
文件操作及序列化_第1页
第1页 / 共32页
文件操作及序列化_第2页
第2页 / 共32页
文件操作及序列化_第3页
第3页 / 共32页
文件操作及序列化_第4页
第4页 / 共32页
文件操作及序列化_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《文件操作及序列化》由会员分享,可在线阅读,更多相关《文件操作及序列化(32页珍藏版)》请在金锄头文库上搜索。

1、高级软件人才实作培训专家.Net基础加强IO操作及序列化讲师:王绚文高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文WinForml桌面程序lWinForm的控件TextBox、Timer、CheckBox、TreeView、GroupBox、Label、Button、RadioButton、CheckBoxList、RadioButtonList、Form、PictureBox、ComboBox(下拉框)、Panel、。lWinForm程序是事件驱动的l课后练习:制作一个计算器,默认为“请选择”高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文文件操作常用相关类lFil

2、e/操作文件,静态类,对文件整体操作。拷贝、删除、剪切等。lDirectory/操作目录(文件夹),静态类。lDirectoryInfo/文件夹的一个“类”,用来描述一个文件夹对象lFileInfo/文件类,用来描述一个文件对象lPath/对文件或目录的路径进行操作(很方便)【字符串】lStream/文件流,抽象类。FileStream/文件流,MemoryStream(内存流),NetworkStream(网络流)StreamReader/快速读取文本文件StreamWriter/快速写入文本文件高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文Path类(对字符串操作static

3、)l目录和文件操作的命名控件System.IOlstringChangeExtension(stringpath,stringextension)(*)修改文件的后缀,“修改”支持字符串层面的,没有真的给文件改名strings=Path.ChangeExtension(C:tempF3.png,jpg)lstringCombine(stringpath1,stringpath2)将两个路径合成一个路径,比用+好,可以方便解决不加斜线的问题,自动处理路径分隔符的问题strings=Path.Combine(c:temp,a.jpg)lstringGetDirectoryName(stringpa

4、th)(*)得到文件的路径名。Path.GetDirectoryName(c:tempa.jpg)lstringGetExtension(stringpath)得到文件的扩展名lstringGetFileName(stringpath)得到文件路径的文件名部分lstringGetFileNameWithoutExtension(stringpath)得到去除扩展名的文件名lstringGetFullPath(stringpath)得到文件的全路径。可以根据相对路径获得绝对路径。lstringGetTempFileName()得到一个唯一的临时文件名(*)lstringGetTempPath()

5、得到临时文件夹的路径(*)高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文操作目录l资料管理器l为了实现目录树,所以要掌握读取目录的类lDirectory和DirectoryInfovoidDelete(stringpath,boolrecursive)删除目录,recursive表示是否递归删除,如果recursive为false则只能删除空目录boolExists(stringpath)判断目录是否存在move()CreateDirectory()stringGetDirectories(stringpath)得到一个目录下的子目录stringGetDirectories(st

6、ringpath,stringsearchPattern,SearchOptionsearchOption)通配符查找目录下的子目录,可以搜索到隐藏文件。staticstringGetFiles(stringpath)得到一个目录下的文件stringGetFiles(stringpath,stringsearchPattern,SearchOptionsearchOption)通配符查找目录下的文件DirectoryInfoGetParent(stringpath)得到目录的父目录高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文知识补充1(*)lPath.Combine(path1

7、,path2),见MSDN如果指定的路径之一是零长度字符串,则该方法返回其他路径。如果path2包含绝对路径,则该方法返回path2。如果path1不是以分隔符结束,并且不是c:或d:等(驱动器引用),则在串联前为path1增加分隔符。分隔符:(与操作系统平台有关)Path.DirectorySeparatorCharPath.PathSeparator;Path.VolumeSeparatorChar:lPath.GetFileName()获取文件名当目录为c:windowstest时,可获取最后一个目录名,但当目录路径为c:windowstest时,不可以。reflector查看高级软件人

8、才实作培训专家广州传智播客Http:/主讲:王绚文知识补充2(*)l获取当前exe文件执行的路径:Assembly.GetExecutingAssembly().Location;l不要用:Directory.GetCurrentDirectory();获取应用程序的当前工作目录。因为这个可能会变,通过使用OpenFileDialog或者手动设置Directory.SetCurrentDirectory()l做WinForm程序时会常用到。l完善昨天的“文件管理器”,双击目录节点时会报错。怎么判断当前双击的是文件节点?Tag是否为null高级软件人才实作培训专家广州传智播客Http:/主讲:王

9、绚文资料管理器l通过treeview显示两级目录l动态添加treeview节点。di.GetDirectories()获取所有的根文件夹TreeNodetn=newTreeNode();tn.Text=d.Name;tn.Tag=d.FullName;treeView1.Nodes.Add(tn);l遍历根文件夹的同时添加二级节点,三级节点上添加文件的名儿l双击文本节点(怎么判断是否是文本节点?)在文本框中显示资料的内容l递归的方式显示无限极节点高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文操作文件l文本文件编码,文本文件有不同的存储方式,将字符串以什么样的形式保存为二进制,这个

10、就是编码,UTF-8、ASCII、Unicode等,如果出现乱码一般就是编码的问题,文本文件相关的函数一般都有一个Encoding类型的参数,取得编码的方式:Encoding.Default、Encoding.UTF8、Encoding.GetEncoding(GBK)l输出Encoding.GetEncodings(),所有编码。l什么是文本文件。拖到记事本中还能看得懂的就是文本文件,doc不是。lFile类的常用静态方法:(FileInfo*)voidAppendAllText(stringpath,stringcontents),将文本contents附加到文件path中(如果文件不存在

11、,则创建)boolExists(stringpath)判断文件path是否存在stringReadAllLines(stringpath)读取文本文件到字符串数组中stringReadAllText(stringpath)读取文本文件到字符串中voidWriteAllText(stringpath,stringcontents)将文本contents保存到文件path中,会覆盖旧内容。WriteAllLines(stringpath,stringcontents),将字符串数组逐行保存到文件path中,会覆盖旧内容。高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文File类的方法1

12、lFile.Copy(“source”,“targetFileName”,true);/文件拷贝,true表示当文件存在时“覆盖”,如果不加true,则文件存在报异常。lFile.Exists();/判断文件是否存在lFile.Move(“source”,“target”);/移动(剪切),思考如何为文件重命名?lFile.Delete(“path”);/删除。如果文件不存在?不存在,不报错lFile.Create(“path”);/创建文件高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文File类的方法2:操作文本文件lFile.ReadAllLines(“path”,Encod

13、ing.Default);/读取所有行,返回stringlFile.ReadAllText(“path”,Encoding.Default);/读取所有文本返回stringlFile.ReadAllBytes(“path”);/读取文件,返回bytel=lFile.WriteAllLines(“path”,newstring4,Encoding.Default);/将string数组按行写入文件。lFile.WriteAllText(“path”,“string”);/将字符串全部写入文件lFile.WriteAllBytes(“path”,newbyte5);/将byte全部写入到文件lFi

14、le.AppendAllText()/将string追加到文件高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文File类的方法3:快速得到文件流lFile.Open();/返回FileStreamlFile.OpenRead();/返回只读的FileStreamlFile.OpenWrite();/返回只写的FileStream高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文l文件流?l两个大水缸,把一个缸中的水倒入另一个水缸中。两种方式:直接把一个缸中的水倒入另一个缸中用个桶来把一个缸中的水舀到另一个缸中。高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文文

15、件流l拷贝文件的两种方式:将源文件内容全部读到内存中,再写到目标文件中;读取源文件的1KB内存,写到目标文件中,再读取源文件的1KB内存,再写到目标文件中。第二种方式就是一种流的操作。l用File.ReadAllText、File.WriteAllText进行文件读写是一次性读、写,如果文件非常大会占内存、慢。需要读一行处理一行的机制,这就是流(Stream)。Stream会只读取要求的位置、长度的内容。lStream不会将所有内容一次性读取到内存中,有一个指针,指针指到哪个字节就从哪个字节开始读、写。l流有很多种类,文件流是其中一种。FileStream类newFileStream(“c:/

16、a.txt”,filemode,fileaccess)后两个参数可选值及含义自己看。FileStream可读可写。可以使用File.OpenRead、File.OpenWrite这两个简化调用方法。lbyte是任何数据的最根本表示形式,任何数据最终都是二进制。lFileStream的Position属性为当前文件指针位置,每写一次就要移动一下Position以备下次写到后面的位置。Write用于向当前位置写入若干字节,Read用户读取若干字节。(*)l使用using可以方便的释放资源(自动调用Dispose方法)l只有实现了IDispose接口的类才能使用using释放资源高级软件人才实作培训

17、专家广州传智播客Http:/主讲:王绚文l使用FileStream写入文本文件。演示通过FileStream写入读取文本文件。对于中文如果每次读取1个byte会有什么效果?更好的选择StreamReaderl使用FileStream读取文本文件。l使用FileStream进行大文件拷贝。演示File.ReadAllBytes()与File.WriteAllBytes()进行文件拷贝。(查看内存使用情况)高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文练习l练习:文件加密(每一位用255-r)。加密就是解密,解密就是加密。(帮助理解文件流而已)lbyte是任何数据的最根本表示形式,任

18、何数据最终都是二进制。l使用using来简化操作。/总结:不是任何类型的对象都可以写在using()的小括号里面的/只有实现了IDisposable接口的类型的对象,才能写在using的小括号里面/当using执行完毕时,会自动调用对象的Dispose()方法来释放资源。l大文件拷贝。lFileStream的Position属性为当前文件指针位置,每写一次就要移动一下Position以备下次写到后面的位置。Write用于向当前位置写入若干字节,Read用户读取若干字节。(*)lUtf-8:前3个字节(*)lUnicode(utf-16):前两个字节。(*)lFileStream的参数介绍。与快

19、速创建文件流。高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文StreamWriter(读取文本文件)lStream把所有内容当成二进制来看待,如果是文本内容,则需要程序员来处理文本和二进制之间的转换。l用StreamWriter可以简化文本类型的Stream的处理lStreamWriter是辅助Stream进行处理的using(StreamWriterwriter=newStreamWriter(stream,encoding)writer.WriteLine(你好);高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文StreamReader和StreamWriter类

20、似,StreamReader简化了文本类型的流的读取。Streamstream=File.OpenRead(c:/1.txt);using(StreamReaderreader=newStreamReader(stream,encoding)/Console.WriteLine(reader.ReadToEnd();Console.WriteLine(reader.ReadLine();ReadToEnd用于从当前位置一直读到最后,内容大的话会占内存;每次调用都往下走,不能无意中调用了两次ReadLine读取一行,如果到了末尾,则返回null。高级软件人才实作培训专家广州传智播客Http:/主

21、讲:王绚文练习l案例:对职工工资文件处理,所有人的工资加倍然后输出到新文件。l文件案例:马大哈|3000宋江|8000l提示:先获得FileStreamFile.OpenRead(path);File.OpenWrite(path);再用FileStream构建一个StreamReader与StreamWriter高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文对象序列化l对象序列化是将对象(比如Person对象)转换为二进制数据,反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化

22、就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。lBinaryFormatter类有两个方法:voidSerialize(Streamstream,objectgraph)对象graph序列化到stream中objectDeserialize(Streamstream)将对象从stream中反序列化,返回值为反序列化得到的对象l练习:将几个int、字符串添加到ArrayList中,然后序列化到文件中,再反序列化回来l不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加Serializable,对象的属性、字段的类型也必须可序列化高级软件人才实作

23、培训专家广州传智播客Http:/主讲:王绚文l/关于二进制序列化需要注意的事项:l1.要序列化的类型必须标记为:Serializablel2.该类型的父类也必须标记为:Serializablel3.该类型中的所有成员的类型也必须标记为:Serializablel4.序列化只会对类中的字段序列化。(只能序列化一些状态信息。)高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文序列化的步骤l1.创建一个二进制序列化器:BinaryFormatterbf=.;l1.5:创建一个文件流。l2.bf.Serialize(stream,对象);高级软件人才实作培训专家广州传智播客Http:/主讲:

24、王绚文反序列化的步骤l1.创建一个二进制序列化器:BinaryFormatterbf;l2.创建文件流:l3.执行反序列化:objectobj=bf.Deserialize(stream);高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文为什么要用多线程l让计算机同时做多件事情,节约时间。l多线程可以让一个程序“同时”处理多个事情。l后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况。Demo1:单线程带来的问题单线程带来的问题高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文.net中如何实现多线程2l产生一个线程的4步骤:编写产生线程所要执行的方法引用S

25、ystem.Threading命名空间实例化Thread类,并传入一个指向线程所要运行方法的委托。(这时候这个线程已经产生,但是还没有运行)调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。Demo2:两个线程同时运行(画图)高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文.net中如何实现多线程1l线程肯定也是要执行一段代码的。所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码。(找个人来做一件事情)l线程启动时,通过委托调用该方法。(委托的好处)(线程启动时,调用传过来的委托,委托就会执行相应

26、的方法,实现线程执行方法)高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文程序 1 程序 2线程 1线程 2线程 3线程 1线程 2线程 3进程与线程l一个进程至少有一个线程l同一个进程中的多个线程之间可以并发执行高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文前台线程和后台线程l前台线程:只有所有的前台线程都关闭才能完成程序关闭。l后台线程:只要所有的前台线程结束,后台线程自动结束。高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文Thread类的一些重要成员(*)lStart()启动线程lAbor

27、t()终止线程lThread.Sleep(100)静态方法,可以使当前线程停止一段时间运行lName线程名lThread.CurrentThread()获得当前的线程引用高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文补充和练习lDemo3:线程中如何访问控件lDemo4:执行带参数的方法高级软件人才实作培训专家广州传智播客Http:/主讲:王绚文线程的调度方式*1.非抢占式调度:指某个线程在运行时不会被操作系统强制暂停,它可以持续地运行直至运行告一段落井主动地交出运行权。在这样的调度模式之下,线程的运行就完全是单队列的,并且可能产生恶意程序长期霸占运行权的情况。而且一旦一个程序死了,那么整个电脑就只好重启啦!2.抢占式调度:指每个线程都只有极少的运行时间(在Windows内核模式下这个时间不会超过20ms),而当时间用完时该线程就会被强制暂停,保存上下文并把CPU运行权利交给下一个线程,这样调度的结果就是所有的线程都在被快速地切换运行,使得使用者感觉所有的线程在并行运行。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号