6 V# J3 s6 |$ {$ l, L对于问题一,基本操作的问题,主要是读写问题,主要是出现在文件数据比较大,需要循环写或者读的时候。此时正确读的形式如下。* @4 _, ^3 Y T
4 ^8 ?; W0 a4 q4 o1 v // Open a file to read, e' e' m- t( E% |
, f+ c5 r+ b0 u0 l* N- S9 K0 q9 b1 Z+ F
using( FileStream fs = new FileStream( yourFile, 3 m# ?# T6 d) s1 P6 e7 u1 S' S5 f% Q7 j: o5 z
FileMode.Open, FileAccess.Read,# l1 A6 R; c2 l& b
! d6 a) b, `; p, I1 F( X$ { FileShare.None ) ) " I) r5 v0 e1 i & H% y, Y, [4 R: J+ w {2 j" K" K3 W+ v! Y* L
% f1 l# @. ^: [8 n3 i int nRealRead = 0;/ V& x5 v. I! w9 u; \
; O) [$ a q5 x6 u. Z byte[] bBuffer = new byte[1024];- D) ]" x% O% H
3 e( \- ~* b) c. }, u do ' U# n s5 |+ r+ M, d2 [7 U& c9 o! i# E, r0 F5 ?9 @1 e% H
{9 I2 J( `2 D, i& c. t$ q
+ _. y) e# H1 Z }9 }
// Read data + k- I' O' j3 q" x+ W + U. k3 q0 _8 q2 E. h# l nRealRead = fs.Read( bBuffer, 0, 1024 );8 o3 w" ?" Q$ k7 \* @, y' k( j
4 D! m- v9 l* A* c- v# u- f8 T- w // Output data 6 R' |. G; E* Y/ I) R. m* C' O8 z : e( V# z" F* L% O% W) j Debug.WriteLine( Encoding.Default.GetString( bBuffer, 0, nRealRead ) ); % C# l' J q5 K. n3 E5 U5 t 1 C, [) `# D0 T+ H5 j0 J; N }while( nRealRead == 1024 ); u) f. j' q' Q" N8 z4 ]: H; i
1 B) S, X7 Z5 F, N
} / h' M0 _8 x. V+ ~# W5 j2 W* u6 ]( [$ Q
可是大多数人第一次完成这样操作的时候,都会在“nRealRead = fs.Read( bBuffer, 0, 1024 );”这一句犯错误。认为第二个参数的偏移量对于Stream而设的,所以认为应该用累加的值,也就是目前总共读了多少的字节数。这里需要理解一下Stream的操作,当进行读或者写操作的时候,Stream的游标会根据所读或者所写得字节而自动向前跟进;其次Stream.Read或者Stream.Write这两个方法中第二个参数是针对第一个Buffer参数而言的,而不是对于Stream的,因此不要在这个地方犯错误。 # Q6 L* S i# b. [+ \7 X% V0 l ; s/ I* b9 V( L; } z& i: o- \基本问题还牵扯的就是文件打开的方式。有人经常问,如何同时用两个Stream打开同一个文件。其实默认的Stream打开方式是独享的,因此当不指明文件为访问共享的时候,后打开文件操作就会出现异常,因此需要向我上面所写的那样。还有,如果需要指定当前Stream的起始位置,可以通过Seek方法或者设置Position属性来完成。! p0 O* H7 J: `# [* n3 T# Q
8 z) Y1 n, [ S3 g对于问题二,编码问题。有人使用Stream的子类,例如StreamReader之类来打开一个文本文件,发现读出来的数据是乱码,造成这个原因大多数由于文件中含有中文字符,同时打开文件的时候没有指明编码方式。由于英文和中文的编码方式不同,因此在不指明编码的时候有时会造成读取中文错误。此时只要使用StreamReader类型中含有Encoding参数的构造函数即可,例如:, |* N [' |& P: r: k) Z