本篇可能不是非常深入,但是胜在清晰明了
 
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的成员:

成 员

说 明

Read

打开文件,用于只读

Write

打开文件,用于只写

ReadWrite

打开文件,用于读写

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

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

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

成 员

文 件 存 在

文件不存在

Append

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

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

Create

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

创建新文件

CreateNew

抛出异常

创建新文件

Open

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

抛出异常

OpenOrCreate

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

创建新文件

Truncate

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

抛出异常

FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据
StreamWriter允许将字符和字符串写入文件,它处理底层的转换,向FileStream对象写入数据。StreamReader也类似。
实例:
  using System;
  using System.Data;
  using System.IO;
  using System.Text;

/// Summary description for FileReadAndWrite
  public class FileReadAndWrite
 {
     public FileReadAndWrite()
     {
         // TODO: Add constructor logic here
     }
     /// 用FileStream写文件
     public void FileStreamWriteFile(string str)
     {
         byte[] byData;
         char[] charData;
         try
         {
             FileStream nFile = new FileStream("love.txt", FileMode.Create);
             //获得字符数组
             charData = str.ToCharArray();
             //初始化字节数组
             byData = new byte[charData.Length];
             //将字符数组转换为正确的字节格式
             Encoder enc = Encoding.UTF8.GetEncoder();
             enc.GetBytes(charData, 0, charData.Length,byData,0,true);
             nFile.Seek(0, SeekOrigin.Begin);
             nFile.Write(byData, 0, byData.Length);
         }
         catch (Exception ex)
         {
             throw ex;
         }
     }
     /// FileStream读取文件
     public string FileStreamReadFile(string filePath)
     {
         byte[] data = new byte[100];
         char[] charData = new char[100];
         try
         {
             FileStream file = new FileStream(filePath, FileMode.Open);
             //文件指针指向0位置
             file.Seek(0, SeekOrigin.Begin);
             //读入两百个字节
             file.Read(data, 0, 200);
             //提取字节数组
             Decoder dec = Encoding.UTF8.GetDecoder();
             dec.GetChars(data, 0, data.Length, charData, 0);
         }
         catch (Exception ex)
         {
             throw ex;
         }
         return Convert.ToString(charData);
     }
     /// StreamWriter写文件
     public void StreamWriterWriteFile()
     {
         try
         {
             FileStream nFile = new FileStream("love.txt", FileMode.CreateNew);
             StreamWriter writer = new StreamWriter(nFile);
 
             writer.WriteLine("I love You!");
             writer.WriteLine("Do you love me!");
             writer.Close();
         }
         catch
         { }
     }
     /// StreamReader读取文件
     public string StreamReaderReadFile()
     {
         string str="";
         try
         {
             FileStream file = new FileStream("love.txt", FileMode.Open);
             StreamReader sr = new StreamReader(file);
             while (sr.ReadLine()!=null)
             {
                str += sr.ReadLine();
            }
            //或者str = sr.ReadToEnd();
            sr.Close();
        }
        catch
        { }
        return str;
    }
}

C#中FileStream和StreamWriter/StreamReader的区别的更多相关文章

  1. C#文件与流(FileStream、StreamWriter 、StreamReader 、File、FileInfo、Directory、directoryInfo、Path、Encoding)

    (FileStream.StreamWriter .StreamReader .File.FileInfo.Directory.DirectoryInfo.Path.Encoding)     C#文 ...

  2. FileStream StreamWriter StreamReader BinaryReader

    FileStream vs/differences StreamWriter? http://stackoverflow.com/questions/4963667/filestream-vs-dif ...

  3. C#中FileStream的对比以及使用方法

    场景 File与FileStream的区别 举例: 将读取文件比作是从A桶往B桶运水. 使用File就是整个用桶倒进去,使用FileStream就是使用水管慢慢输送. FileStream与Strea ...

  4. File、FileStream、StreamWriter、StringWriter文件使用总结

    一.File 1.File为静态类 File类,是一个静态类,支持对文件的基本操作,包括创建,拷贝,移动,删除和打开一个文件.File类方法的参量很多时候都是路径path.主要提供有关文件的各种操作, ...

  5. JDBC中的Statement和PreparedStatement的区别

    JDBC中的Statement和PreparedStatement的区别  

  6. LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别

    LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别 在写LINQ语句的时候,往往会看到.AsEnumerable() 和 .AsQueryable() .例如: s ...

  7. JavaScript中const、var和let区别浅析

    在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...

  8. 【前端】js中new和Object.create()的区别

    js中new和Object.create()的区别 var Parent = function (id) { this.id = id this.classname = 'Parent' } Pare ...

  9. SQL Server中Text和varchar(max)数据类型区别

    SQL Server中Text和varchar(max)数据类型区别   以前只知道text和image是可能被SQL Server淘汰的数据类型,但具体原因不太清楚,今天读书的时候发现了text与v ...

随机推荐

  1. mybatis的模糊查询格式

    mybatis的模糊查询格式: <select id="xxx" parameterType="com.model.xxx" resultMap=&quo ...

  2. 删除 Myeclipse 遗留的 workspace

    有时因需要而创建多个 workspace 并在它们之间切换,但是如果某些 workspace 内容被物理删除(不再需要)后,当你点击 File --> Switch Workspace 时,旧的 ...

  3. Hmailserver搭建邮件服务器

    Hmailserver安装很简单不需要多说,自己去百度 Hmailserver配置: 输入安装时设置的密码登录Hmailserver 添加域名,如:域名是:mail.abc.com这里添加的时候应该填 ...

  4. eclipse CreateProcess error=87

    http://blog.csdn.net/mylove709834360/article/details/9253697 完美解决~

  5. ASP.NET增加微信公众号功能

    最近微信的公众号使用的挺多的.我们也弄了个,现在有个需求就是在用户点击菜单的时候,获取用户的OPENID,然后作为后续使用. 首先记录下步骤, 安装必要的dll引用 install-package s ...

  6. Netty源码学习(六)ChannelPipeline

    0. ChannelPipeline简介 ChannelPipeline = Channel + Pipeline,也就是说首先它与Channel绑定,然后它是起到类似于管道的作用:字节流在Chann ...

  7. React+React Router+React-Transition-Group实现页面左右滑动+滚动位置记忆

    2018年12月17日更新: 修复在qq浏览器下执行pop跳转时页面错位问题 本文的代码已封装为npm包发布:react-slide-animation-router 在React Router中,想 ...

  8. 51nod 1086 背包问题 V2 【二进制/多重背包】

    1086 背包问题 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放 ...

  9. 求int最大值以及int二进制

    求int最大值:(((unsigned int)(~0))>>1) 求int的2进制串 string str = ""; int iNum = 100; for(int ...

  10. Linux下进行Web服务器压力(并发)测试工具http_load、webbench、ab、Siege、autobench简单使用教程(转)

    一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工 具,它可以以一个单一的进程运行,一般 ...