$ t L$ G8 b Q. S7 T& A+ O% pIO操作基本上需要用到Stream相关的子类,因此这类问题在CSDN问得也是比较多。其实对于Stream来说,操作起来比较简单,只要对细节的处理稍微注意一下,相信在使用它的时候也会得心应手。 % Q1 n, V5 c3 Z" _, b ) K4 y& I! u# Q+ a0 L, A9 u对于Stream相关的问题,大致分如下几类。. U) k& F( M6 ^1 _/ t4 O& C. x
3 s7 z" D; i- U: D
问题一,基本操作的问题; : m" U, y7 I0 P9 g * m" z, L) _$ A: ]% I' }问题二,编码的问题;! e! u- B4 U7 T" m) L, n& B6 ~
2 n# \1 B% A8 C6 ]2 J
问题三,尾部处理问题; / q3 s9 ?: s# t; `0 G. F/ ~: h: O8 ^' O+ K
问题四,Stream缓存问题;7 U4 P4 P& U5 E# s
: N% r4 X: R" Y& a, b* V( }& S
问题五,资源释放问题;: S% U+ O( d& C% a
- S! {2 l0 O. K! E" F最后一个问题,说说如何使用Stream来更新大文件部分数据。 3 d$ o, Q& i+ c' Z+ A) o9 m; \$ n% r4 R
对于问题一,基本操作的问题,主要是读写问题,主要是出现在文件数据比较大,需要循环写或者读的时候。此时正确读的形式如下。1 N. W' J+ Q/ ~$ ?0 q {& u3 K
8 Y/ S' x+ F% L& \% n // Open a file to read0 a! h$ L5 R1 ~6 }
: k% \- \) D; T: Y( U0 z' z# o; w
using( FileStream fs = new FileStream( yourFile, V) H, C$ @, h4 h0 m0 w+ h( b( j) B
FileMode.Open, FileAccess.Read, k' {7 e# n/ p" _/ R 0 W G% ~2 Q" b- T, Y1 D* A" B FileShare.None ) ) : l3 Z6 S* X1 x# T) X+ n0 i 4 Z0 Q( N9 i9 d8 u1 h { 6 E" {; D" Z& G) U 2 v6 G6 n7 X" Q% ?$ e; ~ int nRealRead = 0; & [4 ^/ V; D) ]- d( ~' O4 z: d $ \9 }/ @* y) N+ ? byte[] bBuffer = new byte[1024];; w! s: y1 \- B% i! I
" r0 ?. {2 r( {) U do9 \ m0 h( d9 ]) {5 E6 q
& j0 X( n# `& r- J( A3 o4 ]( g
{ % Z \5 x: r1 x! q" t % H' m: F$ P! O. b( a+ l // Read data / h5 `1 u- D" T: o/ k. l1 [/ H; X5 g; f4 Y4 q. K; l
nRealRead = fs.Read( bBuffer, 0, 1024 ); 5 i# j/ a E; k; B5 M& _ m. \, t% p! v/ R$ X& n) t8 A7 ? // Output data % b( G/ H7 f7 X, {% ~' }% ^. \& J3 c/ x
Debug.WriteLine( Encoding.Default.GetString( bBuffer, 0, nRealRead ) );1 F7 F8 N! f3 A3 g- ~
; O6 u2 S/ G" j
}while( nRealRead == 1024 ); # B$ V; ~5 l3 h4 Y+ A9 r; x( |6 B! B ]3 z4 _6 J; K
} V, c* ]: D6 S - `' ?. J! V/ O3 X" S4 I可是大多数人第一次完成这样操作的时候,都会在“nRealRead = fs.Read( bBuffer, 0, 1024 );”这一句犯错误。认为第二个参数的偏移量对于Stream而设的,所以认为应该用累加的值,也就是目前总共读了多少的字节数。这里需要理解一下Stream的操作,当进行读或者写操作的时候,Stream的游标会根据所读或者所写得字节而自动向前跟进;其次Stream.Read或者Stream.Write这两个方法中第二个参数是针对第一个Buffer参数而言的,而不是对于Stream的,因此不要在这个地方犯错误。+ _1 C' r" I' j9 _5 e
# b4 n+ M* M# f' S* Z基本问题还牵扯的就是文件打开的方式。有人经常问,如何同时用两个Stream打开同一个文件。其实默认的Stream打开方式是独享的,因此当不指明文件为访问共享的时候,后打开文件操作就会出现异常,因此需要向我上面所写的那样。还有,如果需要指定当前Stream的起始位置,可以通过Seek方法或者设置Position属性来完成。% E6 @- x* g) \: C8 k, O8 l