C#:读写简单的文本文件
常常我们会去读写一些简单的文本文件,如:读写log文件等等。DotNet中对文件的处理比较简单,但要注意的是:防止产生乱码。 这里,我将运用两种方式来对文本文件进行读写。 一、一次性读写文件的全部内容 我们将要用到以下两个类:FileInfo和FileStream,它们都位于System.IO命名空间中。 · FileInfo:通过此类可获得指定文件的详细内容,并且,还提供创建、复制、删除、移动和打开文件的实例方法,除此,FileInfo还能通过其实例方法OpenRead()来创建FileStream对象。详情可参考MSDN中的System.IO.FileInfo。 · FileStream:支持同步和异步读写操作。使用FileStream类对文件进行读取、写入、打开和关闭等操作,并能对其他与文件相关的操作句柄进行操作。详情可参考System.IO.FileStream。 下面用一个简单的Demo来演示: 1.导入必要的namespace; using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO; // Import the namespace for using the FileInfo class and FileStream class 2.创建一个读取文本文件的方法:ReadFile(string filename),并以byte[]型返回文本文件的所有内容; static byte[] ReadFile(string filename)
...{
FileInfo fi = new FileInfo(filename);
// Using the OpenRead() method to create a FileStream instance
FileStream fs = fi.OpenRead();
byte[] bytes = new byte[fs.Length];
// Read content of the specified file, and store it with byte[] type
fs.Read(bytes, 0, (int)fs.Length);
return bytes;
} 1.创建一个将文本内容写入指定文件的方法:WriteToFile(byte[] bytes, string filename); static WriteToFile(byte[] bytes, string filename)
...{
FileStream fs;
try
...{
// Create a instance of FileStream with the specified filename
fs = File.Create(filename);
// Write all the byte[] into the FileStream's instance
fs.Write(bytes, 0, bytes.Length);
// Write content into the file
fs.Flush();
fs.Close();
}
catch (Exception e)
...{
Console.WriteLine(e.ToString());
}
} 4.现在我们只需在Main()方法中先后调用ReadFile和WriteToFile方法便可完成简单的文本文件夹读写操作: static void Main(string[] args)
...{
string inputFile = @"d: estinput.txt";
string outputFile = @"d: estoutput.txt";
WriteStrToFile(ReadFile(inputFile), outputFile);
} 需要注意:这种方式读取文件其实是将文本文件中的内容以byte流的方式返回,再将这个byte流写入到另一文件中,这样有其好处:整读整写,也不需要考虑文件编码,只要原输入文件在操作系统中能正常显示,那其输出文件的显示也不会有问题。 但是,有的时候,我们并不想去整读一文档,而可能只要读取其中的某几行,那以上的方式就对我们不大可行了。在此,我们给出第二种读写文件方式。 二、一次读写一行 我们将采用StreamReader类来读取文本文件,还会用到与文件编码相关的类Encoding,在写文件时,仍然用FileStream。 · StreamReader: 继承自System.IO.TextReader,能够以一种特定的编码从字节流中读取字符。其默认编码为UTF-8,而并不是当前系统的ANSI。详情请参见System.IO.StreamReader。 · Encoding: 描述编码。它用于对Unicode字符进行操作,而不是对任意二进制数据(如:字节数组)进行操作。请参考System.Text.Encoding。 也用一Demo来简单说明其用法: 1. 读取指定文件中的一行内容,并以string类型返回; static string ReadFile(string filename)
...{
string content = "";
// Create a StreamReader by a specified Encoding type: Windows OS default type: ANSI
StreamReader fileReader = new StreamReader(filename, Encoding.Default);
string tempStr;
while (true)
...{
tempStr = fileReader.ReadLine();
if (tempStr==null)
...{
break;
}
content += tempStr + " ";
}
return content;
} 2.将一string类型的数据写入指定的文件; static void WriteToFile(string content, string filename)
...{
Encoding winDefault = Encoding.Default;
FileStream fs;
try
...{
// Create a instance of FileStream with the specified filename
fs = File.Create(filename);
// Change the string data to byte[] data in the win default encoding: ANSI
Byte[] bytes = winDefault.GetBytes(content);
fs.Write(bytes, 0, bytes.Length);
fs.Flush();
fs.Close();
}
catch(Exception e)
...{
Console.WriteLine(e.ToString());
}
} 3.在Main()方法中调用这两个方法完成文件部分内容的读写; static void Main(string[] args)
...{
string inputFile = @"d: estinput.txt";
string outputFile = @"d: estoutput.txt";
WriteStrToFile(ReadFile(inputFile), outputFile);
} 注意:在DotNet中,string数据永远都是Unicode编码形式,而正常情况下,Windows系统中的字符显示编码为ANSI,要正确地从以ANSI编码的文件中读取数据并存放编码为Unicode的string类型,然后再将这Unicode编码数据写入文件并能在系统中正确显示,就应该统一读取和写入时的编码格式,以防显示乱码。因此,我们在读取文件时(ReadFile()方法中),使用指定的Encoding.Default(即:ANSI)编码方式读取,再在写入文件时(WriteToFile()方法中),使用Encoding.Default编码将string类型数据转换成byte流,这样,我们就成功完成了编码的统一,防止了乱码的出现。 以上两种方法简单地描述了一下在DotNet中文本文件的读写,其关键在于字符的编码。 我们再回过头看方法一,这种方式不需要考虑编码的原因在于:它在读取文件时是以一种默认的编码方式返回byte流,而在将此byte流写入文件时也是以同样的一种编码,在这过程中并没有编码的转换,因此,只要原数据文件显示正常,则其写入后的文件也必然会显示正常。 而方法二有所不同,在读写过程中,出现几次编码的转换:ANSI(原数据文件编码)àUnicode(数据缓存中的编码)àANSI(写入后的数据编码),为了转换成功,我们就必须统一读写过程中的编码形式。