流Stream
System.IO 提供了一个抽象类Stream , Stream类 支持对字节的读写操作。
所谓的“流”,指的是Stream,也就是所谓的一个文件区。
这个文件区中存储着的信息可以是在内存中,也可以是在硬盘中。流中的数据均以byte型数组去存储。 BufferedStream不是有缓冲区,而是本身就是缓冲区,可以用它来暂时存储其它流中的内容,然后flush进入相应的流。 至于StreamReader、StreamWriter、BinaryReader和BinaryWriter,他们都是流操作器,这些都是为了方便用户往流里写数据用的。
StreamReader是标准流读取器,StreamWriter是标准流写入器,BinaryReader是二进制流读取器,BinaryWriter是二进制流写入器。
标准流指的是文本文件,而二进制流指的就是二进制文件。 MemoryStream的构造函数完全可以什么都不填。当留空的时候则会产生一个空白的内存流,然后可以通过流操作器向里面写入数据。
总的来说MemoryStream还算是常用,不过得看你用来干什么。
如果只是单纯的文件操作,有用的只有FileStream。 流包含以下基本操作:
读操作(Reading)。读出流中的数据,把数据存放在另一种数据结构中,比如数组。
写操作(Writting)。即从另一种数据结构中读出数据,存放至流对象中。
搜索操作(Seeking)。即从流中的当前位置开始搜索,定位到指定的位置。
由于数据类型的不同,一些流可能不同时支持以上的所有操作。比如网络流就不支持搜索操作。Stream类提供了CanRead,CanWrite和CanSeek三种属
性,来表示流是否支持这些操作。
BinaryReader和BinaryWriter
BinaryReader和BinaryWriter这两个类提供了从字符串或原始数据到各种流之间的读写操作。
File和Directory
File类支持对文件的基本操作,包括创建、拷贝、移动、删除和打开一个文件。
Directory类则用于执行常见的各种目录操作,如创建、移动、浏览目录及其子目录。
File类和Directory类的基类都是抽象类FileSystemEntry。
TextReader和TextWriter
TextReader和TextWriter类都是抽象类。和Stream类的字节形式的输入和输出不同,它们用于Unicode字符的输入和输出。
StringReader和StringWriter
StringReader和StringWriter在字符串中读写字符。
StreamReader和StreamWriter
StreamReader和StreamWriter在流中读写字符。
BufferedStream
BufferedStream是为网络流添加缓冲的一种流类型,利用缓冲可以避免操作系统频繁地到磁盘上读取数据,从而减轻了操作系统的负担。
MemoryStream
MemoryStream是一个无缓冲流,它所封装的数据直接放在内存中,因此可以用于快速临时存储、进程间传递信息等。
NetworkSteam
Networksteam表示在互联网络上传递的流。
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks; namespace stream
{
class Program
{
static void Main(string[] args)
{
byte[] buffer = null; string testString = "Stream!Hello World!";
char[] ReadCharArray = null;
byte[] ReadBuffer = null;
string readString = string.Empty; using (MemoryStream stream = new MemoryStream())
{
Console.WriteLine("初始化字符串为:{0}", testString); if (stream.CanWrite)//如果该流可写
{
//将testString写入流中 buffer = Encoding.Default.GetBytes(testString);//从该数组的第一个位置开始写,长度为3
stream.Write(buffer, , );
Console.WriteLine("现在Stream.Position在第{0}位置", stream.Position + );
Console.WriteLine("现在Stream的长度是{0}", stream.Length); long newPositionStream = stream.CanSeek ? stream.Seek(, SeekOrigin.Current) : ;//从刚才结束的位置(当前位置)往后移3位,到第7位 Console.WriteLine("重新定位后Stream.Position再{0}位置", stream.Position + );
Console.WriteLine("现在Stream的长度是{0}", stream.Length); if (newPositionStream < buffer.Length)
{
stream.Write(buffer, (int)newPositionStream, buffer.Length - (int)newPositionStream);//从新位置(第7位)一直写到buffer的末尾
}
stream.Position = ;//写完后将stream的Position属性设置成0,开始读流中的数据 ReadBuffer = new byte[stream.Length];// 设置一个空的变量来接收流中的数据,长度根据stream的长度来决定 //设置stream总的读取数量 ,
//流已经把数据读到了readBuffer中
int Count = stream.CanRead ? stream.Read(ReadBuffer, , ReadBuffer.Length) : ; //通过流读出的readBuffer的数据求出从相应Char的数量
int charCount = Encoding.Default.GetCharCount(ReadBuffer, , Count);
//通过该Char的数量 设定一个新的readCharArray数组
ReadCharArray = new char[charCount]; Encoding.Default.GetDecoder().GetChars(ReadBuffer, , Count, ReadCharArray, );
for (int i = ; i < ReadCharArray.Length; i++)
{
readString += ReadCharArray[i];
}
Console.WriteLine("读取字符串为:{0}", readString); } stream.Close(); }
Console.ReadLine();
}
举例:
(1)BinaryWriter 和 BinaryReader
BinaryWriter 和 BinaryReader 类用于读取和写入数据,而不是字符串。向新的空文件流 (Test.data) 写入数据及从中读取数据。在当前目录中创建了数据文件之后,也就同时创建了相关的 BinaryWriter 和 BinaryReader,BinaryWriter 用于向 Test.data 写入整数 0 到 10,Test.data 将文件指针置于文件尾。在将文件指针设置回初始位置后,BinaryReader 读出指定的内容。
using System;
using System.IO;
class MyStream
{
private const string FILE_NAME = "Test.data";
public static void Main(String[] args)
{
// 创建空白文件
if (File.Exists(FILE_NAME))
{
Console.WriteLine("{0} already exists!", FILE_NAME);
return;
}
FileStream fs = new FileStream(FILE_NAME, FileMode.CreateNew);
// 创建BinaryWriter实例 用于写文件
BinaryWriter w = new BinaryWriter(fs);
// 写文件
for (int i = ; i < ; i++)
{
w.Write( (int) i);
}
w.Close();
fs.Close();
// 创建BinaryReader实例用于读文件
fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
// 读文件
for (int i = ; i < ; i++)
{
Console.WriteLine(r.ReadInt32());
}
r.Close();
fs.Close();
}
}
(2)从文件读文本
using System;
using System.IO; class Test
{
public static void Main()
{
try
{
// 创建StreamReader 实例读文件. using (StreamReader sr = new StreamReader("TestFile.txt"))
{
String line;
// 读文件到结尾并展示 while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
catch (Exception e)
{
// 捕获异常
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
}
}
流Stream的更多相关文章
- JAVA基础知识之IO——IO流(Stream)的概念
Java IO 流 Java将不同的设备或载体(键盘.文件.网络.管道等)的输入输出数据统称为"流"(Stream),即JAVA的IO都是基于流的. JAVA传统的所有流类型类都包 ...
- [Linux] 流 ( Stream )、管道 ( Pipeline ) 、Filter - 笔记
流 ( Stream ) 1. 流,是指可使用的数据元素一个序列. 2. 流,可以想象为是传送带上等待加工处理的物品,也可以想象为工厂流水线上的物品. 3. 流,可以是无限的数据. 4. 有一种功能, ...
- 【stanford C++】字符串(String)与流(Stream)
字符串(String)与流(Stream) 一.C++中字符串(String) 字符串(String):就是(可能是空的)字符序列. C++中的字符串在概念上和Java中的字符串类似. C++字符串用 ...
- nodeJS之流stream
前面的话 当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流.NodeJS中通过各种Stream来提供对数据流的操作.本文将详细说明NodeJS中的流strea ...
- c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换
字节数组byte[]与图片image之间的转化 字节数组转换成图片 public static Image byte2img(byte[] buffer) { MemoryStream ms = ne ...
- Java笔记:Java 流(Stream)、文件(File)和IO
更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...
- Java - 17 Java 流(Stream)、文件(File)和IO
Java 流(Stream).文件(File)和IO Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型. ...
- Java总结:Java 流(Stream)、文件(File)和IO
更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...
- 流Stream 文件File 流IO
Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...
- 20180803-Java 流(Stream)、文件(File)和IO
Java 流(Stream).文件(File)和IO 下面的程序示范了用read()方法从控制台不断读取字符直到用户输入"q". // 使用BufferedReader 在控制台读 ...
随机推荐
- poj 1952 最长公共子序列计数
看代码就懂了 不解释 3 1 1 1 1 2 2 2 1 1 1 3 第一个3 和最后一个 3 只需要一个就够了,,, #include<iostream> #include< ...
- Freemarker 自定义标签 实现TemplateDirectiveModel
1 自定义标签需要实现TemplateDirectiveModel这个接口中的execute方法 实例代码如下 public class UserListDirective implements Te ...
- bzoj 4806 炮
Written with StackEdit. Description 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子". 炮跟炮 ...
- iOS6和iOS7代码的适配(5)——popOver
popOver这个空间本身是iPad only的,所以iPhone上见不到,我记得微信上有个这样的弹出框,有扫一扫等几个菜单项,估计这是腾讯自己实现的,用于菜单的扩展. popOver从iOS6到iO ...
- 1132. Cut Integer (20)
Cutting an integer means to cut a K digits long integer Z into two integers of (K/2) digits long int ...
- Java实现7种常见的排序算法
数据结构中的内部排序:不需要访问外存便能完成,是一个逐步扩大记录的有序序列长度的过程. 可以分为5类: 1.插入排序:直接插入排序,稳定排序,时间复杂度为O(n^2)非递减有序,设置r[0]为哨兵进行 ...
- matlab算法转为c语言注意事项
matlab算法转为c语言后,影响c语言效率的关键在于multiword的产生,基于此会有multiword加减法和乘除法,极大消耗资源,减少甚至消除multiword很重要,需注意的是:算法中尽量减 ...
- webpack新版本4.12应用九(配置文件之使用不同语言进行配置)
使用不同语言进行配置(configuration languages) 查看原文|编辑此页 webpack 接受以多种编程和数据语言编写的配置文件.支持的文件扩展名列表,可以在 node-interp ...
- 【ASP.NET Web API2】Digest认证
Digest摘要认证 对于Basic认证方案来说,被传输的认证凭证仅仅采用Base64编码,所以包含密码的认证凭证基本上可以视为明文传输.Digest认证在此基础上进行了改善,在一定程度上提高了安全系 ...
- 泛型List<T>排序(利用反射)
在最近一个项目中,有需求要对页面中所有的gridview添加排序功能.由于gridview的数据源绑定的是一个集合类List,而不是DataTable,所以无法使用DataView排序功能.另外,不同 ...