找回密码
 注册
关于网站域名变更的通知
查看: 351|回复: 2
打印 上一主题 下一主题

ARM开发中的的文件流是什么?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-10-21 14:13 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
文件流
! i) M+ |/ k; Z8 o
$ n9 \, l/ V- g" h: X% x2 h一、流的概述
. J; n9 q7 L" k6 h​ 要完成文件的读写操作,就必须了解C#中另外一个重要的概念——流(Stream)- L# u8 a  p& }  m4 s5 q" _
​ C#中流的概念可以和生活中的流相对应。在生活中有水流和电流,首先要有一个源头,还需要有传输的管道,# h0 H! L' k; f5 E
水流有河道、水管作为传输管道,电流有电线,而这些流都会有一个目的,就是它的流向。C#的流也需要源头——文件、数据流入流出管道以及数据的访问。
  g5 H! e0 C" }/ V; y# a* @1、输出流和输入流 .Net Framework中进行的所有输入、输出工作都需要用到流。% _2 {8 N/ X( e0 n+ y
​ 1、输出流:当向某些外部目标写入数据时,就要用到输出流。
' S8 u5 Y  W2 v$ [​ 2、输入流:用于将数据读到程序访问的内存或变量中。" g+ V$ R8 n4 J
在程序的控制台中的可以理解为:
7 O/ v* q3 H: m( H* e( n输出流:控制台程序中,将信息从程序中输出的处理:Console.WriteLine();$ y0 d6 ~! h* m8 w1 g
输入流:通过用户键盘来输入到程序当中处理:Console.ReadLine();. h0 O* F! z: r7 X, L
2、文件读写,常用的三个类对于文件读写,常见的三个类:' ?8 j% ?% a( b8 Y2 O
​ 1、FileStream(文件流):这个类主要用于在二进制文件中读写二进制数据——也可以使用它读写任何文件2 w" I, K0 ^/ e8 B" V
​ 2、StreamWriter(流写入器)和StreamReader(流读取器):这二个类是专门用来读写文本文件的。( {, H( Z' h. y' c6 [; v& h7 f
二、FileStream对象### 1、FileStream对象的二种重载​ FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法。
" O' N% u& Y; R4 A+ ?, l& t. h​ 有多种方法可以创建FileStream对象,FileStream类的构造函数有很多的重载版本,最简单的重载版本仅带有二个参数,即文件路径和FileModel枚举值。
/ t5 @  \* E  o' W6 j1.1、第一种重载:0 k& g% l5 u% I) \4 Y; q
9 @' V9 I) \' b8 n; ]1 ^7 }  I# K
6 t9 \) u) n2 m. z) `/ b

    5 q6 k3 B1 M! a5 N1 |; O! W$ [
  • FileStream aFile = new FileStream( 文件路径 , FileMode.成员值);: K* |1 q" z1 s1 r1 R  Q

: k/ p/ K  O- e& z* c* |: f
9 X0 Z! Y! S9 H7 n! \0 x& F
2 Y* v; d4 @; r# o" x9 B
; b: ^7 U5 f# B" I9 O& C$ I
FileModel的枚举成员:
7 E1 ^2 u; @. U. `8 t0 H
' ?/ |! v5 E- G/ t* W# _/ C$ o( G
1.2、第二种重载:# f/ A) [; Z. s! E
1 L* T1 l& d9 E" n

8 G7 B1 i3 E4 G* l
    / c2 L( q' Q/ F6 x: g) y' h4 }! \5 R
  • FileStream aFile = new FileStream( 文件路径, FileMode.成员值, FileAccess.成员值);
    : C, b0 w: g' {) p: q. z. |
( T, W7 L3 W) |' Q
7 J2 E  D+ L4 w% e+ b$ X' x

2 a  ?, K  ]7 Q9 o! j2 o4 _. ~' K4 s7 e5 C
FileAccess的枚举成员:
9 H/ W. e0 f& V9 y

% G  [# `& E3 I. @! e6 U; [( p9 }在FileAccess构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess.ReadWrite。/ \7 K, ^; P$ C0 g9 ?7 z
​ File和FileInfo类中都提供了OpenRead()和OpenWrite()方法,使程序更易于创建FileStream对象。前者打 开了只读访问的文件,后者只允许写入文件。
7 k5 _/ O" R' b1 T  f# A6 `+ ]& O, Y​ 这些都提供了快捷方式,因此不一定要以FileStream构造函数的参数形式提供前面所有的信息。例如,下面的代码行打开了用于只读访问的Data.txt文件。/ K# y2 s" F9 x/ k& n& r3 N
* Z" z6 G* f* G- c$ }$ `
6 D2 S' L! R& ~- N2 ]

; i& K% ^  r6 \: H$ W7 ?; T
    + w0 L4 [% L! i9 ^/ v2 L* n9 y" c
  • FileStream aFile=File.OpenRead(@“C:\Data.txt”);
    . y, ]- Q1 h. k% x' B! |( ?* e% {2 i

2 W% \; b+ B' r7 ]) @" t" R; P
7 b$ h4 D: a1 D6 k) |0 s7 ?( x
6 u/ v+ S! ~, ^. H- ?

7 ?  v% a4 R$ c2 p2 i; f7 c4 d
: E0 E( {9 |6 ~. C4 j& s' k或者( y/ _; [7 t' O" `% h% ~5 k2 b1 n

* a6 t% r+ N% k3 h0 _. L
2 L2 ?( R7 w& Z2 p7 c1 H7 ^' g0 m
4 J2 P) X% A% J$ ~
    $ u" Y% P- P" }% b' Q7 S6 ^
  • FileInfo aFileInfo=new FileInfo(@“C:\Data.txt”);
    + b0 L( r" _" S7 m$ |1 b
9 A  A, a0 N5 ]8 }) h6 r& J

& \$ L" r* s) X1 a( c
7 q; H( ~6 b. }& j+ a

" A6 k8 S# T+ o. l' `- o/ t) y# Q2 t" p: u  P! q  F% V
! }; P% i3 _" t0 k/ k1 }) W  {
: T( G5 h+ p  V6 s/ b# I6 i6 L
/ {" J5 A. i5 I+ F: }1 p  J$ R! r

    ! h1 A, x$ {/ f$ t. i: G
  • FileStream aFile=afileInfo.OpenRead();
    3 V% I) Z/ c$ F" v% ?
  p8 ^- C- ?# ^5 C

5 D: W% U8 b. A$ K) S
) R) _# F4 y! _* Z: P" [
% L  K5 _% U4 q  t2 V9 x
2、使用FileStream读取数据和写入数据​ 使用FileStream类读取数据并不容易,这是因为FileStream类只能处理原始字节(Raw Byte)。& i, h) u! I5 Z  `5 `* T
​ FileStream对象的Read()方法是从FileStream对象所指向的文件访问数据的主要手段。这个方法从文件中读取数据,再把数据写入一个字节数组。4 R% [- K  b' E% R, x8 R4 u

" X+ _4 u6 K  c( a​ 该方法有三个参数:第一个参数是传入的字节数组,用以接收FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置。通常是0,表示从数组开端开始放置读入的字节。最后一个参数指定从文件中读出多少字节。" S: @. {9 M0 Z! v1 m6 Z6 k# ~
+ c* j7 K- L# o6 r
2.1、读取数据:
5 p- P" C; a" Q# ], P在编写程序代码前,需导入Sysytem.IO命名空间。此应用程序打开了磁盘上某个文件,用于读取其中的部分数据。首先,通过实例化一个FileStream的对象,将流指向这个文件。
4 V$ M! }9 L- \" J* }7 i; {! O这可以通过:$ j- \3 @% ~4 ~6 M! f2 b, V

0 m' O2 i8 ~5 \% s* y, t, m$ d/ o5 V1 f) D+ o* c* w2 B

2 q+ l! H. R( n$ B* i- `: }
    7 A. e6 w) U: h4 q# F: O$ x
  • FileInfo aFileInfo =new FileInfo(@"C:\My Document\ReadMe1.txt");
  • FileStream aFileInfo =aFileInfo.OpenRead();
    $ s1 S. b1 @2 Y! Y2 p

4 q: l! D& N) G& f5 k$ R7 E
( b  C! }$ H( N* z$ L

0 G2 l. B$ I) M6 E  k8 g) j' L# ^
步骤:创建FileStream对象,并指向文件流——得到文件大小(字节单位)——创建一个相同大小的字节数组——将文件的字节内容读到数组中——将数组中字节转为字符——输出显示——关闭流, ~7 T4 D& c! b2 x  p' T
% i  ^5 u6 L& f) b. [9 q8 R) q
& X2 f' g3 L6 i! }7 Z  T% E
1 Q2 B% R; e' i: g4 g4 Q: A

    * N. Q, }% Z1 V3 R" R4 k, M; \
  •   /// <summary>
  •         /// 读取数据
  •         /// </summary>
  •         /// <param name="sender"></param>
  •         /// <param name="e"></param>
  •         private void button1_Click(object sender, EventArgs e)
  •         {
  •             //以只读方式创建FileStream对象
  •             FileStream afile = new FileStream(@"C:\My Document\ReadMe1.txt",FileMode.OpenOrCreate);
  •             //得到文件的长度/大小
  •             long length = afile.Length;
  •             //使用文件的长度创建一个字节数组。
  •             byte[] Buffers = new byte[length];
  •             //将流中的数据的字节内容读到字节数组中
  •             afile.Read(Buffers, 0, Buffers.Length);
  •             //将读到的数据进行转码,转为字符串
  •             string content = Encoding.Default.GetString(Buffers, 0, Buffers.Length);
  •             //将字符串在文件框中显示
  •             richTextBox1.AppendText(content);
  •             //关闭流对象,释放文件引用。
  •             afile.Close();
  •         }/ |. k, g$ B5 a  `% M
  \2 c  Q9 G* A* P( d
; w4 O: A- }$ K+ u) X
7 o0 H8 k/ r( m5 J

+ o! O% r9 k) i, k2.2、写入数据:
) D2 l: s) |0 r1 h% E6 D" ~" ?步骤:创建FileStream对象,并指向文件流——声明一个数组是写入数据字节的2倍——使用Encoding类的GetBytes()方法将字符串中的一组字符编码到字节数组中,(1、编码的字符集的字符串,2、表明第一个编码的字符的索引,3、要编码的字符的数量,4、表明要包含所产生的字节序列的字节数组,5、开始写入所产生的字节序列索引位置)4 ]+ Y( z9 K# I2 ^, X& A

+ \/ R0 _. R# E/ c: P: M; \3 G
: q& N6 G& }- @1 m* [5 t& X" I) j+ r0 l0 Z

    7 Z% L2 s- Q+ X
  • /// <summary>
  •         /// 写入数据
  •         /// </summary>
  •         /// <param name="sender"></param>
  •         /// <param name="e"></param>
  •         private void button2_Click(object sender, EventArgs e)
  •         {
  •             //创建一个写文件的文件流对象
  •             FileStream aFile = new FileStream(@"C:\My Document\ReadMe1.txt",FileMode.OpenOrCreate, FileAccess.Write);
  •             //创建字节数组
  •             byte[] buffers;
  •             //获取传入闻见的字符串
  •             string content = richTextBox1.Text;
  •             //为字节数组分配字符串
  •             //可能会包含中文,可以将长度设为字符串长度的二倍
  •             buffers = new byte[content.Length * 2];
  •             //将字符串转成字节放入字节数组中
  •             Encoding.Default.GetBytes(content, 0, content.Length, buffers, 0);
  •             //将字节数组写入文件中
  •             aFile.Write(buffers, 0, buffers.Length);
  •             //关闭流对象,释放文件引用。
  •             aFile.Close();
  •         }8 t0 H* j6 y# D' B1 B- K* e
, y5 y2 w/ @5 F7 l4 |1 ^; N; m
7 O6 t& |- Q- b% s. @

0 |4 Q8 l# K* C. O. i' |9 a; {( Q* G2 ?) J+ y  D" d
三、StreamWrite和StreamReader对象1、StreamWriter对象# a2 E- j# ^% d2 W  b8 L. o% S7 ~! |
StreamWriter对象只能用于写入文件(或另一个流),StreamWriter类的构造方法有很多版本。最常用的有以下三种。
9 ^. ^, R! R+ q
2 C$ ]# J# H/ i% C' ]# I
* c$ u. d2 R: P- ?" y& F- a4 N3 r( c) E1 Z: o( o8 o) r
    $ `$ D" y1 x  N( w. c6 b
  • StreamWriter sw=new StreamWriter(@ “C:\test.txt”);
    . N  _; E# L5 l* B% Y/ Z2 T0 K2 ~

. u, Q% U* c8 I! |0 a
0 A* ~  E/ Q" h5 `! d8 a* C
+ T. ~& h' B/ r1 H# P: k' [* I( r
/ w$ u+ I' c$ P/ P- Z
将使用UTF-8的编码方式创建StreamWriter对象,.NET把这种编码设置为默认的编码方式。: C) A9 `$ I9 p

& M/ F# ~, B, W5 }) k+ i/ h
# m$ |/ h0 ]. `5 o
( d+ U" `/ }0 F0 A3 w0 X$ T

    7 g7 L: V1 N" s& J4 Z) f- A9 {! f
  • StreamWriter sw=new StreamWriter(@ “C:\test.txt”, true);
    , u' F0 q/ B, K* t0 ~8 \4 q; s

+ ~$ D" K: x' d$ d; X) V8 M8 C) _

+ \! p' ~6 W( b7 x5 F. m7 B

6 U  a& M- O3 a
. r- a. E$ ?' @+ k1 ]在这个构造函数中,第二个参数是bool类型,表示文件是否以追加的方式打开。2 F4 B% P' Z4 K) w

( F8 [1 Z- i. U- d7 L, Q% j: M. s# I4 G: O

, s2 ?. h  _& c* T
    4 A# ~, G# b6 d2 L9 [( `
  • StreamWriter sw=new StreamWriter(@ “C:\test.txt”,true,Ecoding.ASCII);
    ; X. ]' ~2 T- M0 u: u
6 ?( W2 S5 B6 W4 l8 C3 ^. p; e

/ c1 o' H2 I+ a& a/ [3 k# ?& g" n" L  R3 i+ t% b, [+ r6 s
: G0 @) V% \; H) _

% f. v6 r# g$ @) f在第三个函数中,第三个参数可以指明要使用的编码方式ASCII来创建StreamWriter对象。但不能仅以文件名和编码方式来创建对象。/ l! G4 @2 `! M( P" k1 y
当然,也可以将StreamWriter关联到一个文件流上,以获得打开文件的更多控制选项。例如以下代码。
3 k6 c# A% Q  d$ L" x  H4 t- |, ]
2 ^' U, h5 x/ a( h& h% W3 T. [  j
0 E+ o. f6 L- M! ~. S- w/ D/ o0 l7 {4 n

    8 U& [% ~/ t. f5 u. b3 x: F5 |
  • FileStream fs=new FileStream(@“C:\1.txt”,FileMode.Append,FileAccess.Write);
    ' m6 L! Y- ]# k! S, o& d
" E! u. [3 P& D; r
. w9 M" W' l$ r6 |7 M7 y! w* |/ x

0 C6 `- h- R9 s) @9 B) {& e
* }8 u" N+ G3 P/ P$ c

, B6 I: R" |5 P# |. s4 I( E
6 ]; X$ D( l* P3 @
. u7 i3 V/ p/ c' b3 p& g
    3 o: ~  f/ G( V; i, i9 p, ?
  • StreamWriter sw=new StreamWriter(fs);! A! c1 G4 O7 j8 F3 ?& E" L

! i8 }5 N5 l, A" z, T
& k' ~, C) n. B4 ~: R: r$ t0 a' H3 q: [0 Z/ O; e" Y# j* |/ j; R
3 u5 j# X, e3 {6 @6 {
- q  b& _) A& f
StreamWriter对象有两个方法来完成向文件或流中写入数据的功能。5 [  z+ e: M$ o/ ?  ]
WriteLine()方法:一次写入一行文本,流会自动把回车符合换行符添加到文本的末尾。
( N; T" E" Z9 X8 HWrite()方法:向流或文件中写入文本,但不会在末尾添加回车和换行符。' Y/ d0 z  A7 L$ L9 Y2 ~
StreamWriter对象和FileStream对象一样,功能执行完毕后要使用Close()方法关闭以释放资源。- ~% L2 f4 D! a; N8 p# c
2、StreamReader对象StreamReader对象用于读取文本文件。用某些方式构造StreamReader对象要比构造FileStream对象更简单,因为使用StreamReader时不需要FileStream的一些选项。特别是不需要模式和访问类型,因为它只能执行读取操作。
  a  O, @& ~  z* ~! ~$ {StreamReader类的构造方法的版本比较多,最简单的构造函数只带一个文件名参数。6 q3 {  k6 }) `' T1 X3 t
StreamReader sr=new StreamReader(@“C:\test.txt”);3 q  A2 T& q- f0 W
StreamReader sr=new StreamReader(@“C:\test.txt”,Encoding.UTF8);
; O0 [) l% c, i. X& o% }$ \也可以把StreamReader关联到FileStream对象上。例如以下代码。
7 Z1 L5 Z2 ?& NFileStream fs=new FileStream(@ “C:\test.txt”,FileMode.Open,FileAccess.Read);
1 L+ A* b0 D* p) z9 L. kStreamReader sr=new StreamReader(fs);6 V$ `; W" Y' `, B# ^
StreamReader对象读取数据的方法主要有三个。$ t+ n: W9 d0 P+ {
(1) Read()方法:此方法每次读取一个字符,返回的是代表这个字符的一个正数,当独到文件末尾时返回的是-1。# e! j. [& [, C. |& |7 N7 i
(2) ReadLine()方法:此方法每次读取流中的一行数据,但不包括回车和换行符。当读到文件末尾将返回null。' a4 y5 a2 q; q5 T
(3) ReadToEnd()方法:此方法一次性读取文件中的所有数据。3 F) h. E$ n; n

( c! W. x7 E+ v" B7 U/ c* t3、使用StreamWriter对象写入数据和StreamReader对象读取数据

; |- Y: _- V% U" i6 T4 E! c& k3.1、StreamWriter对象写入数据
5 i$ J5 d3 ]" s2 w, g' d3 s, G; G  ]/ f
' `  k/ m* c! m% M
    8 K0 k4 E& Y6 J* v+ Q8 e4 p  U
  • //读取数据
  •         private void button1_Click(object sender, EventArgs e)
  •         {
  •             //创建StreamReader对象
  •             //编码方式和写入数据时保持一致
  •             StreamReader sr = new StreamReader(@"C:\My Document\ReadMe1.txt", Encoding.Default);
  •             //利用StreamReader对象的ReadToEnd()方法读取文件中所有数据
  •             richTextBox1.Text = sr.ReadToEnd();
  •             //关闭StreamReader对象以释放资源
  •             sr.Close();
  •         }
    $ B4 U( [, [# z0 U: d
0 f9 z1 [5 g1 i$ b9 {
) J0 e- [- `7 l2 {- a8 V8 B

; @3 T2 Y2 ~, S
  `- w% [. }; i6 d, _. g$ q; p

" w  ?) @9 x% E$ o  `3.2、StreamReader对象读取数据
9 ^: h, H+ y5 T' @6 y# E9 `4 x8 C" T) p5 }; _2 Z& c4 W7 x, [

3 q# Z, y3 O9 G% B2 L7 O. y3 w" t

    ( `- ?/ l' ?* J/ k# D# v2 P
  •         //写入数据
  •         private void button2_Click(object sender, EventArgs e)
  •         {
  •             //创建StreamWriter对象
  •             StreamWriter sw = new StreamWriter(@"C:\My Document\ReadMe1.txt", true, Encoding.Default);
  •             //获取输入数据的文件并放入数组
  •             string[] data = richTextBox1.Lines;
  •             //遍历字符串数组
  •             foreach (string line in richTextBox1.Lines)
  •             {
  •                 //将文本通过StreamWriter对象逐行写入文件
  •                 sw.WriteLine(line);
  •             }
  •             //关闭StreamWriter对象以释放资源
  •             sw.Close();
  •         }7 B0 i6 `- x1 \6 ~" {8 B9 W3 S$ F
2 H+ A+ Q* g2 o0 u" e

  k' @* x0 m6 x* X& H

9 c$ c7 _2 c$ ^5 x, w3 h* V; Z: R( E, F  i& e
四、总结​ 1、如果要对文件的内容进行读写,就需要用到流。  X' G% g7 a* C7 A; f) \
​ 2、FileStream只能处理原始字节(Raw Byte)。处理原始字节的功能使FileStream类可以用于任何数据文件,而不仅仅是文本文件。通过读取字节数据,FileStream对象可以用于读取图像和声音的文件。这种灵活性的代价是,不能使用FileStream对象直接读入字符串,需要将字节数组转换为字符数组或者字符串。" r; x) w* j- ?0 r7 u  F4 g
​ 3、虽然直接操作FileStream对象可以读取和显示文本文件,但是操作字节数组比较麻烦。如果知道某个文件包含文本,通常就可以使用StreamWriter和StreamReader类更方便的对这些文件进行写入和读,而不是FileStream对象。这是因为这些类工作的级别比较高,特别适合于读写文本。它们执行的方法可以根据流的内容,自动检测出停止读取文本较方便的位置。
, F% y- d  Z3 k3 h( N& v$ [8 w" ?$ B6 H6 T/ [5 B, Y

& T1 |! x0 x1 o, ^1 A) [) _
$ n1 M. s6 j% D! Z+ m' P9 @3 i/ @2 \) H4 A: x* Y/ n
& G' |* O0 p* }+ e' P6 n

7 M  ]0 h- j5 {3 |' t9 v5 G9 V
, a- Z5 R, X7 w- w; x
+ ?" c6 ?  }/ {
8 z8 G. {2 {! H, p+ J+ k8 o

该用户从未签到

3#
发表于 2021-10-21 16:21 | 只看该作者
使用FileStream类读取数据并不容易,这是因为FileStream类只能处理原始字节(Raw Byte)。

该用户从未签到

2#
发表于 2021-10-21 14:24 | 只看该作者
在FileAccess构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess.ReadWrite
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 12:40 , Processed in 0.156250 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表