1、什么是FileStream类

  FileStream 类对文件系统上的文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream 对输入输出进行缓冲,从而提高性能。——MSDN

  简单点说:FileStream类可以对任意类型的文件进行读取操作,而且我们也可以根据自己需要来指定每一次读取字节长度,以此减少内存的消耗,提高读取效率。

2、File和FileStream的区别

  直观点:File是一个静态类;FileStream是一个非静态类。

  File:是一个文件的类,对文件进行操作。其内部封装了对文件的各种操作(MSDN:提供用于创建、复制、删除、移动和打开单一文件的静态方法,并协助创建FileStream对象)。

  FileStream:文件流的类。对txt,xml,avi等文件进行内容写入、读取、复制...时候需要使用的一个工具。

  打个形象的比喻。File是笔记本,需要Filestream的这个笔才能写.

  换而言之,记事本是一个文件,可以用File操作,里面的内容需要用FileStream来操作。

 最常用的流类如下:
FileStream: 文件流,可以读写二进制文件。
StreamReader: 流读取器,使其以一种特定的编码从字节流中读取字符。
StreamWriter: 流写入器,使其以一种特定的编码向流中写入字符。
BufferedStream: 缓冲流,给另一流上的读写操作添加一个缓冲层。
  //
// 摘要:
// 从流中读取字节块并将该数据写入给定缓冲区中。
//
// 参数:
// array:
// 此方法返回时包含指定的字节数组,数组中 offset 和 (offset + count - 1) 之间的值由从当前源中读取的字节替换。
//
// offset:
// array 中的字节偏移量,将在此处放置读取的字节。
//
// count:
// 最多读取的字节数。
//
// 返回结果:
// 读入缓冲区中的总字节数。 如果字节数当前不可用,则总字节数可能小于所请求的字节数;如果已到达流结尾,则为零。
//
// 异常:
// T:System.ArgumentNullException:
// array 为 null。
//
// T:System.ArgumentOutOfRangeException:
// offset 或 count 为负数。
//
// T:System.NotSupportedException:
// 流不支持读取。
//
// T:System.IO.IOException:
// 出现 I/O 错误。
//
// T:System.ArgumentException:
// offset 和 count 描述 array 中的无效范围。
//
// T:System.ObjectDisposedException:
// 在流关闭后调用方法。
[SecuritySafeCritical]
public override int Read(byte[] array, int offset, int count); //
// 摘要:
// 将字节块写入文件流。
//
// 参数:
// array:
// 包含要写入该流的数据的缓冲区。
//
// offset:
// array 中的从零开始的字节偏移量,从此处开始将字节复制到该流。
//
// count:
// 最多写入的字节数。
//
// 异常:
// T:System.ArgumentNullException:
// array 为 null。
//
// T:System.ArgumentException:
// offset 和 count 描述 array 中的无效范围。
//
// T:System.ArgumentOutOfRangeException:
// offset 或 count 为负数。
//
// T:System.IO.IOException:
// 出现 I/O 错误。 - 或 - 另一个线程可能导致操作系统的文件句柄的位置发生意外更改。
//
// T:System.ObjectDisposedException:
// 流已关闭。
//
// T:System.NotSupportedException:
// 当前的流实例不支持写入。
[SecuritySafeCritical]
public override void Write(byte[] array, int offset, int count);

注:FileStream是对字节操作的(任何文件)。

//非静态类,创建对象调用方法
using (FileStream Fsread = new FileStream(@"C:\Users\Administrator\Desktop\测试文档.txt", FileMode.OpenOrCreate, FileAccess.Read))
{
byte[] b = new byte[50];
//用来限定每次的读取字节数,也可以byte[] b=new byte[Fsread.Length];
string s = "";
while (true)
{
int r = Fsread.Read(b, 0, b.Length);
if (r == 0)
break;
s += Encoding.UTF8.GetString(b, 0, r); }
Console.Write(s);
// Fsread.Close();//关闭当前流
// Fsread.Dispose();//释放流所使用的资源
}

  

//文件流的写入
using (FileStream fswrite = new FileStream(@"C:\Users\Administrator\Desktop\测试文档.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
string str = "一切皆有可能";
byte[] buffer = Encoding.UTF8.GetBytes(str);
fswrite.Write(buffer, 0, buffer.Length);
}

  从网络上下载音频然后写入F盘

var url = "https://qutifen-qudao.oss-cn-beijing.aliyuncs.com/mfg/audio/v3/1/abacus_en.ogg";
var arrs = url.Split('/');
WebRequest request = WebRequest.Create(url);
WebResponse response = request.GetResponse(); // //返回对Internet请求的响应
Stream responseStream = response.GetResponseStream();//从网络资源中返回数据流
using (FileStream fsWrite = new FileStream($"F:/Audio/v5/{arrs[arrs.Length - 1]}", FileMode.OpenOrCreate, FileAccess.Write)) { 

byte[] buffer = new byte[response.ContentLength]; 

var bf = buffer.Length;    //bf=14372
while (true)
{
////返回本次实际读取到的字节数 从responseStream流中读取字节块并将该数据写入给定缓冲区中 int r = responseStream.Read(buffer, , buffer.Length); //r=936 if (r == )
{
break;
}
fsWrite.Write(buffer, , r);///将字节块写入fsWrite文件流。r如果换成bf,则写入的文件不能进行读取是损坏的 }
}

无论是读还是写,都要借助一个缓冲区buffer来存取字节。

注意:在写入和读取时,字符编码格式要相同,不然会出现乱码。

 Encoding.UTF8.GetBytes(str);
 Encoding.UTF8.GetString(b, 0, r);

//读文件

public static string ReadFile()
{

string basePath = System.AppDomain.CurrentDomain.BaseDirectory;
string strTempDir = string.Format("{0}", DateTime.Now.ToString("yyyyMMdd"));
string path3 = Path.Combine(basePath, strTempDir);
FileStream fs = new FileStream(path3, FileMode.Open);
StreamReader sr = new StreamReader(fs,Encoding.UTF8);
string line = sr.ReadLine();//直接读取一行
sr.Close();
fs.Close();
return line;
}

public static string ReadFile(string sUrl)
{

StringBuilder builder = new StringBuilder();
using (FileStream fs = File.Open(sUrl, FileMode.OpenOrCreate))
{
using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
{
builder.Append(sr.ReadToEnd());
}
}
return builder.ToString();
}

//写文件

public static void WriteFile()
{

string basePath = System.AppDomain.CurrentDomain.BaseDirectory;
string strTempDir = string.Format("{0}", DateTime.Now.ToString("yyyyMMdd"));
string path3 = Path.Combine(basePath, strTempDir);
FileStream fs = new FileStream(path3, FileMode.Append);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("hello world");
sw.Close();
fs.Close();//这里要注意fs一定要在sw后面关闭,否则会抛异常
}

FileStream类的使用(文件流)的更多相关文章

  1. asp.net中用FileStream类实现下载文件功能,自定义下载路径,像IE下载一样

    方法一: //这个值可以从配置文件读取,或者放个textbox让用户填 string path = "你的路径";FileStream outputStream = new Fil ...

  2. 文件流FileStram类

    本节课主要学习三个内容: 创建FileStram流 读取流 写入流 文件流FileStram类,是用来实现对文件的读取和写入.FileStram是操作字节的字节数组,当提供向文件读取和写入字节的方法时 ...

  3. C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

    迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器 ...

  4. .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化

    1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...

  5. 文件读写(三)利用FileStream类操作字节数组byte[]、BinaryFormatter、内存流MemoryStream

    一.Stream类概述 在.NET Framework中,文件和流是有区别的.文件是存储在磁盘上的数据集,它具有名称和相应的路径.当打开一个文件并对其进行读/写时,该文件就称为流(stream).但是 ...

  6. 02-大文件Copy(FileStream文件流类)

    static void Main(string[] args) { string source = @"e:\1.exe";//要移动文件的路径 大文件 string target ...

  7. c#Filestream类(文件流)

    0.创建文件流几种方法: File.Open("a.txt",FileMode.Create,FileAccess.ReadWrite); File.OpenWrite(" ...

  8. C# Path类 FileStream(文件流) 与 File(文件) 读取的区别

    1.采用文件流读取数据是一点一点从文件中读取数据对内存的压力相对较小;而采用文件读取数据是一下全部读取过来对内存造成的压力相对较大 2.File读取: string str = @"E:\Q ...

  9. 【基础巩固】文件流读写、大文件移动 FileStream StreamWriter File Path Directory/ ,m资料管理器(递归)

    C#获取文件名 扩展名 string fullPath = @"d:\test\default.avi"; string filename = Path.GetFileName(f ...

随机推荐

  1. easyui datagrid sort 表头 排序

    datagrid的点击列表头刷新,分为两种,一种是页面刷新,不涉及后台服务器数据,不会从新查询数据库,只会刷新当前页数据: 一种是服务器级刷新,会重新加载全部数据. 如果不需要自定义排序,可以直接使用 ...

  2. C#跨线程操作UI

    WPF启动调度器 : Dispatcher.Invoke(new Action(() => { //你的代码 }));

  3. dD Geometry Kernel ( Geometry Kernels) CGAL 4.13 -User Manual

    1 Introduction This part of the reference manual covers the higher-dimensional kernel. The kernel co ...

  4. LinkedBlockingQueue源码解析(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.对于LinkedBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2 ...

  5. 接口interface和抽象类型abstract

    一.接口 接口不能被实例化 接口只能包含方法声明 接口的成员包括方法.属性.索引器.事件 接口中不能包含常量.字段(域).构造函数.析构函数.静态成员 接口中的所有成员默认为public,因此接口中不 ...

  6. 程序媛计划——python爬虫

    #用selenium打开百度首页 #第一次运行代码时应该在safari开发者选项中设置'allow remote automation' from selenium import webdriver ...

  7. Android------------UI的控件学习内容

    1. android:gravity="fill_horizontal"  :  文本在显示框中内容显示的位置 2.ToggleButton :  切换按钮 3.RadioGrou ...

  8. 字符串(tjoi2016,heoi2016,bzoj4556)(sam(后缀自动机)+线段树合并+倍增+二分答案)

    佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为\(n\)的字符串\(s\),和\(m\)个问题.佳媛姐姐必须正确回答这\(m\)个问题, ...

  9. C/C++ 语言 Hello world

    #include <stdio.h> void main() { int x,i; ; scanf("%d",&x); if(x>y) printf(&q ...

  10. easyUI取消选中的所有行

    在datagrid选择选中行进行展示后,再返回这个datagrid重新加载数据, 原来选中的数据还是保持选中状态.执行以下的方法还是如此,如图. $("#Table").datag ...