• C# byte及char FileStream 与StreamReader的区别(转)


    1. FileStream是一个较为底层的类,只能简单地读文件到缓存区,而StreamReader封装了一些高级方法如ReadLine()
    2. FileStream可读可写,而StreamReader只能读不能写
    3. FileStream不能指定编码(因为它看到的只是文件的二进制形式,当然无所谓编码),而StreamReader可以指定编码,一旦指定就不允许再更改,因此编码指定是放在它的构造方法里的。默认编码为System.Text.UTF8Encoding,实际上,在StreamReader的构造方法里,它会对文件进行编码检查,当然也可以不让它检查。
    4. 若对是对二进制文件进行操作,最好使用BinaryReader,若要进行写操作,则用StreamWriter,同样StreamWriter也能按指定的编码进行读写
    5. StreamReader的构造方法不一定需要FileStream,只需要文件名即可
    6. StreamReader关闭后,与之相关的FileStream没有关闭,(通过FileStream的CanRead的测试)

    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对象最简单的构造函数如下:

    1        FileStream file = new FileStream(fileName,FileMode.Member);
    2        FileStream file = new FileStream(fileName, FileMode.Member, FileAccess.Member);
    而FileAccess的成员:


     

    成 员

    说 明

    Read

    打开文件,用于只读

    Write

    打开文件,用于只写

    ReadWrite

    打开文件,用于读写

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

    在FileStream构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess. ReadWrite。

    FileMode枚举成员,使用每个值会发生什么,取决于指定的文件名是否表示已有的文件。

    成 员

    文 件 存 在

    文件不存在

    Append

    打开文件,流指向文件的末尾,只能与枚举FileAccess.Write联合使用

    创建一个新文件。只能与枚举FileAccess.Write联合使用

    Create

    删除该文件,然后创建新文件

    创建新文件

    CreateNew

    抛出异常

    创建新文件

    Open

    打开现有的文件,流指向文件的开头

    抛出异常

    OpenOrCreate

    打开文件,流指向文件的开头

    创建新文件

    Truncate

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

    抛出异常


    FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据
    StreamWriter允许将字符和字符串写入文件,它处理底层的转换,向FileStream对象写入数据。StreamReader也类似。

    实例:

      1using System;
      2using System.Data;
      3using System.IO;
      4using System.Text;
      5
      6/// <summary>
      7/// Summary description for FileReadAndWrite
      8/// </summary>

      9public class FileReadAndWrite
     10{
     11    public FileReadAndWrite()
     12    {
     13        //
     14        // TODO: Add constructor logic here
     15        //
     16    }

     17    /// <summary>
     18    /// 用FileStream写文件
     19    /// </summary>
     20    /// <param name="str"></param>
     21    /// <returns></returns>

     22    public void FileStreamWriteFile(string str)
     23    {
     24        byte[] byData;
     25        char[] charData;
     26        try
     27        {
     28            FileStream nFile = new FileStream("love.txt", FileMode.Create);
     29            //获得字符数组
     30            charData = str.ToCharArray();
     31            //初始化字节数组
     32            byData = new byte[charData.Length];
     33            //将字符数组转换为正确的字节格式
     34            Encoder enc = Encoding.UTF8.GetEncoder();
     35            enc.GetBytes(charData, 0, charData.Length,byData,0,true);
     36            nFile.Seek(0, SeekOrigin.Begin);
     37            nFile.Write(byData, 0, byData.Length);
     38        }

     39        catch (Exception ex)
     40        {
     41            throw ex;
     42        }

     43    }

     44    /// <summary>
     45    /// FileStream读取文件
     46    /// </summary>
     47    /// <param name="filePath"></param>
     48    /// <returns></returns>

     49    public string FileStreamReadFile(string filePath)
     50    {
     51        byte[] data = new byte[100];
     52        char[] charData = new char[100];
     53        try
     54        {
     55            FileStream file = new FileStream(filePath, FileMode.Open);
     56            //文件指针指向0位置
     57            file.Seek(0, SeekOrigin.Begin);
     58            //读入两百个字节
     59            file.Read(data, 0200);
     60            //提取字节数组
     61            Decoder dec = Encoding.UTF8.GetDecoder();
     62            dec.GetChars(data, 0, data.Length, charData, 0);
     63        }

     64        catch (Exception ex)
     65        {
     66            throw ex;
     67        }

     68        return Convert.ToString(charData);
     69    }

     70    /// <summary>
     71    /// StreamWriter写文件
     72    /// </summary>

     73    public void StreamWriterWriteFile()
     74    {
     75        try
     76        {
     77            FileStream nFile = new FileStream("love.txt", FileMode.CreateNew);
     78            StreamWriter writer = new StreamWriter(nFile);
     79
     80            writer.WriteLine("I love You!");
     81            writer.WriteLine("Do you love me!");
     82            writer.Close();
     83        }

     84        catch
     85        { }
     86    }

     87    /// <summary>
     88    /// StreamReader读取文件
     89    /// </summary>
     90    /// <returns></returns>

     91    public string StreamReaderReadFile()
     92    {
     93        string str="";
     94        try
     95        {
     96            FileStream file = new FileStream("love.txt", FileMode.Open);
     97            StreamReader sr = new StreamReader(file);
     98            while (sr.ReadLine()!=null)
     99            {
    100                str += sr.ReadLine();
    101            }

    102            //或者str = sr.ReadToEnd();
    103            sr.Close();
    104        }

    105        catch
    106        { }
    107        return str;
    108    }

    109}

    110
  • 相关阅读:
    第四十一篇-android studio 关闭自动保存功能
    《深入理解mybatis原理》 Mybatis初始化机制详解
    Java多线程系列--“基础篇”10之 线程优先级和守护线程
    Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
    Java多线程系列--“基础篇”08之 join()
    Java多线程系列--“基础篇”07之 线程休眠
    Java多线程系列--“基础篇”06之 线程让步
    Java多线程系列--“基础篇”05之 线程等待与唤醒
    【深入Java虚拟机】之八:Java垃圾收集机制
    【深入Java虚拟机】之七:Javac编译与JIT编译
  • 原文地址:https://www.cnblogs.com/shined/p/2141366.html
Copyright © 2020-2023  润新知