关于文件的写入:
因为是一个一个的字符写到磁盘上.所以在使用的过程中就出现了一些问题,硬盘的结构决定了速度和消耗.频繁的使用硬盘进行读写操作.就会显得效率不高.而且对硬盘的伤害也是很大的.那么我们应该怎么处理的呢?
在处理的时候.实际上我们可以在内存和硬盘之间开辟一条连接通道.并在内存中划分一块高速缓冲区.然后在写入文件的时候.把数据都先写入到高速缓冲区.然后等到高速缓冲区满了.再一次性写入到硬盘上.或者数据写入完了,然后将数据写入到硬盘上.等到数据写入结束后把连接通道关闭.
代码操作写入方法:
前面所说的写入方法.就是我们所说的文件流的写入方法.显然首先需要打开一个内存和硬盘之间的连接通道.所以我们使用FileStream类.
FileStream类是专门处理文件流的一个类.在System.IO 命名空间下 .在C#中.有关输入输出的操作一般都是在System.IO命名空间下.
开辟高速缓冲区和硬盘之间的连接通道:
1.创建FileStream对象.
static void Main(string[] args)
{
FileStream file = new FileStream(@“C:\fileStreamTest.txt”, FileMode.Create, FileAccess.Write);
}
这样就有了一个连接通道.
对于FileStream的构造函数有点多.所以不需要记太多.我看了下Vs2012中有15个.记住常用的就可以了.
这里的第一个参数就是地址了.filePath.表示需要处理的文件位置.
第二个是FileMode,表示文件的处理方式.这个是枚举变量.
Create 创建文件,若存在则覆盖.
CreateNew 创建新文件,若存在异常,
Open 打开文件,文件不存在异常,
OpenOrCreate 打开和创建文件,
Truncate 打开文件,但是文件中的所有数据,
Append 追加数据到文件中.
(对与使用方式,部分需要FileAccess限制枚举值,不如追加的时候不能读取)
第三个是FileAccess枚举值,可用值只有三个.
Read 读取数据
ReadWrite 读取或写入数据
Write 写入数据
对于FileStream的使用先学会使用这个构造函数就可以了.其他的后面慢慢学.
2, 现在连接通道有了,接下来就是把数据写入到高速缓冲区了,对于写数据,当然有一个写数据的方法了.StreamWrite对象.那么该对象就是完成把数据写入缓冲区的事情了.该怎么样完成呢?
使用构造方法把FileStream作为参数,另外.还需要考虑数据的格式.所以将Encoding.Default作为第二个参数.
static void Main(string[] args) {
FileStream file = new FileStream(@“C:\fileStreamTest.txt”, FileMode.Create, FileAccess.Write);
StreamWriter writer = new StreamWriter(file, Encoding.Default);
}
此时创建一个StreamWrite对象.用来写数据.
关于Encoding 说明:
文本文件都有一定的格式,对于英文和数字.一般都没有什么问题.
在中文和特殊符号中,由于编码比较多.一般使用default即可.
在使用时最好看看是否乱码.
常见的编码有AscII,Utf-8,GB2312,Unicode,GBk等.
3,开始写数据:
数据的写方法一般有两个.write 和WriteLine
Write方法:
Write的方法一般都比较多.我们一般只需要学会两个即可.
public void Write(string value);
public void Write(char value);
该方法是把数据加到末尾.直接调用Flush方法,或该缓冲区已满时写入到磁盘.
代码:
static void Main(string[] args)
{
FileStream fs = new FileStream(@"C:\Test.txt", FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, Encoding.Default);
string str1 = "w";
string str2 = "s";
string str3 = "y";
char ch1 = 'g';
char ch2 = 'c';
char ch3 = 's';
sw.Write(str1);
sw.Write(str2);
sw.Write(str3);
sw.Flush();
sw.Write(ch1);
sw.Write(ch2);
sw.Write(ch3);
}
然后运行程序.查看文本.结果只有wsy 三个字符.
因为后面的没有调用Flush方法.所以没有写入到缓冲区.
4.关闭流对象:
根据上面可见.写文件的最后需要调一个Flush方法.才会把数据写入到硬盘上.那么写入文件后是不是连接通道就没有用了呢?如果没有用了.岂不是占着资源?
所以需要我们手动释放占用的资源.
个人建议的写法:
使用Using 把需要释放资源的代码包起来.那样就不要我们手动去释放资源了.Using会自动帮我们调用Dispose 和close,Flush方法.
完整代码:
static void Main(string[] args)
{
using (FileStream fs = new FileStream(@"C:\Test.txt", FileMode.Create, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
{
string str1 = "w";
string str2 = "s";
string str3 = "y";
char ch1 = 'g';
char ch2 = 'c';
char ch3 = 's';
sw.Write(str1);
sw.Write(str2);
sw.Write(str3);
sw.Write(ch1);
sw.Write(ch2);
sw.Write(ch3);
}
}
}
当代码离开Using范围的时候就会自动调用Dispose方法.
当调用Dispose方法的时候会调用Close方法.
当释放资源的时候 又会调用Flush方法.
WriteLine方法:
对于Write方法实在是比较麻烦的,因为输入的内容是一个一个的写入.如果需要换行还得手动写入换行.所以StreamWrite 提供了一个WriteLine.专门输入一行数据
方法原型:
public void WriteLine(string value);
该方法是将字符串Value写入高速缓冲区.并在后面自动换行.
static void Main(string[] args)
{
FileStream file = new FileStream(“C:\\test.txt”, FileMode.Create, FileAccess.Write);
StreamWriter writer = new StreamWriter(file);
using(file)
{
using(writer)
{
writer.WriteLine(“我是一个测试”);
}
}
}
代码执行后文本将会写入到磁盘中.
文本文件占两行.第一行是刚才写入的文本.第二行是因为WriteLine结束的换行.