C#中的文件的IO原理及操作


1.原理:
System.IO命名空间中的类为托管应用程序提供文件以及其他形式的输入输出。托管i/o的基本构件是流,而流是字节导向的数据的抽象表示。流通过System.IO.Stream类表示.

System.IO.FileStream允许将文件作为流访问;
System.IO.MemoryStream允许将内存块作为流进行访问;

托管和非托管的应用程序最常使用的IO形式是文件IO。托管应用程序读写文件的一般步骤如下
--1、用FileStream对象打开文件
--2、进行二进制读写操作,在FileStream对象周围包装BinaryReader和BinaryWriter的实例,并调用BinaryReader和BinaryWriter方法执行输入输出。
--3、要读写文本,在FileStream对象的周围包装一个StreamReader和StreamWriter,然后使用StreamReader和StreamWriter方法完成输入输出。
--4、关闭FileStream对象。

2.文件IO操作的類

FileStream-------表示可以被写或被读,或二者都可的文件,此文件可以同步或异步读和写
StreamReader------从流中读取字符数据,并可通过使用FileStream被创建为基类。
StreamWriter------向流写字符数据,可通过使用FileStream被创建为基类。


--1.FileStream对象

FileStream对象表示在磁盘或网络路徑上指向文件的流。FileStream类操作字节和字节数组.

FileStream对象的构造函数:
FileStream aFile = new FileStream(“Log.txt”,FileMode.OpenOrCreate);

-->FileMode枚举具有几种成员:
Append------如果文件存在,就打开文件,将文件位置移动到文件的末尾,并创建一个新文件。FileMode.Append仅可以与枚举FileAccess.Write联合使用
Create------创建新文件;如果存在这样的文件,就破坏它。
CreateNew------创建新文件,但是如果已经存在此文件,则抛出异常
Open------打开现有的文件,但是不存在所指定的文件,则抛出异常
OpenOrCreate------如果文件存在,则规定打开文件,否则就创建新文件,如果文件已经存在,则保留在文件中的数据
Truncate------打开现有文件,清除其内容,然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期,必须存在有文件,否则就抛出异常

-->访问级别
前面的构造函数默认以只读模式打开文件,需要一个附加参数规定不同的访问级别,此参数是FileAccess参数。
FileStream aFile=new FileStream(”Log.txt”,fileMode.OpenOrCreate,FileAccess.Write)
FileAccess枚举有三种类型:Read、Write、ReadWrite.此属性的作用是:基于用户的身份验证级别改变用户对文件的访问

-->读取文件的位置用seek:
public long Seek(long offset,SeekOrigin origin)
 Long offset是规定文件指针以字节为单位的移动距离;SeekOrigin origin是规定开始计算的起始位置,此枚举包含3个值:Begin,Current和End。
   例:aFile.Seek(8,SeekOrigin.Begin);// SeekOrigin.Begin指得是文件指针从文件的第一个字节起;而参数‘8‘指得是移动到文件的第8个字节
   例2:afile.Seek(2,SeekOrigin.Current)//在当前位置开始,再移动2个字节。
   例3:aFile.Seek(-5,SeekOrigin.End)//在文件末端位置开始,倒数5个字节。


-->读取数据
使用FileStream类读取数据不像使用StreamReader和StreamWriter类读取数据那么容易,这是因为FileStream类只能处理原始字节(raw byte),这使得FileStream类可以用于任何数据文件,而不仅仅是文本文件,通过读取字节数据就可以读取类似图像和声音的文件。这种灵活性的代价是不能使用它直接读入字符串,而使用StreamWriter和StreaMeader类却可以这样处理,从是有几种转换类可以很容易地将字节数组转换为字符数组,或者进行相反的操作。
Read()方法是从FileStream对象所指向的文件访问数据的主要手段:
Public int Read(byte[] array,int offset, int count)//第一个参数是被传输进来的字节数组,用以接受FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置,它通常是0,表示从数组的开端的文件中向数组写数据,最后一个参数是规定从文件中读出多少字节。
例:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.IO;

namespace  myFile
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            
byte [] byData  =   new   byte [ 100 ]; // 建立一个FileStream要用的字节组
             char [] charData  =   new   char [ 100 ]; // 建立一个字符组

            
try
            {
                FileStream aFile 
=   new  FileStream( " ../../../../Data.txt " , FileMode.Open); // 实例化一个FileStream对象,用来操作data.txt文件,操作类型是
                
                aFile.Seek(
55 , SeekOrigin.Begin); // 把文件指针指向,从文件开始位置向前55位字节所指的字节
                aFile.Read(byData,  0 100 ); // 读取FileStream对象所指的文件到字节数组里
            }
            
catch  (IOException e)
            {
                Console.WriteLine(
" close " );
                
return ;
            }
            Decoder d 
=  Encoding.UTF8.GetDecoder(); //
            d.GetChars(byData,  0 , byData.Length, charData,  0 ); // 将编码字节数组转换为字符数组

            Console.WriteLine(charData);
            Console.ReadLine();
            
return ;
        }
    }
}

-->写入数据
写入数据的流程是先获取字节数组,再把字节数据转换为字符数组,然后把这个字符数组用Write()方法写入到文件中,当然在写入的过程中,可以确定在文件的什么位置写入,写多少字符等等。
例:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.IO;

namespace  myFile
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            
byte [] byData  =   new   byte [ 100 ]; // 建立一个FileStream要用的字节组
             char [] charData  =   new   char [ 100 ]; // 建立一个字符组

            
try
            {
                FileStream aFile 
=   new  FileStream( " ../../../../Data.txt " , FileMode.Open); // 实例化一个FileStream对象,用来操作data.txt文件,操作类型是
               
                charData 
=   " 我是谁?111? " .ToCharArray(); // 将字符串内的字符复制到字符组里
                aFile.Seek( 0 , SeekOrigin.End);
                Encoder el 
=  Encoding.UTF8.GetEncoder(); // 编码器
                el.GetBytes(charData,  0 , charData.Length, byData,  0 true );

                aFile.Write(byData, 
0 , byData.Length);
            }
            
catch  (IOException e)
            {
                Console.WriteLine(
" close " );
                
return ;
            }
           
        }
    }
}

--2.對字符操作的類
StreamWriter和StreamReader是對字符數據的操作,相對字節操作,字符操作就要方便得多,如對文本的操作,我們就經常使用這個類.不過這也同時限製了它局限性.

-->StreamWriter对像寫文件
用FileWriter来随机读取文件是个好主意,而用StreamWriter可以直接把字符串写入文件中,它处理重要的转换和向FileStream对像写入工作。创建StreamWriter有很多方法:
FileStream aFile = new FileStream(“Log.txt”,FileMode.CreatcNew);
StreamWriter sw = new StreamWriter(aFile);
也可直接从文件中创建StreamWriter对象:
  StreamWriter sw = new StreamWriter(“Log.txt”,true);
    后面这个Boolean值规定是附加文件还是创建新文件,如果此值为false,则就创建一个新文件,或者截取现有文件并打开它。如果此值设置为true,则打开文件,保留原来的数据,如果找不到文件,则创建一个新文件。注意:当创建FileStream对象时,您无法得到选项的范围。除了使用Boolean值附加或创建新文件外,我们根本就无法像使用FileStream类时那样规定FileMode属性;而且,您也无法设置FileAccess属性.因此您总是具有对文件的读写特权,为了使用任何高级参数,您必须在FileStream构造函数中规定这些参数,然后在FileStream对象中创建StreamWriter。

例:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.IO;

namespace  StreamWriterFile
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            
try
            {
                FileStream aFile 
=   new  FileStream( " data1.txt " , FileMode.OpenOrCreate); // 建立一个fileStream对象
                StreamWriter sw  =   new  StreamWriter(aFile); // 用FileStream对像实例一个StreamWriter对象
               
                sw.Write(
" first. " );
                sw.WriteLine(
" hello world!!! " ); // 写入字符串,方法WriteLine写入时后面跟一个换行符
                sw.Write( " This is a " ); // 写入字符串,方法Write写入时没有换行符
                sw.Write( " string of characters. " );
                sw.Close();
// 用完后必须关闭对像
            }
            
catch  (IOException e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

-->StreamReader对象读取文件
输入流用于从外部源读取数据,在很多情况下,数据源可以是磁盘上的文件或网络的某些位置,任何可能发送数据的位置都可以是数据源,比如网络应用程序,web服务,甚至是控制台。StreamReader是一个通用类,可以用于任何流;StreamReader对象的创建方式非常类似于StreamWriter对象的创建方式。
StreamWriter类有两个基本的方法read和readLine
Read()方法将流的下一个字符作为正整数值返回,如果到达了流的结尾处,则返回-1
ReadLing()方法是读取并返回一行字符,如果返回为空,那么就是到达了流的结尾。
ReadEnd()方法读小文件最好,它直接读取完整的文件并作为字符串返回。

例:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.IO;

namespace  StreamReaderTest
{
    
class  Program
    {
        
        
static   void  Main( string [] args)
        {
            
string  strLine; 
            
try
            {
                Console.Write(
" 请输入文件路徑及文件名: " );
                
string  mess  =  Console.ReadLine();
                FileStream aFile 
=   new  FileStream(mess, FileMode.Open);
                StreamReader sr 
=   new  StreamReader(aFile); // 用FileStream对象实例化一个StreamReader对象
                
// strLine = sr.ReadToEnd(); // 读取完整的文件,如果用这个方法,就可以不用下面的while循环
                strLine  =  sr.ReadLine(); //   读取一行字符并返回
                 while  (strLine  !=   null )
                {
                    Console.WriteLine(strLine);
                    strLine 
=  sr.ReadLine();
                }
                sr.Close();
                Console.ReadLine();
            }
            
catch  (IOException e)
            {
                Console.WriteLine(
" an IOexception has been thrown! " );
                Console.WriteLine(e.ToString());
                
return ;
            }
            
return ;
        }
    }
}

-->分隔文件
读取使用逗号分隔的文件,string类提供了一种称为Split()的方法,可以用于将字符串按照提供的分隔符分隔成字符组.

例:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.IO;

namespace  CommaValues
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            
while  ( true )
            {
                
string  strLine;
                
string [] strArray;
                
char [] charArray  =   new  Char[] {  ' , '  };
                Console.Write(
" 请输入文件内容以逗号分隔的文件路徑及文件名: " );
                
string  name  =  Console.ReadLine();

                
try
                {
                    FileStream aFile 
=   new  FileStream(name, FileMode.Open);
                    StreamReader sr 
=   new  StreamReader(aFile);

                    strLine 
=  sr.ReadLine();
                    
while  (strLine  !=   null )
                    {
                        strArray 
=  strLine.Split(charArray);
                        
for  ( int  x  =   0 ; x  <=  strArray.GetUpperBound( 0 ); x ++ )
                        {
                            Console.WriteLine(strArray[x].Trim());
                        }
                        strLine 
=  sr.ReadLine();
                    }
                    sr.Close();
                    
// Console.ReadLine();
                }
                
catch  (IOException e)
                {
                    Console.WriteLine(e.ToString());
                    
return ;
                }
                
// return;
            }
        }
    }

 

參考文獻:1. http://support.microsoft.com/kb/304430/zh-tw
                 2. http://dev.csdn.net/article/73/73684.shtm
                 3. http://www.knowsky.com/343371.html

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值