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. C#在dataGridView中遍历,寻找相同的数据并定位

      1. C#在dataGridView中遍历,寻找相同的数据并定位   [c-sharp] view plain copy int row = dataGridView1.Rows.Count;// ...

  2. pgAdmin4 汉化

  3. ASP.net MVC4/MVC5 错误处理及设置

    很无聊的记录下.首先IIS 7以上的版本测试才成功 首先 //全局ErrorHandler public static void RegisterGlobalFilters(GlobalFilterC ...

  4. 从B站、爱奇艺、映客的IPO上市,看国内视频公司的内容审核现状

    本文由  网易云发布. 3月30日,中央电视台<经济半小时>栏目讲述了网络上的一个顽症——色情内容.在这期主题为<互联网上的“色诱”>的节目中,央视的记者揭示了色情直播的猖獗. ...

  5. SSM文件上传

    **自己对于SSM文件上传的一些心得** 刚开始的时候也是在网上寻找一些简单的案例,可能我的这篇文章不是最好的,但是这些都是我自己慢慢的摸索以及自己的尝试的一些心得,希望对各位有所帮助. 其实文件的上 ...

  6. C++ const 和static的总结以及使用

    一  static的使用 (作用域和存储方式) 1.作用域---------->隐藏 静态函数跟静态全局变量的作用类似 (静态函数不能被其它文件所用: 其它文件中可以定义相同名字的函数,不会发生 ...

  7. rawt

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  8. linux下tomcat运行war包常用命令

    一.先是war包copy到 linux 的相关目录,我这的是/opt/soft/tomcat_ecp/webapps. 如果是老项目,在导入war的之前,习惯上是把之前的war备份一下, 如 mv p ...

  9. 最常用的15大Eclipse开发快捷键技巧

    1.alt+?或alt+/:自动补全代码或者提示代码 这个是我最得意的快捷键组合了,尤其是当输入syso几个字符之后,2个手指轻松按下这2个键的时候,自动就补全System.out.println() ...

  10. 手机端API接口验证及参数签名验证

    问题背景: 后端服务对手机APP端开放API,没有基本的校验就是裸奔,别人抓取接口后容易恶意请求,不要求严格的做的安全,但是简单的基础安全屏障是要建立的,再配合HTTPS使用,这样使后端服务尽可能的安 ...