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

C# FileStream和StreamWriter用法

2014-01-13 13:53 573 查看
 FielStream类操作的是字节和字节数组,而stream类操作的是字符数据。字符数据易于使用,但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行。

   FielStream类维护内部文件指针,该指针指向文件中进行下一次读写操作的位置。

   FileStream只能处理原始字节(raw byte),处理原始字节的功能使用FileStream类可以用于处理任何数据文件。

   通过读取字节数据,FileStream对像可以用于读取图像和声音。代价是FileStream类不能将数据直接读入字符串

   

注:FileMode枚举成员值在文件存在与不存在时的情况 

 

Append

 文件存在时:打开文件,流指向文件的末尾,只能与枚举FileAcess.Write联合使用

 文件不存在时:创建一个新文件。只能与枚举FileAcess.Write联合使用

 

Create

 文件存在时:删除该文件,然后创建新文件

 文件不存在时:创建新文件

 

CreateNew

 文件存在时:抛出异常

 文件不存在时:创建新文件

 

Open

 文件存在时:打开现有文件,流指向文件开头

 文件不存在时:抛出异常

 

OpenOrCreate

 文件存在时:打开文件,流指向文件开头

 文件不存在时:创建新文件

 

Truhncate

 文件存在时:打开现有文件,清除其内容。流指向文件开头,保留文件的初始创建日期。

 文件不存在时:抛出异常

FileStream对象

FileStream对象表示在磁盘或网络路径上指向文件的流。当类提供向文件读写字节的方法时,经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作字节和字节数组,而Stream类操作字符数据。字符数据易于使用,但是有些操作比如随机文件访问,就必须由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个字节。

 

【qieyj】:

读取数据

使用FileStream类读取数据不像使用StreamReader和StreamWriter类读取数据那么容易,这是因为FileStream类只能处理原始字节(raw byey),这使得FileStream类可以用于任何数据文件,而不仅仅是文本文件,通过读取字节数据就可以读取类似图像和声音的文件。这种灵活性的代价是不能使用它直接读入字符串,而使用StreamWriter和StreaMeader类却可以这样处理,从是有几种转换类可以很容易地将字节数组转换为字符数组,或者进行相反的操作。

Read()方法是从FileStream对象所指向的文件访问数据的主要手段:

Public int Read(byte[] array,int offset, int count)//第一个参数是被传输进来的字节数组,用以接受FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置,它通常是0,表示从数组的开端的文件中向数组写数据,最后一个参数是规定从文件中读出多少字节。

写入数据

写入数据的流程是先获取字节数组,再把字节数据转换为字符数组,然后把这个字符数组用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文件,操作类型是

                

                 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;

         }

     }

}

写入文件:

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;

             }

           

         }

     }

}

 

【qieyj】:

◆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对象

 

1.读取文件

输入流用于从外部源读取数据,在很多情况下,数据源可以是磁盘上的文件或网络的某些位置,任何可能发送数据的位置都可以是数据源,比如网络应用程序,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;

         }

     }

}

  

2.分隔文件

读取使用逗号分隔的文件,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;

             }

         }

     }

}

 

在本文介绍的程序中,是把读取的文本文件,用一个richTextBox组件显示出来。要读取文本文件,必须使用到'StreamReader'类,这个类是由名字空间'System.IO'中定义的。通过'StreamReader'类的'ReadLine ( )'方法,就可以读取打开数据流当前行的数据了。下面代码实现的功能就是读取'C:file.txt'并在richTextBox1组件中显示出来:

  FileStream fs = new FileStream ( 'C:\file.txt'  , FileMode.Open , FileAccess.Read ) ;

  StreamReader m_streamReader = new StreamReader ( fs ) ;

  //使用StreamReader类来读取文件

  m_streamReader.BaseStream.Seek ( 0 , SeekOrigin.Begin ) ;

null用法

在不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零。 ORACLE允许任何一种数据类型的字段为空,除了以下两种情况: 1、主键字段(primary key), 2、定义时已经加了NOT NULL限制条件的字段说明: 1、等价于没有任何值、是未知数。 2、NULL与0、空字符串、空格都不同。 3、对空值做加、减、乘、除等运算操作,结果仍为空。 4、NULL的处理使用NVL函数。 5、比较时使用关键字用“is null”和“is not null”。 6、空值不能被索引,所以查询时有些符合条件的数据可能查不出来,   
count(*)中,用nvl(列名,0)处理后再查。 7、排序时比其他数据都大(索引默认是降序排列,小→大),    所以NULL值总是排在最后。通常,只有以下四个函数使用null时可以不为空: SQL> SELECT CONCAT('我1ABC的',NULL) FROM DUAL; CONCAT('我1ABC的',NULL) ----------------------- 我1ABC的 S ...

tostring一般是将对象转换成string型,在.net中,任何对象都有tostring方法,因为任何对象都是从object继承而来,而object就是有tostring 这个方法,一般对是数值类型,tostring就是将数值类型转换成string类型,对于一些引用类型,如dataset等,一般tostring是返回以象的类型名.

tostring方法可重写,重写可以实现你所需要功能.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息