把握VB.NET中的流(Stream) (二)

原创 2002年09月12日 09:20:00

把握VB.NET中的流(Stream) (二)

灵活多样的IO操作<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

有时候,在数据和字节数组之间转换是一件繁琐的事情。为了避免这些无聊的转换和简化代码,采用StreamReader/StreamWriteBinaryReader/BinaryWriter不愧为明智之举。StreamReader/StreamWrite分别由TextReader/TextWriter类派生,自动执行字节编码的转换。BinaryReader/BinaryWriterStream派生,主要以二进制的形式读写数据。

从二进制文件读数据的时候,首先创建一个BinaryReader的实例,BinaryReader的构建函数接受一个FileStream对象,代表将要读的文件。我们前面已经看过,可以用File.OpenRead 或者 File.OpenWrite 方法创建FileStream对象。

如下所示:

   Dim BR As New IO.BinaryReader(IO.File.OpenRead(path))

   Dim BW As New IO.BinaryWriter(IO.File.OpenWrite(path))

            BinaryWriter类有WriteWriteLine两种方法,都可以接受任何类型的数据作为参数写入文件(WriteLine在文件尾追加一行数据)。BinaryReader类有很多读数据的方法,数据存储在文件上的时候,并没有任何关于自己类型的信息,所以读数据的时候,必须选择合适的重载Read方法。

            下面的例子假设BW是一个已经初始化过的BinaryWriter对象,表示如何写一个字符串、整数、双精度数字到文件:

   BW.WriteLine("A String")

   BW.WriteLine(12345)

   BW.WriteLine(123.456789999999)

         读回数据的时候,必须选择BinaryReader合适的Read方法:

   Dim s As String = BR.ReadString()

   Dim i As Int32 = BR.ReadInt32()

   Dim dbl As Double = BR.ReadDouble()

对于文本文件,采用StreamReader/StreamWriter对象。方法跟上面差不多,写数据同样用WriteWriteLine方法。Read方法读一个字符,ReadLine读一行数据(直到有回车/换行符为止),ReadToEnd读所有的字符,到文件结束。

对象序列化

到目前为止,我们只是把简单类型的数据写到文件中并读回程序。而实际上,大多数的程序读写的数据可能并不是简单类型,而是复杂的结构,例如:数组,数组列表,哈希表等。于是,我们采取一种成为序列化的技术,首先把数组的值转化为字节序列,然后写入文件,这样整个数组就存储下来。相反,我们称之为反序列化。

序列化是.NET的一个很大的话题,这列介绍一下基本的信息。

BinaryFormatterSerialize Deserialize方法把一个对象保存到文件和读回程序。首先,imports System.RunTime.Serialization.Formatters,免得写那么长的申明。Formatters名空间包含了BinaryFormatter类,用于以二进制的数据序列化对象。

创建BinaryFormatter实例,接着调用Serialize方法Serialize接受两个参数:一个是可写的FileStream实例,用于保存数据的文件;另外一个是对象本身:

   Dim BinFormatter As New Binary.BinaryFormatter()

   Dim R As New Rectangle(10, 20, 100, 200)

   BinFormatter.Serialize(FS, R)

         BinaryFormatterDeserialize方法只有一个参数,FileStream实例。在当前位置,反序列化得到一个类型不明的对象,我们必须用Ctype转换为原来的对象。下面的例子反序列化上面的文件得到原来的Rectangle对象:

   Dim R As New Rectangle()

   R = CType(BinFormatter.Deserialize(FS), Rectangle)

我们也可以以XmlFormatter进行对象序列化。首先在IDEProject菜单选择添加System.Runtime.Serialization.Formatters.Soap,然后就可以进行创建SoapFormatter对象了,方法跟BinFormatter一样,只不过数据的存储采用XML格式:

   Dim FS As New IO.FileStream("c:/Rect.xml", IO.FileMode.Create, IO.FileAccess.Write)

   Dim XMLFormatter As New SoapFormatter()

   Dim R As New Rectangle(8, 8, 299, 499)

   XMLFormatter.Serialize(FS, R)

打开c:/Rect.xml ,实际上里面存储了这些内容:

 

- <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

- <SOAP-ENV:Body>

- <a1:Rectangle id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/System.Drawing/System.Drawing%2C%20Version%3D1.0.3300.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Db03f5f7f11d50a3a">

  <x>8</x>

  <y>8</y>

  <width>249</width>

  <height>499</height>

  </a1:Rectangle>

  </SOAP-ENV:Body>

  </SOAP-ENV:Envelope>



 

 

Java中的stream流的概念解析

Java中的stream流的概念解析
  • zx48822821
  • zx48822821
  • 2017年04月06日 15:25
  • 811

Stream(流)的学习笔记

http://www.cnblogs.com/KevinSong/p/3794236.html  最近学习使用Node.js创建http proxy server,少不了要跟Stream打交...
  • wyqlxy
  • wyqlxy
  • 2014年06月18日 13:14
  • 1133

详解Java8特性之Stream API并行流

在详解Java8特性之Stream API中,我用的例子使用的都是顺序流,即单线程执行的,其实Stream API还提供了并行流,即多线程执行操作。java.util.Collection新添加了两个...
  • TimHeath
  • TimHeath
  • 2017年05月07日 19:50
  • 1258

Node.Js Stream(流)-(二)

Stream流之fs模块操作实例一 一、读取文件 实例1:指定每次读取数据量大小 //实例1,读取文件 var fs=require('fs'); var path=require('path'...
  • u011127019
  • u011127019
  • 2016年09月13日 16:36
  • 308

深入理解 Java中的 流 (Stream)

首先,流是什么? 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。 流具有方向性,至于是输入...
  • blueissky
  • blueissky
  • 2015年06月11日 12:02
  • 696

java8 Stream流操作介绍

java8 流操作 使用Stream基本步骤 1. 创建Stream; 2. 转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象(**可以有多次转换**); 3. ...
  • sf_cyl
  • sf_cyl
  • 2016年07月13日 19:14
  • 2675

Java Stream(流)的分类, 四大基本流的介绍

上一篇文章已经介绍过什么是流, 以及流的基本概念 http://blog.csdn.net/nvd11/article/details/29917065 本文主要介绍java...
  • nvd11
  • nvd11
  • 2014年06月23日 22:55
  • 4793

nodejs中流(stream)的理解

nodejs的fs模块并没有提供一个copy的方法,但我们可以很容易的实现一个,比如: var source = fs.readFileSync('/path/to/source', {encodi...
  • z69183787
  • z69183787
  • 2016年05月20日 15:16
  • 1564

python推数据及流处理扩展

python对于“流”的处理好像推荐是采用generator方式,这种方式
  • hyalone2010
  • hyalone2010
  • 2014年11月10日 16:37
  • 1952

Java8中流的性能

原文:Performance With Java8 Streams 作者:Arun Pandey 翻译:雁惊寒 摘要:本文介绍了Java8中流的几个特性,以告诫开发者流并不是高性能的代名词...
  • dev_csdn
  • dev_csdn
  • 2017年11月09日 16:41
  • 14480
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:把握VB.NET中的流(Stream) (二)
举报原因:
原因补充:

(最多只允许输入30个字)