您的位置:首页 > 编程语言 > C#

C#:读写简单的文本文件

2008-05-20 15:54 417 查看
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(写入后的数据编码),为了转换成功,我们就必须统一读写过程中的编码形式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: