FileStream StreamReader StreamWriter 对文件的操作对比

1.FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法,但经常使用StreamReader或 StreamWriter执行这些功能。这是因为FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据。这是这两种类的一个重要区别,如果你是准备读取byte数据的话,用StreamReader读取然后用 System.Text.Encoding.Default.GetBytes转化的话,如下,则可能出现数据丢失的情况,如byte数据的个数不对等。因此操作byte数据时要用FileStream。
     string textContent = fileStream.ReadToEnd();byte[] bytes = System.Text.Encoding.Default.GetBytes(textContent);
字符数据易于使用, 但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行.
其中创建FileStream对象最简单的构造函数如下:
     FileStream file = new FileStream(fileName,FileMode.Member);
     FileStream file = new FileStream(fileName, FileMode.Member, FileAccess.Member);

FileAccess成员:默认值FileAccess. ReadWrite。

image

对文件进行超出FileAccess枚举成员指定的操作会导致抛出异常。此属性的作用是,基于用户的身份验证级别改变用户对文件的访问权限。

FileMode成员:

image

读取文件的位置用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个字节。

 

2.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());
             }
         }
     }
}

 

3.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;
             }
         }
     }
}

4.FileStream

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

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;
         }
     }
}

4.写入文件:

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;
             }
           
         }
     }
}

转载于:https://www.cnblogs.com/xiaoyaozhe/archive/2011/11/11/2245387.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值