什么是流,.NET中有哪些常见的流

分析问题

  流是一种对于字节流的直接操作。例如在处理一个文件时,本质上需要通过操作系统提供的API来进行文件打开,读取文件中的字节流,再关闭文件等操作,而读取文件的过程就可以看作字节流的一个过程。常见的流类型有文件流、终端操作流、网络Socket等。

  在.NET中,System.IO.Stream类型被设计为所有流类型的虚基类,所有常见的流类型都继承自System.IO.Stream类型,当程序员需要自定义一种流类型时,也应该直接或者间接继承自Stream类型。.NET提供了丰富的内建的流类型,其中包括了操作文件的FileStream、操作内存的MemoryStream、操作网络的NetworkStream等。下图展示了.NET中常见的流类型以及它们的类型结构图。

  

  

  如上图所示,Stream类型继承自MarshalByRefObject类型,这保证了流类型可以跨越应用程序域进行交互。所有的常见的流类型都继承自System.IO.Stream类型,这保证了流类型的同一性。配合StreamReader和StreamWriter类型,.NET提供的流类型使用起来都非常简便,完全屏蔽了底部的一些复杂操作。

  以下代码以最常用的FileStream为例,介绍了流的使用方法。首先是从一个流读出所有字节和向下一个流传入所有字节的方法,这两个方法对于所有流对象是通用的。

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Test
{
    class UseStream
    {
        private const int bufferLength = 50;
        static void Main()
        {
            //创建一个文件,并写入内容
            string fileName = @"D:\TestStream.txt";
            string fileContent = GetTestString();

            try
            {
                //创建文件并写入内容
                using (FileStream fs = new FileStream(fileName, FileMode.Create))
                {
                    byte[] bytes = Encoding.Default.GetBytes(fileContent);
                    WriteAllBytes(fs, bytes, bufferLength);
                    fs.Close();
                }
                //读取文件并且打印出来
                using (FileStream fs = new FileStream (fileName,FileMode.Open))
                {
                    byte[] result = ReadAllBytes(fs, bufferLength);
                    Console.WriteLine(Encoding.Default.GetString(result));
                    Console.Read();
                    fs.Close();
                }
            }
            finally
            {
                try
                {
                    if (File.Exists(fileName))
                    {
                        File.Delete(fileName);
                    }
                }
                finally
                { }
            }

        }

        //取得测试数据
        static string GetTestString()
        {
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < 10; i++)
            {
                builder.Append("我是测试数据\r\n");
            }
            return builder.ToString();
        }

        //从一个流中读取所有字节
        static byte[] ReadAllBytes(Stream stream, int bufferLength)
        {
            //读取的缓存
            byte[] buffer = new byte[bufferLength];
            List<byte> result = new List<byte>();
            int read;
            //直至读取结束
            while ((read=stream.Read(buffer,0,bufferLength))>0)
            {
                if (read<bufferLength)
                {
                    byte[] temp = new byte[read];
                    Array.Copy(buffer, temp, read);
                    result.AddRange(temp);
                }
                else
                {
                    result.AddRange(buffer);
                }
            }
            return result.ToArray();
        }
        //把字节写入一个流中
        static void WriteAllBytes(Stream stream, byte[] data, int bufferLength)
        {
            //写入的缓存
            byte[] buffer = new byte[bufferLength];
            for (long i = 0; i < data.LongLength; i+=bufferLength)
            {
                int length = bufferLength;
                if (i+bufferLength>data.LongLength)
                {
                    length = (int)(data.LongLength - i);
                }
                Array.Copy(data, i, buffer, 0, length);
                stream.Write(buffer, 0, length);
            }
        }
    }
}

  由于优秀的封装,.NET中所有的流类型的使用方法都很类似,程序员基本可以无须关心底层实现的具体内容。当需要实现自定义的流类型时,程序员应该毫无疑问地使其直接或者间接地继承自Stream类型,以保证所有流类型的一致性。

  最后相当重要的一点是,Stream类型实现了IDisposable接口,所有对于流类型的使用都应该使用using语句确保Dispose方法被调用。

答案

  流是对于字节集合对象的一种操作。.NET中常见的流类型有FileStream、MemoryStream、NetworkStream、UnmanagedMemoryStream等。

  

什么是流,.NET中有哪些常见的流

时间: 2024-10-09 16:52:11

什么是流,.NET中有哪些常见的流的相关文章

java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等

原文:java常用流处理工具StreamTool 常见的InputStream流转字符串, 转字节数组等等 源代码下载:http://www.zuidaima.com/share/1550463397366784.htm ava 常用流处理工具 StreamTool ,常见的InputStream 流转字符串, 转字节数组等等 **应用场景: ** 1. 文件上传 2. js / css / img 等文件读取输出. 转字符串输出 (js & css) , 转字节数组输出 (img .. swf

黑马程序员——Java基础--IO流(一)---File类以及其他流对象

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.File类 File类是将文件系统中的文件和文件夹封装成了对象.提供了更多的属性和行为可以对这些文件和文件夹进行操作.这些是流对象办不到的,因为流只操作数据.File对象可以作为参数传递给流对象的构造函数.File 类的实例是不可变的:也就是说,一旦创建,File 对象表示的抽象路径名将永不改变. 1.File类中的方法 (1).File类的构造方法以及字段 1 new File(Stri

一、javaSE (二十二)登录注册IO版本案例、数据操作流、内存操作流、打印流、标准输入输出流、随机访问流、合并流、序列化流、Properties、NIO

1:登录注册Io版本案例(掌握) 要求,对着写一遍 cn.itcast.pojo User cn.itcast.dao UserDao cn.itcast.dao.impl UserDaoImp1(实现我不管) cn.itcast.game GuessNumber cn.itcast.test UserTest 2:数据操作流(操作基本类型数据的流)(理解) (1)可以操作基本类型的数据 (2)流对象名称 DataInputStream DataOutputStream 3:内存操作流(理解)

面试题:JavaIO流分类详解与常用流用法实例

Java流概念: Java把所有的有序数据都抽象成流模型,简化了输入输出,理解了流模型就理解了Java IO.可以把流想象成水流,里面的水滴有序的朝某一方向流动.水滴就是数据,且代表着最小的数据流动单位,在字节流中,水滴就是一字节(byte),在字符流中,水滴就是一字符(char). Java流的分类方法大致分为以下几种: 1.按流向划分,分为输入流.输出流 请注意,这里的流向是以程序的运行时内存为参照的. 输入流类名中包含关键字InputStream或Reader,输出流类名中包含关键字Out

Java基础知识强化之IO流笔记63:随机访问流RandomAccessFile

1. 随机访问流RandomAccessFile RandomAccessFile类不属于流,是Object类的子类.但它融合了InputStream和OutputStream的功能.支持对随机访问文件的读取和写入. RandomAccessFile的构造方法: 构造方法摘要 RandomAccessFile(File file, String mode)           创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定. RandomAccessFile(St

IO流(四):其他流

一.操作基本数据类型的流 (一)构造方法 1.数据输入流:DataInputStream(InputStream in) 2.数据输出流:DataOutputStream(OutputStream out) (二)方法 1.DataOutputStream: writeByte(10); writeShort(100); writeInt(1000); writeLong(10000); writeFloat(12.34F); writeDouble(12.56); writeChar('a')

IO包中的其他类 打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组

打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组 一.打印流: 该流提供了打印方法,可以将各种数据类型的数据都原样打印. 字节打印流PrintStream构造函数可以接收的参数类型1.File对象 File2.字符串路径 String3.字节输出流 OutputStream 字符打印流PrintWriter(更常用)1.File对象 File2.字符串路径 String3.字节输出流 OutputStream4.字符输出流 Writer publ

黑马程序员——Java基础——IO流(三)—对象的序列化(持久化),管道流,操作基本数据类型的流对象

第一讲 对象序列化(持久化) 概述: 将堆内存中的对象存入硬盘,以包括对象的数据,称为持久化或序列化 使用的类:ObjectInputStream和ObjectOutputStream 特有方法: ObjectInputStream Object readObject():读取 ObjectOutputStream void writeObject(obj):写入 1 /* 2 * 需求:将一个对象序列化,并从硬盘中读取序列化的对象 3 * 4 */ 5 import java.io.*; 6

字符缓冲流,properties类,序列化流与反序列化流,打印流

1.字符缓冲流的写法与字节缓冲流类似,也是用字符缓冲对象嵌套字符读写对象.格式为: BufferedReader br=new BufferedReader(new FileReader(数据源)): BufferedWriter bw=new BufferedWriter(new FileWriter(目的地)): 2.BufferedReader有一个优势是可以读取一个文本行,它的方法是readLine(),这与FileReader相区别. 3.在IO操作时选用哪个对象,要看输入还是输出,文