流涉及三个基本操作:
1、可以读取流。读取是从流到数据结构(如字节数组)的数据传输。
2、可以写入流。写入是从数据结构到流的数据传输。
3、流可以支持查找。查找是对流内的当前位置进行的查询和修改。查找功能取决于流具有的后备存储区类型。例如,网络流没有当前位置的统一概念,因此一般不支持查找。
System.IO的主要类:
Stream:
支持读取和写入字节的抽象类。不管它具体是什么形式,本质上总是可以视为一串字节序列。
File, FileInfo, Directory, DirectoryInfo:
提供抽象的FileSystemInfo类的具体实现,虚拟了文件系统。
FileStream,MemoryStream,NetworkStream:
流的具体类。其中MemoryStream是一个非缓存的数据流,它封闭的数据在内存中可以直接访问,作为一临时缓存,它很有用。
BufferedStream:
给像NetworkStream这样的数据流添加了缓存的数据流。
TextReader, TextWriter, StringReader, StringWriter,StreamReader,StreamWriter:
向数据流中读出或写入编码后的文本。其中StringReader和StringWriter把一段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 }