BufferedStream常用于对其他流的一个封装,它必须和其他流结合一起使用。MemoryStream将所有的内容都放入内存中,而BufferedStream不是。BufferedStream在基础流写入内存中能够提高读取与写入速度。但是缓冲区设置的大小对性能也有影响,默认值是4096字节,并能够根据需求自动增长。并且很多属性都与基础流一致。缓冲数据能够减少对操作系统的调用次数,缓冲数据主要存储在缓冲区中,缓冲区是内存中的字节块。BufferedStream类提供从基础数据源或存储库读取字节以及将字节写入基础数据源或存储库的实现,在不需要缓冲区时可以防止缓冲区降级输入和输出速度。

  缓冲类型下,会在后台自动下载定长的内容,读的时候是从缓冲区中拿东西。这种模式最大的特点是半阻塞式,大部分情况下能大幅度提高处理速度。

  在程序逻辑速度大大慢于IO速度时,此方法效率明显。最好是在大文件的情况下,分块读,分块写。

一、构造函数

BufferedStream(Stream)
  其实BufferedStream的构造主要功能还是设置缓冲区大小,如果没有指定则默认是用4096字节的进行初始化
BufferedStream(Stream, Int32)
  第二个参数是手动指定缓冲区大小
  第一次使用此构造函数初始化 BufferedStream 对象时分配共享读/写缓冲区。 如果所有的读和写都大于或等于缓冲区大小,则不使用共享缓冲区。

二、属性

CanRead     获取一个值,该值指示当前流是否支持读取。
CanSeek     获取一个值,该值指示当前流是否支持查找。
CanTimeout    获取一个值,该值确定当前流是否可以超时。
CanWrite      获取一个值,该值指示当前流是否支持写入。
Length       获取流长度,长度以字节为单位。 
Position      获取当前流内的位置。get 访问器调用 Seek 获取基础流中的当前位置,然后根据缓冲区中的当前位置调整此值。set 访问器将以前写入缓冲区的所有数据都           复制到基础流中,然后调用 Seek。
ReadTimeout  获取或设置一个值(以毫秒为单位),该值确定流在超时前尝试读取多长时间。 
WriteTimeout   获取或设置一个值(以毫秒为单位),该值确定流在超时前尝试写入多长时间。

三、方法

BeginRead     开始异步读操作。 (继承自 Stream。) 
BeginWrite      开始异步写操作。 (继承自 Stream。) 
Close        已重载。 
CreateObjRef    创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自 MarshalByRefObject。) 
CreateWaitHandle 已过时。分配 WaitHandle 对象。 (继承自 Stream。) 
Dispose      已重载。 
EndRead       等待挂起的异步读取完成。 (继承自 Stream。) 
EndWrite      结束异步写操作。 (继承自 Stream。) 
Flush        清除该流的所有缓冲区,使得所有缓冲的数据都被写入到基础设备。 (重写 Stream..::.Flush()()()。) 
GetLifetimeService     检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。) 
InitializeLifetimeService    获取控制此实例的生存期策略的生存期服务对象。 (继承自 MarshalByRefObject。) 
MemberwiseClone      已重载。 
Read             将字节从当前缓冲流复制到数组。 (重写 Stream..::.Read(array<Byte>[]()[], Int32, Int32)。) 
ReadByte          从基础流中读取一个字节,并返回转换为 int 的该字节;或者如果从流的末尾读取则返回 -1。 (重写 Stream..::.ReadByte()()()。) 
Seek             设置当前缓冲流中的位置。 (重写 Stream..::.Seek(Int64, SeekOrigin)。) 
SetLength         设置缓冲流的长度。 (重写 Stream..::.SetLength(Int64)。) 
Write            将字节复制到缓冲流,并将缓冲流内的当前位置前进写入的字节数。 (重写 Stream..::.Write(array<Byte>[]()[], Int32, Int32)。) 
WriteByte         将一个字节写入缓冲流的当前位置。 (重写 Stream..::.WriteByte(Byte)。)

最后写了个示例:

        static void Main(string[] args)
{
FileStream fs = new FileStream(@"D:\text.txt",FileMode.Open,FileAccess.ReadWrite);
BufferedStream bs = new BufferedStream(fs);
Console.WriteLine(bs.CanRead); //此流于基础流的设置有关,当fs设FileAccess.Read时就为true,Write时就为false
Console.WriteLine(fs.CanSeek + " " + bs.CanSeek); //True True 支持查找
Console.WriteLine(fs.CanTimeout + " " + bs.CanTimeout); //False False 既然不支持超时,那就更加不存在超过多久的问题了,因此最后两个属性都会异常。
Console.WriteLine(bs.CanWrite); //这个也是和基础流的可读属性一致
Console.WriteLine(fs.Length + " " + bs.Length); //输出 7649 7649
Console.WriteLine(fs.Length + " " + bs.Position); //输出7649 0 文件流Open打开就在最后了,但是BufferedStream是在开始。 //也是这样读写,与FileStream无异,不过在内存读取应该会快点。
byte[] bytes = new byte[bs.Length];
bs.Read(bytes, 0, (int)bs.Length);
Console.WriteLine(Encoding.UTF8.GetString(bytes)); //也是与FileStream的写入方式一样,连Flush都一样
byte[] byte1 = Encoding.UTF8.GetBytes("你在他乡还好吗?");
bs.Write(byte1,0,byte1.Length);
bs.Flush(); //还是这样写 Console.ReadKey();
}

以下给出一个使用缓冲流复制文件的例子:

    class Program
{
static void Main(string[] args)
{
string Path1 = @"D:\123.txt";
string Path2 = @"D:\456.txt";
Buf(Path1,Path2);
Console.WriteLine("文件复制完成!"); Console.ReadKey();
} private static void Buf(string oPath, string copyPath)
{
Stream s1, s2;
BufferedStream bs1, bs2;
byte[] b = new byte[1024];
int i;
//分别以读、写方式打开两个文件
s1 = File.OpenRead(oPath);
s2 = File.OpenWrite(copyPath);
//使用缓冲流
bs1 = new BufferedStream(s1);
bs2 = new BufferedStream(s2);
i = bs1.Read(b,0,1024);
//从文件1中读取,写入到文件2中
while (i > 0)
{
bs2.Write(b,0,i);
i = bs1.Read(b,0,1024);
}
bs2.Flush();
s1.Close();
bs2.Close();
}
}

BufferedStream类 - 缓冲流的更多相关文章

  1. java IO之 File类+字节流 (输入输出 缓冲流 异常处理)

    1. File类

  2. IO流(File类,IO流的分类,字节流和字符流,转换流,缓冲流,对象序列化)

    1.File类 File类可以在程序中 操作文件和目录.File类是通过建立File类对象,在调用File类的对象来进行相关操作的. 示例: public class Demo01 { public  ...

  3. Java - IO System类支持和缓冲流

    System类的支持和缓冲流 System类对IO的支持 在System类中,为了支持IO操作提供了三个常量: 错误输出: public static final PrintStream err; 输 ...

  4. JavaSE_12_Properties类和缓冲流

    1.Properties类 java.util.Properties 继承于Hashtable ,来表示一个持久的属性集.它使用键值结构存储数据,每个键及其对应值都是一个字符串.该类也被许多Java类 ...

  5. 01 语言基础+高级:1-8 File类与IO流_day10【缓冲流、转换流、序列化流】

    day10[缓冲流.转换流.序列化流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 能够使用字节缓冲流读取数据到程序 能够使用字节缓冲流写出数据到文件 能够明确字符缓冲流的作用和基本用法 能 ...

  6. JAVASE(十六) IO流 :File类、节点流、缓冲流、转换流、编码集、对象流

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.File类型 1.1.File类的理解 File类是在java.io包下 File可以理解成一个文件 ...

  7. File类的特点?如何创建File类对象?Java中如何操作文件内容,什么是Io流Io流如何读取和写入文件?字节缓冲流使用原则?

    重难点提示 学习目标 1.能够了解File类的特点(存在的意义,构造方法,常见方法) 2.能够了解什么是IO流以及分类(IO流的概述以及分类) 3.能够掌握字节输出流的使用(继承体系结构介绍以及常见的 ...

  8. Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Properties集合、打印流)

    1.IO简介 IO(输入输出)通过java.io包下的类和接口来支持,包下包括输入.输出两种IO流,每种输入输出流又可分为字符流和字节流两大类. 2.File类 File类是io包下与平台无关的文件和 ...

  9. File类与常用IO流第八章——缓冲流

    第八章.缓冲流 缓冲流概述 缓冲流,也叫高效流,是对4个基本的FileXxx流的增强.按照数据类型分为4类:   输入缓冲流 输出缓冲流 字节缓冲流 BufferedInputStream Buffe ...

随机推荐

  1. LeetCode_Convert Sorted Array to Binary Search Tree

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. /* ...

  2. Linux上ld和ld.so命令的区别

    显然,ld链接器,它的生命周期是发生在compile-time的,它的一些参数是编译时期gcc给传递的,比如,指定需要链接什么库. ld.so命令的周期是发生在run-time的,名字叫动态链接器/加 ...

  3. UML--核心元素之参与者Actor

    参与者(actor):在系统之外与系统交互的某人或某事物.例如,管理员,用户等等. 参与者位于边界之外,边界之内的都不叫参与者.用一个词来形容更准确,主角.也就是只有主动启动了这个业务的人,才是参与者 ...

  4. Web UI 网站用户界面设计命名规范

    Web UI 网站用户界面设计命名规范 WEB UI设计命名规范,也就是网站用户界面设计(网页设计)命名规范. 这套规范并非单纯的CSS.html或JavaScript命名规范,它涉及了很多使用Pho ...

  5. HDU 1394 Minimum Inversion Number(线段树 或 树状数组)

    题目大意:给出从 0 到 n-1 的整数序列,A0,A1,A2...An-1.可将该序列的前m( 0 <= m < n )个数移到后面去,组成其他的序列,例如当 m=2 时,得到序列 A2 ...

  6. zedboard--Opencv移植和zedboard测试(十一)

    继上次生成了ARM架构的链接库之后,我们要把他们拷贝到装载有文件系统的SD卡中即可,在拷贝时,最好是/usr/lib下 实践一:将那些lib拷贝到U盘里面,因为之前跑过demo,里面就是一个简易的li ...

  7. base64转码

    Base64是一种编码方法,可以将任意字符转成可打印字符.使用这种编码方法,主要不是为了加密,而是为了不出现特殊字符,简化程序的处理. JavaScript原生提供两个Base64相关方法. btoa ...

  8. Codeforces 549F Yura and Developers

    probelm 题意 给定一个序列和一个mod值,定义[l,r]合法当l到r的全部元素和减去当中的最大值的结果能够整除mod.问共同拥有多少区间合法. 思路 一開始想的分治. 对于一个[l,r]我们能 ...

  9. Python进阶之路---1.1python简介

                            Python简介 Python简介 Python (发音:[ 'paiθ(ə)n; (US) 'paiθɔn ]n.蟒蛇,巨蛇 ),是一种面向对象的解释 ...

  10. Oracle表、列、约束的操作

    获得有关表的信息 可以直接DESCRIBE DESC[RIBE] table_name; 可以通过数据字典 SELECT * FROM user_tables WHERE table_name =xx ...