文件的输入和输出在和实际业务的关联挺大的,例如程序运行要写个日志文件,就要用到输出。程序里打开某个文件读取信息,就要用到输入。
C#对文件的操作用到IO命名空间,即在代码中要加入using System.IO;
,这里面包含了很多与I/O有关的类,我重点学习以下几类:
- FileStream类
可以创建一个FileStream
对象来新建一个文件,或者打开一个已有文件,语法如下:
FileStream <object name> = new FileStream(<file_name>, <FileMode Enum>, <FileAccess Enum>, <FileShare Enum>);
FileMode
枚举定义了各种打开文件的方法,最常用的是OpenorCreate
方法,即指定操作系统应打开一个已有的文件。如果文件不存在,则用指定的名称创建一个新的文件打开;
FileAccess
枚举的成员为Read, ReadWrite, Write;
FileShare
与文件共享有关,一般不常用。
还是看下例子
FileStream f = new FileStream("test3.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite);
//若没有test3.dat,则建立一个,若有,则打开。文件可读可写
for(int i =1; i<=10; i++)
{
f.WriteByte((byte)i); //在test3.dat文件中写入1,2,3...10
}
f.Position = 0; //这个Position属性非常重要,=0代表从头开始进行接下去的读写操作
for (int i = 0; i <= 2; i++)
{
Console.Write(f.ReadByte() + " ");
}
f.Close();
编译后的结果
1 2 -1
为什么会有-1
呢?因为Position到0后,只能读到1和2,第三个位置是空,而ReadByte()
这个方法读到空的位置时返回的默认值是-1
如果没有f.Position=0
这句话,则结果为-1 -1 -1
- StreamReader类
例如在D盘有个test.txt文件,我们想一行行的读取这个文件上的字符串。
StreamReader sr = new StreamReader("D:/test.txt"); //新建一个StreamReader对象,读取test.txt
string line;
while (line = sr.ReadLine()) != null) //这里要注意,不能把line=sr.ReadLine()的赋值语句放到while循环语句之外,否则会一直读取文本文件的第一行字符
{
Console.WriteLine(line);
}
最方便的是ReadToEnd()
方法,可以把文件中的所有字符读出来。
例如上面这个例子可以这样改写
StreamReader sr = new StreamReader("D:/test.txt");
Console.WriteLine(sr.ReadToEnd());
- StreamWriter类
就是向文件中写入文本数据
StreamWriter sw = new StreamWriter("test2.txt")
sw.Writeline("take it easy"); //每行的内容,如果有N行就写N个WriteLine()方法
sw.Close(); //一定要有这个Close(),否则只是新建一个.txt文件,里面没有任何内容
还可以使用File的方法CreateText()
:
StreamWriter sr = File.CreateText("test3.txt");
sr.WriteLine("This is my file." +
"sucks");
sr.WriteLine("I can write ints {0} or floats {1}, and so on.",1, 4.2);
sr.Close();