Stream 是所有流的抽象基类。流是字节序列的抽象概念。

流涉及到的3个基本操作:

  读取流,读取是指从流到数据结构(如字节数组)的数据传输。

  写入流,写入是指从数据结构到流的数据传输。

  流查找,查找是对流内的当前位置进行的查询和修改。

常用的Stream的子类有:

  1) MemoryStream 存储在内存中的字节流

  2) FileStream  存储在文件系统的字节流

  3) NetworkStream 通过网络设备读写的字节流

  4) BufferedStream 为其他流提供缓冲的流

文件流FileStream类

  FileStream类继承自Stream类,一个FileStream实例,代表一个文件流,用于对磁盘文件进行读取、写入、打开、关闭等操作。.net提供了多种获取FileStream对象的方法,其中构造函数就有十余种,下面我们来看一下典型的构造函数及其参数的解释:

public FileStream(string path, FileMode mode, FileAccess access);

参数说明:

  1)path:指明文件所在的路径信息;
  2)mode:FileMode的枚举值,表示文件打开或创建的方式,含义如下:
      CreateNew:指定操作系统应创建新文件,如果文件已经存在,则引发IOException;
      Create:指定操作系统应创建新文件,如果文件已经存在,它将被覆盖;
      Open:指定操作系统应打开现有文件,如果文件不存在,则引发FileNotFoundException;

      OpenOrCreate:指定操作系统应打开文件,如果文件不存在,则创建新文件;

      Truncate:指定操作系统应打开现有文件,文件一旦打开,就将截断为零字节大小;
      Append:打开先有文件并把Position设置至文件尾,如果文件不存在将创建新文件。Append只能同FileAccess.Write一起使用;
  3)access是FileAccess的枚举值,它控制对文件的访问权限,含义如下:

      Read:打开文件用于只读;
      Write:打开文件用于只写;
      ReadWrite:打开文件,用于读写;

  除了FileStream类本身提供的构造函数外,System.IO命名空间下的File和FileInfo类也提供了创建FileStream对象的方法。其中OpenRead方法返回只读文件流,OpenWrite方法返回只写文件流。如:

FileStream fs=File.OpenRead(@"c:\file.txt");

FileStream的读写方法签名:

public override int Read(
byte[] array,    //内存缓冲区,储存从文件流中读取的数据
int offset,     //偏移量,array开始写入数据的下标值
int count      //从文件流中读取的字节大小
); public override void Write(
byte[] array,  //内存缓冲区,存储了要写入流的字节数据
int offset,   // 从array的下标值开始取数据
int count    //要写入的字节数
);

使用示例:

try
{
  //写入
  FileStream fileStream = new FileStream(@"d:\test.txt", FileMode.OpenOrCreate);
  byte[] content = Encoding.UTF8.GetBytes("我爱我家");
  fileStream.Write(content, , content.Length);
  fileStream.Position = ; //设置当前位置
  content = Encoding.UTF8.GetBytes("我爱你家");   fileStream.Write(content, , content.Length);
  fileStream.Close();   //读取
  fileStream = new FileStream(@"d:\test.txt", FileMode.Open);
  content = new byte[fileStream.Length];
  fileStream.Read(content, , content.Length);
  Console.WriteLine(Encoding.UTF8.GetString(content));
}
catch (Exception ex)
{
  Console.WriteLine(ex.Message);
}

内存流 MemoryStream

  和文件流不同,MemoryStream类表示的是保存在内存中的数据流,由内存流封装的数据可以在内存中直接访问。内存一般用于暂时缓存数据以降低应用程序对临时缓冲区和临时文件的需要。

  既然字节数据也在内存中存储,为什么还要引入内存流的概念呢?这是因为内存流和字节数组虽然都位于程序缓冲区,但是具有不同特性。内存流相对于字节数组而言,具有流特有的特性,并且容量可自动增长,在数据加密以及对长度不定的数据进行缓存等场合,使用内存流比较方便。

MemoryStream有多种构造函数,部分举例如下:

  • public MemoryStream();该构造函数初始分配的容量大小为0,随着数据的不断写入,其容量可以不断地自动扩展。
  • public MemoryStream(byte[] buffer);根据字节数组buffer初始化,实例的容量大小规定为字节数组的长度。
  • public MemoryStream(int capacity);容量固定为capacity。

MemoryStream实例

MemoryStream mem = new MemoryStream();
Console.WriteLine("初始分配的容量:"+mem.Capacity+" 初始使用量:"+mem.Length);
byte[] content = Encoding.UTF8.GetBytes("我爱我家");
mem.Write(content, 0, content.Length);
Console.WriteLine("初始分配的容量:" + mem.Capacity + " 初始使用量:" + mem.Length);

网络流NetWorkStream

  网络流的意思是数据在网络的各个位置之间是以连续的字节形式传输的,NetWorkStream只能用于面向连接的套接字。

对于NetWorkStream流,写入操作是指从来源端内存缓冲区到网络上的数据传输;读取操作是从网络上到接收端内存缓冲区的数据传输。

如需对NetWorkStream深入了解,请查阅相关资料。

参考:

  http://www.cnblogs.com/gavin-num1/p/5190312.html

其它相关:

1)从文件读取文本

通过使用 ReadAllLines 或 ReadAllText 方法也可以实现此功能。

using System;
using System.IO;
public class TextFromFile
{
private const string FILE_NAME = "MyFile.txt";
public static void Main(String[] args)
{
if (!File.Exists(FILE_NAME))
{
Console.WriteLine("{0} does not exist.", FILE_NAME);
return;
}
using (StreamReader sr = File.OpenText(FILE_NAME))
{
String input;
while ((input=sr.ReadLine())!=null)
{
Console.WriteLine(input);
}
Console.WriteLine ("The end of the stream has been reached.");
sr.Close();
}
}

.net System.IO.Stream 流操作类(FileStream等)的更多相关文章

  1. stream流操作List工具类

    工作中操作List对于程序猿来说是"基本操作",为了更加便利,对JDK8的新特性stream流进行二次封装.话不多说,直接上代码 package com.mydemo; impor ...

  2. 还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下

    Java 8 新特性系列文章索引. Jdk14都要出了,还不能使用 Optional优雅的处理空指针? Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下? 还看不懂同事的代码?Lambda ...

  3. 超强的Lambda Stream流操作

    原文:https://www.cnblogs.com/niumoo/p/11880172.html 在使用 Stream 流操作之前你应该先了解 Lambda 相关知识,如果还不了解,可以参考之前文章 ...

  4. java 8 Stream中操作类型和peek的使用

    目录 简介 中间操作和终止操作 peek 结论 java 8 Stream中操作类型和peek的使用 简介 java 8 stream作为流式操作有两种操作类型,中间操作和终止操作.这两种有什么区别呢 ...

  5. 全面吃透JAVA Stream流操作,让代码更加的优雅

    全面吃透JAVA Stream流操作,让代码更加的优雅 在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行 ...

  6. Stream 流操作

     Stream 类 先看下面的图 Stream 是所有流的抽象基类(不能被实例化,需要使用他的派生类FileStream/MemoryStream/BufferedStream).流是字节序列的抽象概 ...

  7. lamda表达式与Stream 流操作,reduce,flatMap,groupingBy等

    /** * 符合lambda表达式的接口也叫函数式接口: * 除了默认方法和Object类的方法外,只有一个抽象方法的接口才能符合lambda表达式的要求 * 可以使用@FunctionalInter ...

  8. C# System.IO 文件流输入输出

    一.读写文本文件 可以用fileStream来读写文本文件,但是FileStream是通过字节形式来读写数据的,要把字节数据转换为文本,要自己处理编码转换. 对于文本文件的读写,通常用 StreamR ...

  9. System.IO.Path文件路径类

    Path类的静态属性和方法,此类操作不影响物料文件. 属性 char a = System.IO.Path.VolumeSeparatorChar;//: char b = System.IO.Pat ...

随机推荐

  1. Git 工作流之 GitFlow

    GitFlow学习: 先学习这篇:点击打开链接 Gitflow工作流是经典模型,体现了工作流的经验和精髓.随着项目过程复杂化,会感受到这个工作流中深思熟虑和威力. ////////////////// ...

  2. OpenGL入门学习--超级好的资料

    近几天,由于工作项目需要利用openGL显示STL格式的三维模型,分享下面的BOOK,这个老外写得真是TMD太好了,资料免费! http://www.glprogramming.com/red/ind ...

  3. 手写简化版SpringBoot

    Springboot项目全部依赖注解的,web工程是如何启动的 1 首先引入了Tomcat依赖,然后用java代码启动Tomcat容器,默认Tomcat版本是8.5版本 2 Tomcat是实现了ser ...

  4. flask框架(五)——支持正则写法、模板用法、请求响应、session

    如果用正则的话,我们要用自定义的路由. 1导入from werkzeug.routing import BaseConverter 2我先要写一个类,然后继承BaseConverter,然后实现__i ...

  5. XGBoost对波士顿房价进行预测

    import numpy as np import matplotlib as mpl mpl.rcParams["font.sans-serif"] = ["SimHe ...

  6. xorm -Get方法实例

    查询单条数据使用Get方法,在调用Get方法时需要传入一个对应结构体的指针,同时结构体中的非空field自动成为查询的条件和前面的方法条件组合在一起查询 package main import ( & ...

  7. U盘改造计划之PE、kali、U盘三合一

    最强U盘攻略之一 前一段时间朋友买电脑问了我一些问题,我突然发现U盘怎么这么便宜,128G金士顿,140?!!!我16年买的可是240啊.买贵一百块,我好方啊.但是我的U盘,我是不会屈服做一个普通的U ...

  8. Ubuntu18.04防火墙相关

    Ubuntu 18.04 LTS 系统中已经默认附带了 UFW 工具,如果您的系统中没有安装,可以在「终端」中执行如下命令进行安装: sudo apt install ufw 检查UFW状态 sudo ...

  9. php-sql-server-2017

    Download the Microsoft Drivers for PHP for SQL Server https://docs.microsoft.com/en-us/sql/connect/p ...

  10. vue 解决ios编辑器输入框不能拉起

    一.问题描述:Android .pc.下可以正常使用,在ios下可以拉起输入框但是无法输入 <div contenteditable="true" ></div& ...