流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 在控制台读 ...
随机推荐
- 拦截器springmvc防止表单重复提交【2】
[参考博客:http://my.oschina.net/mushui/blog/143397] 原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务 ...
- volley源码解析-Throwable类源码解析
前提知识点: 1.Serializable接口 作用:表示可序列化的语义.就是Java提供的通用数据保存和读取接口.任何类型实现了Serializeable接口,就可以被保存到文件中,或者作为数据流通 ...
- PING分组网间探测 ICMP协议
1.Ping的基础知识 Ping是潜水艇人员的专用术语,表示回应的声纳脉冲,在网络中Ping 是一个十分好用的TCP/IP工具.它主要的功能是用来检测网络的连通情况和分析网络速度.是ICMP的一个 ...
- WCF 配置文件
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.S ...
- niosii dma实验中的一点感想
1,使用nios给出的驱动函数的顺序一般为1,清中断2,写控制寄存器,3,写参数寄存器4,中断注册,5,开始工作.因为开始工作控制位在控制寄存器中,所以会想到到最后一块写,省事,但是在dma试验中发现 ...
- ulimit 设置
1. /etc/security/limit.conf * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc ...
- CLR值类型和引用类型
知识点:引用类型.值类型.装箱.拆箱 CLR支持两种类型:引用类型和值类型.引用类型在堆上分配内存,值类型在线程栈上分配内存.值类型与引用类型如下所示: 值类型对象有两种表示形式:未装箱和已装箱.将一 ...
- 在C#获取麦克风输入的声音的波形图
怎么获取声音波动的频率,在网上找来一些这方面的资料: DirectX的 DirectSound http://zhidao.baidu.com/question/448587955.html http ...
- Jquery3.x高版本支持IE8
最近在做项目的时候,遇到一个安全漏洞的问题 检测到目标站点存在javascript框架库漏洞 解决办法是 将受影响的javascript框架库升级到最新版本. 好吧,就给你升吧,升完之后,我的天啊,尽 ...
- bzoj 3230 相似子串——后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3230 作出后缀数组,从 LCP 看每个位置对于本质不同子串的贡献,而且他们已经按前面部分排好 ...