流是C#中比较重要的一个概念,很多关键技术都需要用到流。何为流呢?可以理解流为江河中水的流动,不过C#中则为信息流,我们可以把信息写入流,也可以读出。比如以文件读写操作为例,首先以某种方式(如只读)打开文件,相当于建立了通往此文件的流,然后就可以从此流中读取信息。C# stream为抽象类,只能用来定义。由它派生出三个派生类:MemoryStream(内存流),BufferedStream(缓存流)以及filestream(文件流)。以下例子由http://www.2cto.com/kf/201203/123535.html转载而来,并且此例子有更加详细的说明。本例子由memorystream进行构造,此类进行数据读取格式为byte类型,中间需要用到相关转化(encoding类),其实流的操作均为byte类型,采用不同的reader,可以简化操作,此例子以memorystream的write,read方法来进行相关操作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; namespace StreamStu
{
class Program
{
static void Main(string[] args)
{
//本节主讲stream的用法
//通过二进制把,数据读入流,并读出流
string testStr = "Stream!Hello world";//读入的数据(字符串)
byte[] buffer = null;//中间数据传输用的缓冲字节数组
byte[] readBuffer = null;//读取数据的缓冲字节数组
char[] readArr;//解码出char的缓冲字符数组
string stringArr = string.Empty;//存放解码出的string //开始文件的读入;
Console.WriteLine("初始字符串为:" + testStr);
using (Stream stream = new MemoryStream())
{
if (stream.CanWrite)//判断当前流是否可写入
{
//数据写入
buffer = Encoding.Default.GetBytes(testStr);
stream.Write(buffer, , );//从stream.position=0的位置读入三个值,新的位置位于3+1的位置;
long newStreamPos = stream.CanSeek ? stream.Seek(, SeekOrigin.Current) : ;//读取位置从当前为位置偏移3;
if ((int)newStreamPos < buffer.Length)//判断移动位置是否超出总长度;
{
stream.Write(buffer, (int)newStreamPos, buffer.Length - (int)newStreamPos);
}
} stream.Position = ;//读取时,初始位置设为0
readBuffer = new byte[buffer.Length];
int count = stream.CanRead ? stream.Read(readBuffer, , buffer.Length) : ;//从流中读入readbuffer,read返回值为读入的个数,write无返回值 //将readbuffer转换为string
int charCount = Encoding.Default.GetCharCount(readBuffer, , count);//确定解码的字符个数,即readbuffer中,从0开始,解码count个
readArr = new char[charCount];
Encoding.Default.GetDecoder().GetChars(readBuffer, , count, readArr, );//从readbuffer中0位置开始解码,解码count个到readarr,并从readarr的0位置开始写入
for (int i = ; i < readArr.Length; i++)
{
stringArr += readArr[i];
}
stream.Close();
}
Console.WriteLine(stringArr); Console.ReadKey(); }
}
}

其实进行数据读取时,可以用streamReader,可以省略将byte数据转化成char[]进而转化成string的操作,代码如下:

                //用streamreader方法数据读取
//stream.Position = 0;//读取时,初始位置设为0
//StreamReader sr = new StreamReader(stream);
//string str = sr.ReadToEnd();
//Console.WriteLine(str);

可以直接读取出string来。

本文代码示例属于转载,此例子是一个不错的基础例子,值得反复思考,有问题一起讨论

stream流篇的更多相关文章

  1. Java9系列第6篇-Stream流API的增强

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...

  2. Java8中的Stream流式操作 - 入门篇

    作者:汤圆 个人博客:javalover.cc 前言 之前总是朋友朋友的叫,感觉有套近乎的嫌疑,所以后面还是给大家改个称呼吧 因为大家是来看东西的,所以暂且叫做官人吧(灵感来自于民间流传的四大名著之一 ...

  3. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  4. java8 Stream的实现原理 (从零开始实现一个stream流)

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  5. 乐字节-Java8新特性-接口默认方法之Stream流(下)

    接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...

  6. 手把手带你体验Stream流

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 上一篇讲解到了Lambda表达式的使用<最近学 ...

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

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

  8. Java 8创建Stream流的5种方法

    不知不觉间,Java已经发展到13了,来不及感慨时间过得真的太快了,来不及学习日新月异的技术更新,目前大多数公司还是使用的JDK8版本,一方面是版本的稳定,另一方面是熟悉,所以很多公司都觉得不升级也挺 ...

  9. Java 8 新特性之 Stream 流基础体验

    Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...

随机推荐

  1. PHPstorm出现的端口号错误问题(502)

    咔咔咔-听好 PhpStorm的默认端口是63342,但是在浏览器会提示502错误. 同时Phpstorm右下角会报错:Please ensure that configured PHP Interp ...

  2. webservice传输文件的三种方式

    1, 在接口中不定义,直接以附件形式传输. 2, 在接口参数中定义byte[]类型,文件在xml中以base64编码传输. 3, 在接口参数中定义DataHandler类型,然后使用MTOM形式来进行 ...

  3. codeforce-1201-C题解

    题目:给你一个包含n个整数的数组A(n为奇数),对A做k次以下操作: 对数组排序使数组以非递减顺序排列. 选取数组的中位数,然后加一 最终使得数组的中位数最大. 输入:第一行输入两个数字 n 和 k ...

  4. idea 自动生成并跳转单元测试

    在要测试的类上按快捷键ctrl + shift + t,选择Create New Test,在出现的对话框的下面member内勾选要测试的方法,点击ok 或者点击菜单栏Navigate–>tes ...

  5. 深度解密Go语言之反射

    目录 什么是反射 为什么要用反射 反射是如何实现的 types 和 interface 反射的基本函数 反射的三大定律 反射相关函数的使用 代码样例 未导出成员 反射的实际应用 json 序列化 De ...

  6. 如何让谷歌浏览器支持小于12px的字体

    CSS3有个新的属性transform,而我们用到的就是transform:scale() 书写一段代码 <body> <p>我是一个小于12PX的字体</p> & ...

  7. 推荐几个我近期排查线上http接口偶发415时用到的工具

    导读:近期有一个业务部门的同学反馈说他负责的C工程在小概率情况下SpringMvc会返回415,通过输出的日志可以确定是SpringMvc找不到content-type这个头了,具体为什么找不到了呢? ...

  8. 无法导入要素类到SDE中

    我遇到的原因的表空间不足(并且表空间没有设置为自动增长) 首先通过SELECT FILE_NAME, TABLESPACE_NAME, AUTOEXTENSIBLE FROM DBA_DATA_FIL ...

  9. Linux虚拟机中配置JDK环境变量(Ubuntu系统)

    首先通过Xshell中文件传输想你的虚拟机上传你的jdk,如图所示:(需要本机安装Xftp:链接: https://pan.baidu.com/s/1sWHmywZ2C6V2n4aa1FqqFg 提取 ...

  10. ASRWGAN: Wasserstein Generative Adversarial Network for Audio Super Resolution

    ASEGAN:WGAN音频超分辨率 这篇文章并不具有权威性,因为没有发表,说不定是外国的某个大学的毕业设计,或者课程结束后的作业.或者实验报告. CS230: Deep Learning, Sprin ...