C# 文件读写系列三
1、读写文本文件
在C# 文件读写系列二中列举了相当多的读写文本文件的方法,大致有以下几种:
(1)、通过静态类File的静态方法来进行文本文件的读写,主要有ReadAllBytes()、ReadAllLines()、ReadAllText()、WriteAllBytes()、WriteAllLines()、WriteAllText().
(2)、通过FileStream的实例方法,主要有Read()、Write()
本文将介绍两个级别更加高的类来完成文本文件的读写.==========>StreamReader和StreamWriter
2、StreamReader和StreamWriter简介
在C# 文件读写系列二中,我使用了FileStream完成了读取和写入文本文件的功能,但是FileStream并不是完成读写文本文件最好的类,通常某个特殊文件如果包含文本内容,使用StreamReader和StreamWriter可以更好的读写它们,而不是使用FileStream,因为前者的级别更高,特别适合于读写文本文件,StreamReader和StreamWriter相对与FileStream的优势在于以下几点:
(1)、FileStream是一个比较底层的类,只能简单的读文件到缓冲区,而StreamReader和StreamWriter的实例方法ReadLine()、WriteLine()。ReadLine()可以根据流的内容,自动检测出停止读取文本方便的位置。WriteLine()在写入文件时,流会自动把回车符和换行符追加到文本的末尾.而FileStream则需要自己处理.
(2)、使用StreamReader和StreamWriter不需要考虑(文本格式)文件的编码方式,因为windows所有的文本文件除了ASCII编码的文件,它只包含文本,如果文件是Uniocde格式,这就使用文件的前两个或者前三个字节来表示,这些字节称为字节码标记.例如在使用windows程序,如Notepad或者WordPad打开一个文件时,则不需要考虑文件的编码问题,因为应用程序会自动识别所打开文件的编码.StreamReader类也是一样,它能自动读取任何格式的文件,而StreamWriter类可以使用任何一种编码技术来格式化要输出的内容,但是如果使用FileStream类读取和显示文本,就必须自己来处理这个过程.
(3)、StreamReader和StreamWriter操作都是字符数据(char),而FileStream操作的是字节数据(byte),他们的默认编码都是UTF-8,而一个中文占两个字符
(4)、StreamXXX类常用于文本的打开与保存,FileStream则用于数据的传输.
(5)、FileStream不能指定编码(因为他看到的是文件的二进制形式,当然无所谓编码),所以如果有中文的话需要转码.
但是FileStream也有它自己的优势,FileStream可以指定FileMode、FileAccess、FileShare、FileOptions等各种控制,扩大了文件读写的灵活性,FileStream还提供了BeginRead/BeginWrite(异步读写)的操作方法,所以FileStream用的好的话,效率还是非常高的.
3、StreamReader
使用StreamReader读取文本文件比使用FileStream读取文本文件更加的简单,方便。因为构造一个StreamReader实例来读取文本文件比使用FileStream更加的容易,因为使用StreamReader不需要FileStream的FileMode、FileAcess、FileShare等参数,因为StreamReader只能进行读取操作.StreamReader的构造函数参数主要有以下两个:
(1)、指定文件的编码方式,通过Encoding类
(2)、在没有提供要读取的文件名的情况下,为StreamReader提供了一个Stream流,可以是FileStream、MemoryStream、BufferedStream。因为StreamReader级别很高,所以当有另一个流在读取其他源中的数据,如通过FileStream读取一个文件,所生成的文件流,需要通过StreamReader提供的工具来处理,那么就可以把FileStream的输出流传递给StreamReader,这样StreamReader就可以处理任何数据源(不仅仅是文本文件)中的数据.
(3)、StreamReader共有13个构造函数,下面来一一使用
第一个:提供一个Stream实例(流实例),可以是FileStream、MemoryStream、BufferedStream
FileStream fs = new FileStream(@"C:\Users\Administrator\Desktop\test.txt",FileMode.Open);
StreamReader sr = new StreamReader(fs);
第二个:提供文件的路径
StreamReader sr = new StreamReader(@"C:\Users\Administrator\Desktop\test.txt");
第三个:提供流实例,并设置该流是否需要带字节码标记检测选项。
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"),true);
第四个:提供流实例,并设置指定的字符编码
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"),Encoding.GetEncoding());
注:936是Gb2312的代码页.
第五个:提供流实例,并设置指定的字符编码,并设置该流是否需要带字节码标记检测选项。
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"),Encoding.GetEncoding(),true);
第六个:提供流实例,并设置指定的字符编码,并设置该流是否需要带字节码标记检测选项,并设置最小缓冲区大小.
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"),Encoding.GetEncoding(),true,);
剩下的都是路径的重载,这里就不过多介绍.
(4)、StreamReader常用方法
第一个: Read(),该方法是一个虚方法,其作用是读取输入流中的下一个字符,并使该字符的位置提升一个。
返回值:字符的十进制
代码如下:
//使用gb2312对文件进行转码,否则会出现乱码
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"),Encoding.GetEncoding());
int valToRead = ;
while ((valToRead=sr.Read()) != -)
{
Console.WriteLine(Convert.ToChar(valToRead));//将int型转换成ASCII字符
}
Read()方法的重载Read(char[] buffer,int index,int count)
返回值:读取的字符总数
代码如下:
//使用gb2312对文件进行转码,否则会出现乱码
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"),Encoding.GetEncoding());
char[] buffer = new char[];
int readCount = sr.Read(buffer,,);//最多读取7个字符到buffer数组中
for (int i = ; i <readCount; i++)
{
Console.WriteLine(buffer[i].ToString());
}
sr.Read();
第二个:ReadLine(),行读入。从当前流读取一行数据,并作为字符串返回,如果读到下一行没有数据,则返回null。代码如下:
//使用gb2312对文件进行转码,否则会出现乱码
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"), Encoding.GetEncoding());
string strLine=null;
while ((strLine = sr.ReadLine()) != null)
{
Console.WriteLine(strLine);
}
第三个:ReadToEnd(),从流的当前位置读到流的末尾位置,将文件流一次性全部加载到内存中
注:内存中的数据操作是极快的,但是如果文件过大的话,可能内存就会不够,需要采用Read()或ReadLine()进行读取.代码如下:
//使用gb2312对文件进行转码,否则会出现乱码
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"), Encoding.GetEncoding());
string content=sr.ReadToEnd();
Console.WriteLine(content);
第四个:Peek(),读取下一个字符,但位置不移动
//使用gb2312对文件进行转码,否则会出现乱码
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"), Encoding.GetEncoding());
while (sr.Peek() != -)
{
Console.WriteLine(sr.ReadLine());
}
(5)、StreamReader属性
第一个:EndOfStream,判断当前读取流的位置是否在末尾,代码如下:
//使用gb2312对文件进行转码,否则会出现乱码
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"), Encoding.GetEncoding());
while (!sr.EndOfStream)
{
Console.WriteLine(sr.ReadLine());
}
第二个:CurrentEncoding,获取当前流的编码,代码如下:
//使用gb2312对文件进行转码,否则会出现乱码
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"), Encoding.GetEncoding());
Console.WriteLine(sr.CurrentEncoding);
第三个:BaseStream,返回基础流
StreamReader sr = new StreamReader(File.OpenRead(@"C:\Users\Administrator\Desktop\test.txt"), Encoding.GetEncoding());
Console.WriteLine(sr.BaseStream);
4、StreamWriter
注:当使用StreamWriter写入数据的时候,除非显示的调用Flush或者Close方法,或者设置AutoFlush的值为true,否则其缓冲区将不会刷新到基础流,也就是数据不会写入到硬盘中.
和StreamReader一样,相比FileStream构造一个StreamWriter要容易的多,不需要FileMode、FileAccess、FileShare等参数.
主要的构造参数和StreamReader一样,一个Encoding和一个Stream实例.下面主要介绍StreamWriter的构造函数.
(1)、StreamWriter构造函数.
第一个:提供一个Stream实例(流实例),可以是FileStream、MemoryStream、BufferedStream
FileStream fs=new FileStream(@"C:\Users\Administrator\Desktop\test.txt",FileMode.CreateNew);
StreamWriter sw=new StreamWriter(fs);
(2)、提供一个Stream实例(流实例),可以是FileStream、MemoryStream、BufferedStream,并设置流的编码
FileStream fs=new FileStream(@"C:\Users\Administrator\Desktop\test.txt",FileMode.CreateNew);
StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding());
(3)、提供一个Stream实例(流实例),可以是FileStream、MemoryStream、BufferedStream,并设置流的编码,并设置缓冲区大小。
FileStream fs=new FileStream(@"C:\Users\Administrator\Desktop\test1.txt",FileMode.CreateNew);
StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding(),);
(4)、提供一个Stream实例(流实例),可以是FileStream、MemoryStream、BufferedStream,并设置流的编码,并设置缓冲区大小,在释放writer之后,是否打开流对象.
FileStream fs=new FileStream(@"C:\Users\Administrator\Desktop\test1.txt",FileMode.Create);
StreamWriter sw = new StreamWriter(fs,Encoding.UTF8,,false);
sw.Write("aaa");
sw.Dispose();//释放sw
Console.WriteLine(fs.CanWrite);
参数换成true,输出就为true,自行验证.
也就是说,当前leaveOpen参数设置true时,当释放了sw,fs仍然可以方法,反之,则不能访问,因为在释放sw的同时,fs也被关闭了.
剩下的构造函数都是关于string path的重载,这里就不多介绍了.
(2)、StreamWriter的常用方法
第一个:Write(),该方法就不多做介绍,都是一些比较简单的重载.
第二个:WriteLine(),写入一个空行,并跳转到下一行,代码如下:
FileStream fs=new FileStream(@"C:\Users\Administrator\Desktop\test1.txt",FileMode.Create);
StreamWriter sw = new StreamWriter(fs,Encoding.UTF8,,true);
sw.Write("a");
sw.WriteLine();
sw.WriteLine();
sw.Write("b");
sw.Close();
关于其他的WriteLine()的重载,这里也不多做解释,都是一些比较简单的重载.
第三个:Flush()
(3)StreamWriter的常用属性
AutoFlush:设置StreamWriter 是否在每次调用 StreamWriter.Write 之后,将其缓冲区刷新到基础流。也就是将数据写入到硬盘.
C# 文件读写系列三的更多相关文章
- C# 文件读写系列二
读取文件原则上非常简单,但它不是通过FileInfo和DirectoryInfo来完成的,关于FileInfo和DirectoryInfo请参考C# 文件操作系列一,在.Net Framework4. ...
- 【Win 10 应用开发】文件读写的三种方案
本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...
- numpy文件读写的三对函数
在Python很多库中,使用文件名的地方都可以使用文件对象来替代. 在下述三种方法中,都是如此. 一.a.tofile()和np.fromfile() numpy中的ndarray对象有一个函数tof ...
- Python 文件读写的三种模式和区别
#coding=utf-8 #__author:Administrator #__time:2018/5/9 13:14 #__file_name:text1 import io #能调用方法的一定是 ...
- 文件读写(三)利用FileStream类操作字节数组byte[]、BinaryFormatter、内存流MemoryStream
一.Stream类概述 在.NET Framework中,文件和流是有区别的.文件是存储在磁盘上的数据集,它具有名称和相应的路径.当打开一个文件并对其进行读/写时,该文件就称为流(stream).但是 ...
- PE文件学习系列三-PE头详解
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 最近比较忙 ...
- C# 文件操作系列一
在.Net环境中,所有关于文件操作的类都在System.IO命名空间下,注:在修改文件时,安全性显得格外重要,但是本随笔不过多讲述安全性,这里假设我们有足够的权限. 1.管理文件系统 先通过一幅图来了 ...
- 关于Windows文件读写_暗涌_新浪博客
关于Windows文件读写_暗涌_新浪博客 这几天在研究怎么才能加快windows文件读写速度,搜了很多文章,MSDN也看了不少.稍微给大家分享一下. 限制windows文件读写速度的 ...
- C++文件读写之对象的读写
这里以一个简单的学生信息管理系统为例. 首先是对象的建立,包括姓名,学号,成绩,学分,等 如下: 这里面包括两个子对象, class Student { public: Student() :scor ...
随机推荐
- 从《数据挖掘概念与技术》到《Web数据挖掘》
从<数据挖掘概念与技术>到<Web数据挖掘> 认真读过<数据挖掘概念与技术>的第一章后,对数据挖掘有了更加深刻的了解.数据挖掘是知识发展过程的一个步骤.知识发展的过 ...
- (轉載)sql server xml字段的操作
原文轉自:http://blog.csdn.net/hliq5399/article/details/8315373 另外可參考:https://msdn.microsoft.com/en-us/li ...
- Python作图笔记
感谢莫烦大神,附带他的个人网站链接:https://morvanzhou.github.io/ 再带上官方的文档,多看文档啊!不然参数忘了就没地方查了:https://matplotlib.org/a ...
- XEvent--基础
--SQL Server 扩展事件具有高度可伸缩且高度可配置的体系结构,--使用户能够按需收集解决性能问题或确定性能问题所需的信息.--1. 性能损耗小--2. 可配置性高--3. 可捕获底层事件 - ...
- Npoi将excel数据导入到sqlserver数据库
/// <summary> /// 将excel导入到datatable /// </summary> /// <param name="filePath&qu ...
- SQL Server数据库的基础脚本编程
数据库脚本的基础编程 Go批量处理语句 用于同时处理多条语句 use指定数据库或表 use master --创建数据库 go use Student --创建表(Student)表示数据库 go 创 ...
- .NET控件名称缩写一览表
转载自如下链接: https://www.cnblogs.com/xpvincent/p/9334851.html 字体实在是太小了,我看着好闹心,就复制过来自己放大下,谢谢. 标准控件1 btn B ...
- 遍历datatable的几种方法(C# )
转载 遍历datatable的方法2009-09-08 10:02方法一: DataTable dt = dataSet.Tables[0]; for(int i = 0 ; i ...
- Sql语法高级应用之四:使用视图实现多表联合数据明细
之前章节我们讲到:如果某个表的数据是多个表的联合,并且存在列与列的合并组成新列,用视图是最好的方案. 下面我分享两个个真实的SQL语句案例 USE Wot_Inventory GO FROM sys. ...
- html页面pc显示正常,在手机端适配也可以看整个页面
<meta name="viewport" content="width=1250,initial-scale=0,maximum-scale=2"/&g ...