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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
文件流* ]% ~  t+ D0 a$ M$ z& U) ?
7 v4 J7 i* t9 z8 t- Y' ]5 w
一、流的概述& V( b0 P. C: m( v' v" u" F" N! o
​ 要完成文件的读写操作,就必须了解C#中另外一个重要的概念——流(Stream)
! f+ i  k& s# l: N% H* J& }​ C#中流的概念可以和生活中的流相对应。在生活中有水流和电流,首先要有一个源头,还需要有传输的管道,
2 L6 a1 Z& @# c. t: _6 X水流有河道、水管作为传输管道,电流有电线,而这些流都会有一个目的,就是它的流向。C#的流也需要源头——文件、数据流入流出管道以及数据的访问。) L' g2 |0 C5 G, H" e+ I' ]4 U
1、输出流和输入流 .Net Framework中进行的所有输入、输出工作都需要用到流。
6 A+ \4 N: {1 f% K5 o+ H( [​ 1、输出流:当向某些外部目标写入数据时,就要用到输出流。
9 O4 o" f! }* R7 F​ 2、输入流:用于将数据读到程序访问的内存或变量中。& i$ U5 m0 P) J& H$ u. L6 Q
在程序的控制台中的可以理解为:" a" z2 }, o0 ^' M
输出流:控制台程序中,将信息从程序中输出的处理:Console.WriteLine();& T" h7 J" G+ ?, I6 ~5 F& |# c
输入流:通过用户键盘来输入到程序当中处理:Console.ReadLine();- }/ a% {$ j) G& J
2、文件读写,常用的三个类对于文件读写,常见的三个类:
3 F/ d+ f$ x0 D6 T​ 1、FileStream(文件流):这个类主要用于在二进制文件中读写二进制数据——也可以使用它读写任何文件/ j, w8 y) _7 a
​ 2、StreamWriter(流写入器)和StreamReader(流读取器):这二个类是专门用来读写文本文件的。# C0 \. Q5 w& j- y, x8 }2 E) ^4 Z
二、FileStream对象### 1、FileStream对象的二种重载​ FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法。
5 v; D% ^8 K$ H4 F9 `* x; x: [9 i0 ^​ 有多种方法可以创建FileStream对象,FileStream类的构造函数有很多的重载版本,最简单的重载版本仅带有二个参数,即文件路径和FileModel枚举值。! M7 U, |9 o0 F' _
1.1、第一种重载:- v, P$ Q  r# w5 ^. |
) u# I0 A- X- U, n# q3 I2 Y" I
7 C1 J8 }  C/ j/ ^6 \! \, r; R
    & Y$ ?: w. @! x2 P& {* q4 B% l
  • FileStream aFile = new FileStream( 文件路径 , FileMode.成员值);7 J  H" k, U1 W, V- v! c" \; H

! Z8 Q; r$ g% d2 `1 C& G& T1 ?9 b- L% f) a3 u

, h& e0 B/ }0 Y% I% k1 j9 p( U0 Y1 B) i
FileModel的枚举成员:) e, u, h* l# R) H
% l* {' @9 O  O' ]3 u0 G
1.2、第二种重载:
5 k) g' n6 I: \; M, O" l- ]1 @% T1 M# j3 k

7 E3 t/ Z% O. U/ `* E# V7 a  X

    & d( I; Q7 i! {2 W) s, Y( H. a
  • FileStream aFile = new FileStream( 文件路径, FileMode.成员值, FileAccess.成员值);1 ^% Z& O* F* Y( R* F1 |- U
! n& ^7 Z8 }- }1 A5 S, @9 o/ ?* t0 T

- M' Q! u# t0 Q, M

2 L5 g, K- o& {# L. o6 j' K/ u! p% J% r  d. g
FileAccess的枚举成员:
1 L+ ^1 H( r) C0 L! M
; l3 Z* O( ~) r9 E7 Y  h1 `! Z/ @
在FileAccess构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess.ReadWrite。
/ T4 G2 B4 y8 o. ^: P​ File和FileInfo类中都提供了OpenRead()和OpenWrite()方法,使程序更易于创建FileStream对象。前者打 开了只读访问的文件,后者只允许写入文件。
! Z- x( d8 U/ h. l8 {1 U; W+ l" V​ 这些都提供了快捷方式,因此不一定要以FileStream构造函数的参数形式提供前面所有的信息。例如,下面的代码行打开了用于只读访问的Data.txt文件。
" ]* E0 W5 {8 x  {7 T2 M
7 b& x1 V4 `5 b! {3 F, s. Y
" ?4 e( l$ J9 W) R$ B+ L7 T, f& {" K0 ?

    # V+ `- ?5 R$ ~" ?2 j. B! r
  • FileStream aFile=File.OpenRead(@“C:\Data.txt”);# }# R: f' v, v! X
! m2 m. s2 w- E5 z8 m

) {) f/ C2 c! c" d: [2 D
; [5 m9 d* d. H* m7 j+ H
0 C! [2 H' {0 |! x" m! E8 \5 i

# g5 D9 g6 `" V1 k" x9 H% J6 h或者
; X1 f5 D* F! V6 x/ H3 D
9 l9 L6 ^+ ~; r. `0 s' Q& z0 P. C4 V# \: c

, F. Y' @, N- h9 U2 `

    ' x3 \% [. R# X% |
  • FileInfo aFileInfo=new FileInfo(@“C:\Data.txt”);. h; ~/ l5 i0 r7 b2 f* @$ h
2 Z% k! H3 U( [# f+ f5 l0 P! N

2 w& x6 Y0 b2 v" J6 s, {7 D/ e. ~5 I: w. @0 _. X

1 ]  Z- B7 t4 d: y' i. K3 W! B8 Z  `
( D7 x- w$ |2 U/ I) T$ Q0 |5 |
$ O( E+ G, ]' k" \1 l8 u2 f1 a
6 v! R6 `+ Q& i7 [3 m& L4 K' s+ A" e/ o6 n
  O1 g% _- |" y0 e5 c- m

    : J$ G. b/ C* f) I
  • FileStream aFile=afileInfo.OpenRead();
    4 r) r$ ~- e" D" V7 l) z+ s) c9 R
, V; g4 X. t3 z

% |4 S2 P% d% w/ y
, g' z: d% D) G* y" |4 b9 s/ Y; A
) \) t+ |6 G3 ?2 |. V+ T2 n
2、使用FileStream读取数据和写入数据​ 使用FileStream类读取数据并不容易,这是因为FileStream类只能处理原始字节(Raw Byte)。
6 \& M4 b# |' }6 C# z6 k​ FileStream对象的Read()方法是从FileStream对象所指向的文件访问数据的主要手段。这个方法从文件中读取数据,再把数据写入一个字节数组。+ K4 |' h/ d* R, O
3 t5 j  U. f1 H( h% S
​ 该方法有三个参数:第一个参数是传入的字节数组,用以接收FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置。通常是0,表示从数组开端开始放置读入的字节。最后一个参数指定从文件中读出多少字节。7 ^8 n7 A+ j2 t0 r) b9 C' b
: N" c1 T# \. e$ y# A# u: {
2.1、读取数据:
# G; P0 W: J2 T, K$ _+ B" t2 `在编写程序代码前,需导入Sysytem.IO命名空间。此应用程序打开了磁盘上某个文件,用于读取其中的部分数据。首先,通过实例化一个FileStream的对象,将流指向这个文件。
& W2 W9 }5 J$ f" c( I这可以通过:
( r4 M4 f* ]! Q8 D0 e2 W
5 M7 E9 k0 B! A0 h. ]; j2 [% R, z4 O# X$ j5 z3 \8 U. e1 g' d" k
4 c  k6 o0 X% D) E
    # C. ?- l( r$ c. l/ M7 U
  • FileInfo aFileInfo =new FileInfo(@"C:\My Document\ReadMe1.txt");
  • FileStream aFileInfo =aFileInfo.OpenRead();  l! J# \5 V* N4 g8 A  L

  Z7 r4 Q) a( ]9 z& D: [& C( U' o$ s8 x/ P
+ i0 N5 e4 \: ]# n, n+ a
0 a, j0 b2 z: x. X2 c: b. N
步骤:创建FileStream对象,并指向文件流——得到文件大小(字节单位)——创建一个相同大小的字节数组——将文件的字节内容读到数组中——将数组中字节转为字符——输出显示——关闭流
' C  U2 P: b% P& G% B8 y& w, J
4 C& [4 f* {$ ?+ H: Y
1 A% }6 U# r5 ^# O
# M* I  e8 g: P7 O" X$ t& `
    . V* k7 Z8 @' k9 f3 a9 V: t
  •   /// <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();
  •         }
    * f& m" _+ a9 [. _4 ^1 e
) e: S. h! l3 }) o1 b4 |. M

& M/ a% Z# ?  O% w' c/ c5 @

9 P7 z+ |7 A( e2 j2 k; `) J0 z' K5 @. l' g9 j
2.2、写入数据:, m2 M! v" Y% P, A9 J4 |
步骤:创建FileStream对象,并指向文件流——声明一个数组是写入数据字节的2倍——使用Encoding类的GetBytes()方法将字符串中的一组字符编码到字节数组中,(1、编码的字符集的字符串,2、表明第一个编码的字符的索引,3、要编码的字符的数量,4、表明要包含所产生的字节序列的字节数组,5、开始写入所产生的字节序列索引位置)9 I& |4 B- l  V6 K& p

+ G( [1 [$ t- P: B& X9 U
- h- s- m6 X1 C! j8 v* F& o" G8 u8 M; u7 f# l" M, j4 x9 B4 {

    3 h& W7 y* C5 o- w" F1 S
  • /// <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();
  •         }& p3 E2 Z! n  [
8 Z6 Y2 ~6 _) ?7 e2 A  w# p6 i0 o/ h

! ^: N' ^5 V; J% M: [4 x
3 x6 w6 G' b2 X' v0 m1 t# @

& R) J5 F9 U1 w6 p" [7 X2 i三、StreamWrite和StreamReader对象1、StreamWriter对象
. Y2 R7 \+ x6 Q. w  T* kStreamWriter对象只能用于写入文件(或另一个流),StreamWriter类的构造方法有很多版本。最常用的有以下三种。
; N( h+ K) o- \: p  ~. b& H$ |& _4 I; E' j% t, M5 w" r) M
( k6 h% ?5 K/ Q( I, `/ z! u# D; P

* H" @/ W* F! M2 `& s0 o* y! v
    6 d2 b5 d9 I* O# Z7 G! O: h/ l
  • StreamWriter sw=new StreamWriter(@ “C:\test.txt”);) i3 I2 S1 Z: K4 Z) J

. ?" g$ A, O  h& r( Z6 N6 P& c
) |7 J4 k9 }/ {4 }
: Y7 g3 I  d# v; J! `

; k/ c; [; b* c4 f将使用UTF-8的编码方式创建StreamWriter对象,.NET把这种编码设置为默认的编码方式。
% L4 O- C6 u0 K! R+ J9 d# ?) M' }, O1 u1 ^
& r, e2 d$ v' j. `: P. ]

0 V: _5 T7 J& h0 Z" [6 H; w/ C* d

    $ Z7 w3 Z- ~0 V; B6 N- h' p; N4 ^
  • StreamWriter sw=new StreamWriter(@ “C:\test.txt”, true);8 B- F7 n0 x/ c9 z; A3 t

# g4 `. |( W# q; V
1 ]4 n/ P% s0 F: o$ o% a# x+ T& G5 ^4 G

/ v/ X: Y( J8 Z' `0 h* U! I; ?/ K
在这个构造函数中,第二个参数是bool类型,表示文件是否以追加的方式打开。2 I6 E+ C# Y1 r. @5 n. E8 A9 s6 n
6 C# L: P4 w$ ]' X, f
$ J8 y; i0 b1 i' b, y# O) [. B7 b* H1 g8 T

+ w. J+ d1 S& I2 s! K/ }3 ~! N; T

    ( u& T3 Y0 Q# R  V
  • StreamWriter sw=new StreamWriter(@ “C:\test.txt”,true,Ecoding.ASCII);' D# M# ?  y( i0 F4 ?: S& ^
# @! u( V( L  j9 @; P
/ U5 ^+ A9 L6 w2 Y6 v6 e4 e1 ]

. m8 l9 w  }/ B8 U& l

+ u, p2 g; a  C% p9 A6 y/ B6 a' Q' q6 H) r( M
在第三个函数中,第三个参数可以指明要使用的编码方式ASCII来创建StreamWriter对象。但不能仅以文件名和编码方式来创建对象。
* f4 Z# V* C! `3 V* p, h当然,也可以将StreamWriter关联到一个文件流上,以获得打开文件的更多控制选项。例如以下代码。
) u* A  P# x1 `( \* d
2 x, w5 R& s# n. k1 s
) H5 l  T' O& E0 H  i
# o' V  l* m5 _# Q  A5 k8 S; q+ I

    & C6 @& H) l; l# a% U
  • FileStream fs=new FileStream(@“C:\1.txt”,FileMode.Append,FileAccess.Write);% m* l5 Y. C& U) G3 M: H: t
0 \9 }2 ^8 p; e% A! T) ?9 b
" W) W2 f" H# a7 X

- j3 s; s& I) r  r% ?
4 G& D' P0 k$ h( r* k) v
& O/ c; d% ~6 Y3 B- Y
- r! t& L, A* U

7 H$ q# h, Z4 B9 y

    ' L6 \6 H1 w3 {: v0 G2 x3 y3 R
  • StreamWriter sw=new StreamWriter(fs);
    1 T+ U8 d8 z1 E; x3 {

& K: ?$ \$ |$ D  i" B3 P# h2 o9 n& P
( d8 a9 J* v* G% T9 ~8 a3 a/ [* H/ {- X; b& T

) |% {% y0 ?5 a# `+ M5 c9 i; B* \' j
StreamWriter对象有两个方法来完成向文件或流中写入数据的功能。
; Q. ?% \9 ^) F; V) s/ w$ sWriteLine()方法:一次写入一行文本,流会自动把回车符合换行符添加到文本的末尾。0 }$ _1 j  B$ ?5 y7 ]
Write()方法:向流或文件中写入文本,但不会在末尾添加回车和换行符。
2 t* J5 [$ s" FStreamWriter对象和FileStream对象一样,功能执行完毕后要使用Close()方法关闭以释放资源。8 Q9 p/ X4 {! q
2、StreamReader对象StreamReader对象用于读取文本文件。用某些方式构造StreamReader对象要比构造FileStream对象更简单,因为使用StreamReader时不需要FileStream的一些选项。特别是不需要模式和访问类型,因为它只能执行读取操作。
4 q, Z! P. Q- w9 r) X; p* e& x6 BStreamReader类的构造方法的版本比较多,最简单的构造函数只带一个文件名参数。
/ i8 I& B) c4 p) J# p! U3 `StreamReader sr=new StreamReader(@“C:\test.txt”);  a7 T) ]1 `5 }' f! |
StreamReader sr=new StreamReader(@“C:\test.txt”,Encoding.UTF8);5 r/ p, t/ ~# `: z3 g+ D
也可以把StreamReader关联到FileStream对象上。例如以下代码。) i: W- u+ G# s7 k0 E4 W
FileStream fs=new FileStream(@ “C:\test.txt”,FileMode.Open,FileAccess.Read);
  f2 F1 T/ Z3 m' bStreamReader sr=new StreamReader(fs);0 d' A; ?. B: }. z
StreamReader对象读取数据的方法主要有三个。& e/ X5 h( a  A3 Q! H( ^+ I. L1 h
(1) Read()方法:此方法每次读取一个字符,返回的是代表这个字符的一个正数,当独到文件末尾时返回的是-1。
% l; R0 w* d" U0 T( `) p(2) ReadLine()方法:此方法每次读取流中的一行数据,但不包括回车和换行符。当读到文件末尾将返回null。. Q3 E7 r( G4 \
(3) ReadToEnd()方法:此方法一次性读取文件中的所有数据。9 K7 v! x' ]) o- C3 ^" n3 |

- K" b, B% D" H# \5 }& J4 \3、使用StreamWriter对象写入数据和StreamReader对象读取数据
% m" [4 S* s+ U6 H# I, S
3.1、StreamWriter对象写入数据0 n$ J3 q& S, r& l4 T

! b  g$ `( a$ `9 h2 f- P7 _
/ p0 j3 f8 `; |
    # m; R! Q7 Z! h) l. E
  • //读取数据
  •         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();
  •         }
    ' m$ I+ o5 _6 u. S: D3 y$ N

- F* ]/ W# t7 `9 e8 \$ H! [) ~- A7 v# Y( f
) P+ D; u5 f% `) b4 C5 K( r
7 B! S6 [% i9 D' l

8 x( d8 n5 K) ?$ o3.2、StreamReader对象读取数据
/ p; A9 {5 q. z% t% ]% g; t& H( I% B+ `

: d1 o( }+ O8 i, m% }1 X4 Z3 d

    0 P! l, h! G* q9 j
  •         //写入数据
  •         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();
  •         }
    ! @/ \3 d) P* F4 }, Y3 v* E
0 m4 h' p) F8 o/ u8 F

7 f" U3 Y' c! M
: }7 F) u# J% y2 q' i! w

9 c* w. e# T5 N. n: t: X  G四、总结​ 1、如果要对文件的内容进行读写,就需要用到流。7 y8 F+ @8 y8 C' c* \
​ 2、FileStream只能处理原始字节(Raw Byte)。处理原始字节的功能使FileStream类可以用于任何数据文件,而不仅仅是文本文件。通过读取字节数据,FileStream对象可以用于读取图像和声音的文件。这种灵活性的代价是,不能使用FileStream对象直接读入字符串,需要将字节数组转换为字符数组或者字符串。
6 d! ^, Q7 f5 m( @​ 3、虽然直接操作FileStream对象可以读取和显示文本文件,但是操作字节数组比较麻烦。如果知道某个文件包含文本,通常就可以使用StreamWriter和StreamReader类更方便的对这些文件进行写入和读,而不是FileStream对象。这是因为这些类工作的级别比较高,特别适合于读写文本。它们执行的方法可以根据流的内容,自动检测出停止读取文本较方便的位置。0 n$ ~  I1 B% K$ C- A7 s
/ e" m) A7 Q& [
/ {* g' P1 x+ u2 E
: F+ g0 u5 M* A" n! \$ i( ?

% H2 X2 h+ l: y" g$ w" p
% @( Z" Y6 Q5 I! J6 j8 }
* d( }2 G6 Y! E2 G( j" d' C1 m

$ Y2 }. D- U4 c3 ~8 H5 Z" R( z" Z" L8 g$ s8 y: L
( m) J+ F! h, m* @8 U. T: m

该用户从未签到

2#
发表于 2021-10-21 14:24 | 只看该作者
在FileAccess构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess.ReadWrite

该用户从未签到

3#
发表于 2021-10-21 16:21 | 只看该作者
使用FileStream类读取数据并不容易,这是因为FileStream类只能处理原始字节(Raw Byte)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-13 00:06 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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