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代码读入然后输出,也是比较简单明了的。

  今天的学习记录到此为止,以后有机会再补充一些内容。

  望各位老师大牛不吝赐教!

  

时间: 2024-08-05 15:25:08

C#学习(八)之Stream的相关文章

Spark学习八:spark streaming与flume和kafka集成

Spark学习八:spark streaming与flume和kafka集成 标签(空格分隔): Spark Spark学习八spark streaming与flume和kafka集成 一Kafka 二flume和kafka的集成 三kafka和spark streaming的集成方式一kafka推送 四kafka和spark streaming的集成方式一spark streaam主动获取 五spark stream的高级应用updateStateByKey实现累加功能 六spark stre

Oracle学习(八):处理数据

1.知识点:能够对比以下的录屏进行阅读 SQL> --SQL语句 SQL> --1. DML语句(Data Manipulation Language 数据操作语言): insert update delete select SQL> --2. DDL语句(Data Definition Language 数据定义语言): create/alter/drop/truncate table SQL> -- create/drop view,create/drop index(sequ

springMVC3学习(八)--全局的异常处理

在springMVC的配置文件中: <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView"> <value>/error</value><!-- 表示当抛出异常但没有

nginx学习(八):nginx配置gzip

开启gzip压缩功能,目的是 提高传输效率,节约带宽 配置gzip gzip on; #限制最小压缩,小于1字节文件不会压缩 gzip_min_length 1; #定义压缩的级别 gzip_comp_level 3; gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css; 验证 HTTP/1.1 200 OK Server: nginx/1.

C#学习(八)- Stream

1. 综述 流用于对IO处理,在System.IO名称空间中有以下类: BinaryReader/Writer TextReader/Writer Stream其中类Stream为抽象类.由此有三个派生类: MemoryStream:对内存进行读取与写入 BufferedStream:对缓冲器进行读取/写入 FileStream:对文件执行读取与写入 TextReader/Writer为抽象类.由此派生类:StreamReader/StreamWirterStringReader/StreamW

C语言学习--八皇后问题

问题描述: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 程序设计: 1.一维数组a[17],数组分成三段,第一段a[0]用来标记八皇后安置完成:第二段a[1,8]用来标记列位置有无子,方便判断列冲突:第三段a[9,16]用来标记存储位置. 2.关键算法 递归判断位置,eightQueens . 3.对角线位置互斥判断, isDiagonal. 4.输出函数, printResult. 算法描述: 1.首次传入为数组a

研究生学习八问

知识来自文献!从研究没有开始直到研究做完,从头到尾,你都离不开查阅文献.查阅文献是为了不重复别人的工作,为了激发新的想法,为了站到本领域的前沿.如果你一年不看文献,那么,你已经在这个领域里out了. 研究生最忌讳的几点: 1)被动,要导师“背着走”.研究生的创新意识不能丢,要随时考虑着自己的课题应该如何改善.完善和改进,而不是等着导师来催你做什么你才去做什么. 2)以为Idea是来自导师.Idea从什么地方来?不是靠导师,要广看文献.当然,如果导师直接告诉你一个Idea,那也行,但是更多情况是你

mongoDB 学习八

MongoDB 删除文档 在前面的几个章节中我们已经学习了MongoDB中如何为集合添加数据和更新数据.在本章节中我们将继续学习MongoDB集合的删除. MongoDB remove()函数是用来移除集合中的数据. MongoDB数据更新可以使用update()函数.在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯. 语法 remove() 方法的基本语法格式如下所示: db.collection.remove( <query>, <ju

Android学习八:获取网络图片

看到QQ群里有个朋友说加载图片内存溢出的问题,所以就按照自己的想法试试的.但是按照他的方法,不知道为何没有发生内存溢出,不知道什么情况. 写这篇文章主要有三个目的: 1.多线程的学习 2.图片加载的学习 3.编程练手 好了,上代码 package org.tonny; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.Malforme

深度学习八

转载:http://blog.csdn.net/zouxy09/article/details/8782018 接上 十.总结与展望 1)Deep learning总结 深度学习是关于自动学习要建模的数据的潜在(隐含)分布的多层(复杂)表达的算法.换句话来说,深度学习算法自动的提取分类需要的低层次或者高层次特征.高层次特征,一是指该特征可以分级(层次)地依赖其他特征,例如:对于机器视觉,深度学习算法从原始图像去学习得到它的一个低层次表达,例如边缘检测器,小波滤波器等,然后在这些低层次表达的基础上