标题: [转]c# Stream的问题 [打印本页] 作者: Star 时间: 2011-2-18 11:06 标题: [转]c# Stream的问题 转自:http://dev.csdn.net/author/Knigh ... 2e82863cbddb78.html) h- F5 [0 \+ i, }) w
1 w) T2 G8 z2 g: v4 _9 J' I! d
IO操作基本上需要用到Stream相关的子类,因此这类问题在CSDN问得也是比较多。其实对于Stream来说,操作起来比较简单,只要对细节的处理稍微注意一下,相信在使用它的时候也会得心应手。 9 {# R( M) ~5 v$ f" v. J5 Q) n! r2 h6 a4 O) J& p! e
对于Stream相关的问题,大致分如下几类。 ; V# ]( V9 r5 W/ Y& `# J4 v! k6 @! d a
问题一,基本操作的问题; ! V; h8 R& ^5 Z1 |3 K6 w: o( U: N9 Z! G
问题二,编码的问题; 3 b" I* g9 q3 M/ S* J9 s 7 S* T& w9 K1 G3 o! C* h% ^4 o3 z问题三,尾部处理问题; V" g: G) ?! q( U5 H
+ O3 G; t1 D( k; i
问题四,Stream缓存问题;. S D/ D' n: j$ \: K* D
/ ~3 A5 a P' m( ]
问题五,资源释放问题;5 h& z0 n# Y1 U5 H( g9 ~
3 e; k* H" g9 H, `; @" Q \( P
最后一个问题,说说如何使用Stream来更新大文件部分数据。/ D+ R9 ^% s% I7 k# \
1 g, t3 \9 N7 v7 j: [4 j* C对于问题一,基本操作的问题,主要是读写问题,主要是出现在文件数据比较大,需要循环写或者读的时候。此时正确读的形式如下。" f: m- a6 s0 X" ~+ p' \5 Y
) ?% h1 S6 `" V7 M9 B0 f8 v g
// Open a file to read& N& c6 v2 z3 p6 f7 b( h
: i4 W8 {& B$ v9 m- R8 k using( FileStream fs = new FileStream( yourFile, $ g5 E" E% F9 i/ n 4 C, k9 u& E5 y9 y FileMode.Open, FileAccess.Read, 6 I+ W1 e5 o7 ~1 x8 p" K+ s. ~# [/ R. K; N! w$ Z$ e
FileShare.None ) ); ^3 e4 W. I$ U7 }( | ~/ B1 m6 ^
# z% s8 @. y" ^) e {9 J( @' U( W8 M* j3 ?. g
. _2 W7 N3 n- i" T) q/ \
int nRealRead = 0;% K! i' n+ S0 @ l% H2 d
0 e% P9 }" s' u9 X
byte[] bBuffer = new byte[1024]; 6 a2 b6 e# ?7 ?! `1 `8 J2 \5 W1 T7 l$ g' G$ Y9 _0 W+ V
do ; U: w( X: U; |" l: L! T6 x7 a" Q/ [8 T1 |* W
{( @4 T, F' A3 t6 x: O; B
$ ?) |. Q' S# K; U: t+ W
// Read data8 m. F. E2 G! }8 H2 R: w
" l0 G3 p. M: P' E nRealRead = fs.Read( bBuffer, 0, 1024 ); 8 X/ z) h4 f2 Q6 c $ J' n3 Q+ ?7 E // Output data 1 }# P/ K: ]7 K9 k% y1 k5 c( W* [* @1 t5 d/ I
Debug.WriteLine( Encoding.Default.GetString( bBuffer, 0, nRealRead ) ); 1 ]8 h! o3 L N) o; c! o0 D9 I6 c- k7 R
}while( nRealRead == 1024 ); ; _# Z# F0 R/ v0 a. C! G% Y _' ~2 g. A( F$ D } " d# C% o, g* p9 A4 }' ]; @1 q h/ e# y9 Z5 ^$ g0 l& @* {, [
可是大多数人第一次完成这样操作的时候,都会在“nRealRead = fs.Read( bBuffer, 0, 1024 );”这一句犯错误。认为第二个参数的偏移量对于Stream而设的,所以认为应该用累加的值,也就是目前总共读了多少的字节数。这里需要理解一下Stream的操作,当进行读或者写操作的时候,Stream的游标会根据所读或者所写得字节而自动向前跟进;其次Stream.Read或者Stream.Write这两个方法中第二个参数是针对第一个Buffer参数而言的,而不是对于Stream的,因此不要在这个地方犯错误。 & l1 U! P& {2 g/ [. _. }6 s7 B Z% U
基本问题还牵扯的就是文件打开的方式。有人经常问,如何同时用两个Stream打开同一个文件。其实默认的Stream打开方式是独享的,因此当不指明文件为访问共享的时候,后打开文件操作就会出现异常,因此需要向我上面所写的那样。还有,如果需要指定当前Stream的起始位置,可以通过Seek方法或者设置Position属性来完成。! o6 \- Y; O3 x' i1 x' X
9 }7 J4 c9 D2 x K6 t( i" O
对于问题二,编码问题。有人使用Stream的子类,例如StreamReader之类来打开一个文本文件,发现读出来的数据是乱码,造成这个原因大多数由于文件中含有中文字符,同时打开文件的时候没有指明编码方式。由于英文和中文的编码方式不同,因此在不指明编码的时候有时会造成读取中文错误。此时只要使用StreamReader类型中含有Encoding参数的构造函数即可,例如: " S( n8 |5 o% j t! s; Y . M7 O0 O. x* w# v% W' Jusing( StreamReader sr = new StreamReader( yourFile, Encoding.Default ) )+ I7 q F: i7 S' [- ^1 h