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

来源:互联网 发布:json模拟通讯录 编辑:程序博客网 时间:2024/05/16 07:35

  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(写入后的数据编码),为了转换成功,我们就必须统一读写过程中的编码形式。