流涉及三个基本操作:

1、可以读取流。读取是从流到数据结构(如字节数组)的数据传输。
2、可以写入流。写入是从数据结构到流的数据传输。
3、流可以支持查找。查找是对流内的当前位置进行的查询和修改。查找功能取决于流具有的后备存储区类型。例如,网络流没有当前位置的统一概念,因此一般不支持查找。

 System.IO的主要类:

Stream:
支持读取和写入字节的抽象类。不管它具体是什么形式,本质上总是可以视为一串字节序列。

File, FileInfo, Directory, DirectoryInfo
提供抽象的FileSystemInfo类的具体实现,虚拟了文件系统。

FileStreamMemoryStreamNetworkStream
流的具体类。其中MemoryStream是一个非缓存的数据流,它封闭的数据在内存中可以直接访问,作为一临时缓存,它很有用。

BufferedStream
给像NetworkStream这样的数据流添加了缓存的数据流。

TextReader, TextWriter, StringReader, StringWriterStreamReaderStreamWriter
向数据流中读出或写入编码后的文本。其中StringReaderStringWriter把一段String视为流的源。

BinaryReader,BinaryWriter
向数据流中读取和写入编码后的字符串或各种原始数据类型。

练习1:用流读取某个文件,并把它输出到控制台
用到的知识点:
1、文件流FileStream
2、文件流的Read()方法
3、编码的转换Encoding.UTF8.GetString()( 把字节流转换为UTF-8编码的字符串)
 1  static void Main(string[] args)
 2         {
 3             //文件流
 4             FileStream fs = new FileStream("d:\\3.txt", FileMode.Open);
 5             int bufferSize = 50;
 6             //字节数组
 7             byte[] buffer = new byte[bufferSize];
 8             int n;
 9             //n标示读取多少字节
10             while ((n = fs.Read(buffer, 0, bufferSize)) > 0)
11             {
12                 //为什么要(buffer, 0, n)而不是(buffer)?
13                 //因为文件读取到最后,不一定需要读的字节数刚好就是bufferSize,输出的时候会残留上一次读的内容。
14                 //Encoding.UTF8.GetString(表示字符编码.UTF-8.得到字符串())
15                 Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, n));
16             }
17             //关文件流,文件流必须关闭。也可以使用 using(文件流实例的创建){实现的给中方法}来管理
18             //使用using可以方便的释放资源(自动调用Dispose方法)
19             fs.Close();
20             Console.ReadKey();
21 
22         }
23     }

 

练习2:用流来复制文件 (在读写时改变流可以加密哦,但自己也要知道怎么解密啊)

 1  static void Main(string[] args)
 2         {
 3             //用流来复制文件(复制一个3.txt的备份名称为3-复件.txt)
 4             CopyFile("d:\\3.txt", "d:\\3-复件.txt");
 5         }
 6         //写一个方法,给出一个原文件的路径和目标路径,进行复制操作
 7         static void CopyFile(string inName, string toName)
 8         {
 9             //创建一个读的文件流,把原文件读到流中
10             using (FileStream inStream = File.OpenRead(inName))
11             {
12                 //创建一个写的文件流,把流写进目标文件中
13                 using (FileStream toStream = File.OpenWrite(toName))
14                 {
15                     CopyStream(inStream, toStream, 1000);
16                 }
17             }
18         }
19         //创建一个拷贝流的方法,把源流(inStream)的数据安指定缓冲的大小,拷贝到目标流(toStream)中
20         static void CopyStream(Stream inStream, Stream toStream,int bufferSize)
21         {
22             byte[] buffer = new byte[bufferSize];
23             int n;
24             while((n=inStream.Read(buffer,0,bufferSize))>0)
25             {
26                 //向toStream流中写入字节系列
27                 toStream.Write(buffer, 0, n);
28                 //获取inStream流位置,让toStream流的位置和它保持一致
29                 toStream.Position = inStream.Position;
30             }
31         }
32     }

 

posted on 2013-05-23 20:23  星星daddy  阅读(613)  评论(0编辑  收藏  举报