C#学习(八)之Stream

  这一周章老师讲了有关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://f.hiphotos.baidu.com/zhidao/pic/item/42a98226cffc1e17078acd7a4a90f603738de940.jpg

posted @ 2015-05-08 19:51  马列神教  阅读(530)  评论(0编辑  收藏  举报