标签:
这一周章老师讲了有关Stream的知识,本次学习记录就围绕着Stream展开。
首先先介绍C#中一些有关文件操作的知识。
先看下面的代码:
1 //从环境变量"SystemRoot"中得到特定字符串的值,“SystemRoot”代表Windows系统启动目录 2 string theDirectory = Environment.GetEnvironmentVariable("SystemRoot"); 3 Console.WriteLine(theDirectory); 4 //得到目录字符串theDirectory的对象dir 5 DirectoryInfo dir = new DirectoryInfo(theDirectory ); 6 //得到dir目录对象的文件集合 7 FileInfo[] filesInDir = dir.GetFiles(); 8 foreach (var item in filesInDir) 9 { 10 Console.WriteLine(item.Name); 11 } 12 //得到dir对象的子目录集合 13 DirectoryInfo[] directories = dir.GetDirectories(); 14 foreach (var item in directories) 15 { 16 Console.WriteLine(item.Name); 17 }
输出结果如下
总结一下,上面的代码就是将Windows系统启动目录(C:\Windows)里的文件和目录的名字输出到控制台。
DirectoryInfo也可以传入的地址为参数初始化,如
1 string theDirectory = @"c:\test\media“; 2 DirectoryInfo dir = new DirectoryInfo(theDirectory);
这样就可打开指定目录进而操作。另外DirectoryInfo 和 FileInfo这两个类也集成了许多函数提供了新建,复制,转移,删除等功能,此处就不一一介绍了。
下面总结一下在C#编程中经常会用到的一些流。比如说FileStream、BufferedStream、 NetWorkStream、 StreamReader/StreamWriter等的简单用法。
1. FileStream类
FileStream类主要用于读取磁盘上的文件或者向磁盘文件写入信息。
从磁盘上的文件中读取内容:
1 FileStream file = File.Open(@"F:\file.txt", FileMode.Open); //初始化文件流 2 byte[] array = new byte[file.Length];//初始化字节数组 3 file.Read(array, 0, array.Length);//读取流中数据把它写到字节数组中 4 file.Close();//关闭流 5 string str = Encoding.Default.GetString(array);//将字节数组内容转化为字符串 6 Console.WriteLine(str);
输出内容即为file.txt的内容。
将数据写入磁盘文件:
1 FileStream file = File.Open(@"F:\file.txt", FileMode.Append);//初始化文件流 2 byte[] array = Encoding.UTF8.GetBytes("Hello World!");//给字节数组赋值 3 file.Write(array, 0, array.Length);//将字节数组写入文件流 4 file.Close();//关闭流
上面的代码将“Hello World!”写入了file.txt。
2.BufferedStream类
BufferedStream类主要也是用来处理流数据的,但是该类主要的功能是用来封装其他流类。这么做的意义是减少某些流直接操作存储设备的时间。对于一些流来说直接向磁盘中存储数据这种做法的效率并不高,用BufferedStream包装过的流, 先在内存中进行统一的处理再向磁盘中写入数据,也会提高写入的效率。
将磁盘上的一个文件写入到磁盘上的另一个文件中:
1 BufferedStream封装流 2 FileStream file1 = File.Open(@"F:\file1.txt", FileMode.OpenOrCreate,FileAccess.Read);//读取文件流 3 FileStream file 2= File.Open(@"F:\file2.txt", FileMode.OpenOrCreate,FileAccess.Write);//写入文件流 4 5 byte[] array = new byte[4096]; 6 7 BufferedStream bufferedInput = new BufferedStream(file1);//封装文件流,读取 8 BufferedStream bufferedOutput = new BufferedStream(file2);//封装文件流,写入 9 10 bufferedInput.Read(array, 0, array.Length); 11 bufferedOutput.Write(array, 0, array.Length); 12 13 int bytesRead = 0; 14 while ((bytesRead = bufferedInput.Read(array, 0, 4096)) > 0)//读取到了数据 15 { 16 bufferedOutput.Write(array, 0, bytesRead); 17 Console.WriteLine(bytesRead); 18 } 19 bufferedInput.Close();//关闭各种流 20 bufferedOutput.Close(); 21 file1.Close(); 22 file2.Close();
总结一下上面的代码功能就是将file1的内容写入file2。不过现在我们也许还用不到这个流,这里也只是介绍一下其用法。
3.NetWorkStream类
NetWorkStream类是专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。
简单的TCP同步方式服务器与客户端通信:
服务器
1 TcpListener lis=new TcpListener(5000); //服务器监听 2 lis.Start();//启动 3 Socket sock=lis.AcceptSocket();//阻塞,直到有客户端连接 4 5 NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流 6 if (netStream.DataAvailable) //如果客户端发送了消息 7 { 8 byte[] data = new byte[1024]; //定义一个字节数组,用来存放接收的数据 9 int len = netStream.Read(data, 0, data.Length); //从位置开始,读取到字节数组末尾 10 string line = Encoding.Default.GetString(data, 0, len); //把收到的字节转换为字符串 11 }
客户端
1 TcpClient client = new TcpClient();//客户端tcp对象 2 client.Connect("127.0.0.1", 5000);//连接服务器 3 NetworkStream myStream = client.GetStream();//得到网络流 4 5 byte[] data = Encoding.Default.GetBytes("Hi,你好"); //首先把输入的字符串消息转换为字节 6 myStream .Write(data, 0, data.Length); //向myStream 里写入数据 7 myStream .Flush(); //刷新流中的数据 8 myStream .Close();
4.StreamReader/StreamWriter类
StreamReader/StreamWriter主要用来处理流数据。它们分别提供了高效的流读取/写入功能。
读取与写入:
1 StreamReader reader = new StreamReader("filePath");//初始化读取,filePath为文件位置 2 StreamWriter writer = new StreamWriter("filePath");//初始化写入 3 4 string readStr=reader.ReadLine();//从流中读取一行 5 string readAff = reader.ReadToEnd();//从流中读取全部 6 7 writer.Write("Hi");//写入内容 8 writer.WriteLine("Hi");//写入一行 9 10 reader.Close();//关闭流 11 writer.Close();
上面的代码也是对文件进行读写操作,且比较高效。
最后再介绍一下网络流,示例代码如下:
1 HttpWebRequest webRequest 2 = (HttpWebRequest)WebRequest.Create("http://www.baidu.com/"); //http请求 3 HttpWebResponse webResponse 4 = (HttpWebResponse)webRequest.GetResponse(); 5 StreamReader streamReader = new StreamReader( 6 webResponse.GetResponseStream(), Encoding.ASCII); //http应答 7 try //处理网络异常 8 { 9 string outputString = streamReader.ReadToEnd(); 10 Console.WriteLine(outputString); 11 } 12 catch { Console.WriteLine("Exception reading from web page"); } 13 streamReader.Close(); //关闭流
上面的代码就是将百度首页的HTML代码读入然后输出,也是比较简单明了的。
今天的学习记录到此为止,以后有机会再补充一些内容。
望各位老师大牛不吝赐教!
标签:
原文地址:http://www.cnblogs.com/tjulym/p/4488710.html