使用BinaryWriter和BinaryReader

本文介绍了如何利用BinaryWriter和BinaryReader进行二进制数据的读写操作。BinaryWriter通过其Write方法支持多种数据类型的写入,而BinaryReader则通过Read系列方法实现数据读取。此外,文章还提供了一个具体的示例,展示了如何创建并读取一个包含不同类型数据的.dat文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用BinaryWriter和BinaryReader

最后研究的读取器/编写器组是BinaryReader和BinaryWriter,它们都从System.Object直接派生。这些类型可以让我们从基层流中以简洁的二进制格式读取或写入离散数据类型。BinaryWriter类型定义了一个多次重载的Write()方法,用于把数据类型写入基层的流。除了Write()方法,BinaryWriter还提供了另外一些成员让我们能获取或设置从Stream派生的类型,并且提供了随机数据访问的支持(如表16-9所示)。绿豆网 .i h g6P h j K S _

16-9  BinaryWriter核心成员

0` W1| H M G V h0

    

}'P,V q/j ? l"I r Y n0

    绿豆网 (n `%o P%w W r

BaseStream绿豆网 4n.a9~'~ P,v I W

这个只读属性提供了BinaryWriter对象使用的基层流的访问

^ R c9v } q0` T(f%r0

Close()

D k4A/y,L7D0

这个方法关闭二进制流绿豆网 B1O;n Z K b6U ?

Flush()绿豆网 0d1|(A b,z*~ w

这个方法刷新二进制流绿豆网 V.u h$` l @ J2q

Seek()

*q ] x!} ?0

这个方法设置当前流的位置

d,S*l-Y T q&G C8n0

Write()

j!k }4v X0

这个方法将值写入当前流

1{ p m B V8r/~0

BinaryReader类补充了BinaryWriter的功能,表16-10列出了其中的一些成员。

2v O0`(C o y"r,q { m W0

16-10  BinaryReader核心成员绿豆网 M7~/h&x m v8J

    绿豆网 H%b u7X m I Y s3x J

   

+a f I k*` @2Q0

BaseStream

x u#H n*[ B0

这个只读属性提供了BinaryReader对象使用的基层流的访问绿豆网 $[+C8X g W o

Close()

X g k Q b8e*y8e9m x f2O0

这个方法关闭二进制阅读器

['T!w*P(L ?4_ e0

PeekChar()

C(S)N-` u _$m W,m K0

这个方法返回下一个可用的字符,并且不改变指向当前字节或字符的指针位置绿豆网 ` s9f;N-P D9_

Read()绿豆网 D%C.h ?"x T9p-i

读取给定的字节或字符,并把它们存入数组

*r ?*{.Q+u B0

ReadXXX()

L h e g O,|!/0

BinaryReader类定义了许多ReadXXX()方法来从流中获取下一个类型(ReadBoolean()ReadByte()ReadInt32()等)

{ z2f e&n5f y ?&g0

 

4g Q D J V _)a0 下面的示例新建了一个*.dat文件并且写入了一些数据类型:
p)_$s9H7G z i&v0F0绿豆网 V r$H / V1C X
 绿豆网 0U ? Q Y v2Q i f
绿豆网 +y R M S n)w2?.y
static void Main(string[] args)
[ L J ?.l ^%b4j#A0
m T L N+} o0{
y-N E,m6e a h!P O Q0
| U l B v @0    // 为文件打开一个二进制编写器。绿豆网 n T3w!X q o8v J S P

Z x/Q i a A S V0  FileInfo f = new FileInfo("BinFile.dat");
|4i9|%n E ~!K8W0绿豆网 ^/P!F O I/?8m u W C
  BinaryWriter bw = new BinaryWriter(f.OpenWrite());绿豆网 .O g ` F z,X!g;b9p/Z

;e#U M/b+[ ?0 
w M"Z'`*/ ?:J0绿豆网 $O C/W l;N / m+V C
    // 输出类型的BaseStream(在这里是System.IO.FileStream)。
~ t {;E {0? H ^#~0绿豆网 3b*x3_ ] ^ ? U ? J
  Console.WriteLine("Base stream is: {0}", bw.BaseStream);绿豆网 +Q*D D w+u o r N;}

/M ] J0p F)J'F!L*q,G8C0 
^)y'a9e(]7I;F n0绿豆网 $q f b b s-L:T c5H
    // 在文件中存储一些数据。
D Z-X L'`5u+K0绿豆网 S W,p8A0O$k X'z
  double aDouble = 1234.67;绿豆网 x%?,i#Y M

X H U0Z t i |0  int anInt = 34567;
;e H Z(U5l {0
V } f x4y N0  char[] aCharArray = { 'A', 'B', 'C' };绿豆网 '}"e,h c/M ]0j

0o x E w8[0 绿豆网 v2G k(K E p k3b
绿豆网 q Z2^$e m O b l7[*Z l `
    // 写数据。
u-q"R+J W9D y#` j0绿豆网 v4Q&N H8n b4E F
  bw.Write(aDouble);
G H z n I.q&o0绿豆网 7B z K q s b v
  bw.Write(anInt);
/} H;o2B P H B0绿豆网 0v4i q F"P7O _8?
  bw.Write(aCharArray);绿豆网 O9l%e9z u M | @

%` H X w { _0  bw.Close();绿豆网 g x C#i w!Z4x
绿豆网 9e V f o L f%r a
}
v I N i9B!r { N#Z(e0
)X%E D(U$~0 
K3a2J3{(H"Q X }0
q /8t$y O/d0注意,从FileInfo.OpenWrite()返回的FileStream对象被传到BinaryWriter类型的构造函数中。使用这项技术就能很方便地在写入数据前引入一个流。需要理解的是,BinaryWriter构造函数能接受任何派生自Stream类型的参数(比如FileStream、MemoryStream或BufferedStream)。因此,如果希望向内存写二进制信息的话,只需提供一个MemoryStream对象即可。绿豆网 c%G [&I8w"{)q

#m _ U h$e"y0BinaryReader类型提供了很多选项来从BinFile.dat文件读取数据。在这里,我们会使用PeekChar()来检测流中是否仍有可提供的数据,如果有的话,使用ReadByte()来取值。注意,我们用十六进制来格式化这些字节,并且在它们中间插入7个空格:
'y Y S'u!w F;U#A0绿豆网 %r H!p%^$T-v7y
 绿豆网 /m6_ X ~ V b#V
绿豆网 t C/F7d ? ? i j
static void Main(string[] args)绿豆网 6`/L0f ~!r7w D | m g
绿豆网 0k'P E U ~0~ s x
{
Z a5W W9j5j3A%B0
+D t r"? _ X"h p0    // 为文件打开一个二进制编写器。绿豆网 "P ` e q T.F+N t

F9a [ H.S6B*A ] H2Y0  FileInfo f = new FileInfo("BinFile.dat");
5| o b+T-b0绿豆网 F0U&a m J.p ` l
...绿豆网 /u9H i P M'V

F v9|"{&H,T0    // 以原始字节形式读取数据。绿豆网 8k#x d ]8R ^

]2C O0}3r E!B.`0  BinaryReader br = new BinaryReader(f.OpenRead());
5`$S j b(H r F _ x s0绿豆网 R U B%x p w5w
  int temp = 0;
)D W B a9M(b1l!W D0绿豆网 (^'n d A [ N ]2f9w$y#S
  while (br.PeekChar() != -1)
"q ^ D7O6d!i$@ Z o0绿豆网 #z /&a J k5M!b8f i"G D
  {绿豆网 { | O3u c
   Console.Write("{0,7:x} ", br.ReadByte());
:W!A.R u9u P a4k @0绿豆网 y |)?*r8h P5u f
    if (++temp == 4)绿豆网 v X w ? G0/%t,{
绿豆网 $h#@5E v O6G
    {
b5] x s r/V i E0
R Z D r-E-]2{0             // 每4个字节一行。绿豆网 %M b C / {

's R+V h+n e3`3B0      Console.WriteLine();绿豆网 A e3x.O T Y U E:T$G n
绿豆网 2C#R;y)t.O t I p#v |
      temp = 0;绿豆网 { T4f4k H
绿豆网 %Q7A F#U } v
    }
Q8r*s j m1H G0
:] P7Z)i'w `6M r5F2U y0  }绿豆网 &| m1t n r |7X

y @ D!H @ t S0  Console.WriteLine();绿豆网 b,@4o+O,Z V _0i _
绿豆网 %A e e ?&~ `7{
}
0E.Y&/ ~0V,l0 
3t v d4]:x q Q _ /8F/_0 程序输出如图16-9所示。文本框:
图16-9  从二进制文件读取字节
l:s!M(E9l q J c-L;x'^0
:/ p R a&`9l s |0绿豆网 )@4e2@ _)@ p,l q
绿豆网 !E a O C w E8^4y
绿豆网 5N E:N W%j6k v+j o

A O6A9j F ` S(W0绿豆网 p+e(b-K"K u

q4E O } [:u0
2m/Y }+O'`:T0 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值