本篇可能不是非常深入,但是胜在清晰明了
 
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. 6.DataFrame(列运算)

    from odps import ODPS from odps.df import DataFrame o = ODPS(access_id="LTAIBb3aOF3ghjek", ...

  2. appium+python自动化26-模拟手势点击坐标(tap)【转载】

    ​# 前言:有时候定位元素的时候,你使出了十八班武艺还是定位不到,怎么办呢?(面试经常会问)那就拿出绝招:点元素所在位置的坐标 tap用法 1.tap是模拟手指点击,一般页面上元素的语法有两个参数,第 ...

  3. 解决:laravel出现Please provide a valid cache path.

    SVN检出版本库上的项目后,访问首页出现如下提示: Please provide a valid cache path. 解决方法如下: 1.确保storage目录下有如app,framework,v ...

  4. Peak

    A sequence of \(n\) integers \(a_1, a_2, \dots, a_n\) is called a peak, if and only if there exists ...

  5. Moving Average from Data Stream -- LeetCode

    Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...

  6. Java Socket编程详细解说

    Java Socket编程 JavaSocketServerSocket乱码超时 Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是So ...

  7. Android入门之文件系统操作(一)简单的文件浏览器 (转)

    Android入门之文件系统操作(一)简单的文件浏览器 (转)        import java.io.File; import java.util.*; import android.app.A ...

  8. 5.Android之NFC介绍

    NFC简介: Near Field Communication 近场通信,是一种数据传输技术. 与wifi.蓝牙.红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4cm. NFC支持3种工作 ...

  9. centos iptables关于ping

    配置iptables策略后,一般来说INPUT都是DROP然后配置需要通过的 当执行: iptables -P INPUT DROP 后,机器就不能被ping通了! 因为icmp没有添加到规则中! 于 ...

  10. c#异步线程:同步调用,异步调用,异步回调

    定义一个异步线程类: public class AsyEventClass { private static ILog logger = LogManager.GetLogger(MethodBase ...