我需要为采用来自文本文件的流的方法编写单元测试。 我想做这样的事情:

Stream s = GenerateStreamFromString("a,b \n c,d");

#1楼

/// <summary>
/// Get Byte[] from String
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static byte[] GetBytes(string str)
{byte[] bytes = new byte[str.Length * sizeof(char)];System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);return bytes;
}/// <summary>
/// Get Stream from String
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static Stream GetStream(string str)
{return new MemoryStream(GetBytes(str));
}

#2楼

字符串扩展的良好组合:

public static byte[] GetBytes(this string str)
{byte[] bytes = new byte[str.Length * sizeof(char)];System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);return bytes;
}public static Stream ToStream(this string str)
{Stream StringStream = new MemoryStream();StringStream.Read(str.GetBytes(), 0, str.Length);return StringStream;
}

#3楼

使用MemoryStream类,调用Encoding.GetBytes首先将您的字符串转换为字节数组。

随后,您是否需要流中的TextReader ? 如果是这样,则可以直接提供StringReader ,并绕过MemoryStreamEncoding步骤。


#4楼

我认为您可以从使用MemoryStream中受益。 您可以使用Encoding类的GetBytes方法获取的字符串字节填充它。


#5楼

干得好:

private Stream GenerateStreamFromString(String p)
{Byte[] bytes = UTF8Encoding.GetBytes(p);MemoryStream strm = new MemoryStream();strm.Write(bytes, 0, bytes.Length);return strm;
}

#6楼

public static Stream GenerateStreamFromString(string s)
{var stream = new MemoryStream();var writer = new StreamWriter(stream);writer.Write(s);writer.Flush();stream.Position = 0;return stream;
}

不要忘记使用“使用”:

using (var stream = GenerateStreamFromString("a,b \n c,d"))
{// ... Do stuff to stream
}

关于StreamWriter尚未处理。 StreamWriter只是基本流的包装,并且不使用任何需要处理的资源。 Dispose方法将关闭StreamWriter写入的基础Stream 。 在这种情况下,我们要返回的是MemoryStream

在.NET 4.5中, StreamWriter现在有一个重载,可以在处置编写器后使基础流保持打开状态,但是此代码执行相同的操作,并且也可以与其他版本的.NET一起使用。

请参见是否可以在不关闭StreamWriter的BaseStream的情况下将其关闭?


#7楼

public Stream GenerateStreamFromString(string s)
{return new MemoryStream(Encoding.UTF8.GetBytes(s));
}

#8楼

我混合使用了以下答案:

public static Stream ToStream(this string str, Encoding enc = null)
{enc = enc ?? Encoding.UTF8;return new MemoryStream(enc.GetBytes(str ?? ""));
}

然后我像这样使用它:

String someStr="This is a Test";
Encoding enc = getEncodingFromSomeWhere();
using (Stream stream = someStr.ToStream(enc))
{// Do something with the stream....
}

#9楼

我们使用下面列出的扩展方法。 我认为您应该让开发人员对编码做出决定,因此所涉及的魔术更少。

public static class StringExtensions {public static Stream ToStream(this string s) {return s.ToStream(Encoding.UTF8);}public static Stream ToStream(this string s, Encoding encoding) {return new MemoryStream(encoding.GetBytes(s ?? ""));}
}

#10楼

ToStream扩展方法的现代化版本和稍作修改的版本:

public static Stream ToStream(this string value) => ToStream(value, Encoding.UTF8);public static Stream ToStream(this string value, Encoding encoding) => new MemoryStream(encoding.GetBytes(value ?? string.Empty));

@Shane Bowe答案的@Palec评论中建议的修改。


#11楼

另一个解决方案:

public static MemoryStream GenerateStreamFromString(string value)
{return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
}

#12楼

将此添加到静态字符串实用程序类:

public static Stream ToStream(this string str)
{MemoryStream stream = new MemoryStream();StreamWriter writer = new StreamWriter(stream);writer.Write(str);writer.Flush();stream.Position = 0;return stream;
}

这增加了扩展功能,因此您可以简单地:

using (var stringStream = "My string".ToStream())
{// use stringStream
}

#13楼

如果您需要更改编码,我赞成@ShaunBowe的解决方案。 但是这里的每个答案至少会将整个字符串复制到内存中一次。 使用ToCharArray + BlockCopy组合的答案会执行两次。

如果那很重要,这里是用于原始UTF-16字符串的简单Stream包装器。 如果与StreamReader一起使用,请为其选择Encoding.Unicode

public class StringStream : Stream
{private readonly string str;public override bool CanRead => true;public override bool CanSeek => true;public override bool CanWrite => false;public override long Length => str.Length * 2;public override long Position { get; set; } // TODO: bounds checkpublic StringStream(string s) => str = s ?? throw new ArgumentNullException(nameof(s));public override long Seek(long offset, SeekOrigin origin){switch (origin){case SeekOrigin.Begin:Position = offset;break;case SeekOrigin.Current:Position += offset;break;case SeekOrigin.End:Position = Length - offset;break;}return Position;}private byte this[int i] => (i & 1) == 0 ? (byte)(str[i / 2] & 0xFF) : (byte)(str[i / 2] >> 8);public override int Read(byte[] buffer, int offset, int count){// TODO: bounds checkvar len = Math.Min(count, Length - Position);for (int i = 0; i < len; i++)buffer[offset++] = this[(int)(Position++)];return (int)len;}public override int ReadByte() => Position >= Length ? -1 : this[(int)Position++];public override void Flush() { }public override void SetLength(long value) => throw new NotSupportedException();public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException();public override string ToString() => str; // ;)
}

这是带有必要的绑定检查的更完整的解决方案(从MemoryStream派生,因此它也具有ToArrayWriteTo方法)。

如何从字符串生成流?相关推荐

  1. 5.2 IO流(File类,Propertis配置文件,其他类(打印流,序列流,操作对象的流(序列化接口),随机访问文件的流,管道流,操作基本数据的流,操作数组的流,操作字符串的流),编码表)

    1.File类 IO流的流对象只能操作设备上的数据.File类:1.用来将文件或者文件夹(也称目录)封装成对象. 2.方便对文件和文件夹的属性信息进行操作.(操作文件夹,文件的属性(创建时间,修改时间 ...

  2. 70页论文,图灵奖得主Yoshua Bengio一作:“生成流网络”拓展深度学习领域

    来源:机器之心 本文约2800字,建议阅读10分钟 GFlowNet会成为新的深度学习技术吗? 近日,一篇名为<GFlowNet Foundations>的论文引发了人们的关注,这是一篇图 ...

  3. 70页论文,图灵奖得主Yoshua Bengio一作:「生成流网络」拓展深度学习领域

    来源:机器学习研究组订阅 GFlowNet 会成为新的深度学习技术吗? 近日,一篇名为<GFlowNet Foundations>的论文引发了人们的关注,这是一篇图灵奖得主 Yoshua ...

  4. java读取字符串,生成txt文件

    /*** 读取字符串,生成txt 文件 已解决未设置编码时,在项目中直接打开文件,中文乱码问题* WriteText.writeToText(musicInfo,fileName)直接调用* * @a ...

  5. 【Groovy】json 序列化 ( JsonBuilder 生成器 | 生成带根节点名称的 json 字符串 | 生成不带根节点名称的 json 字符串 )

    文章目录 一.json 生成器 二.代码示例 一.json 生成器 首先 , 创建 json 生成器 . // json 生成器 def jsonBuilder = new JsonBuilder() ...

  6. 将Python字符串生成PDF

    笔者在今天的工作中,遇到了一个需求,那就是如何将Python字符串生成PDF.比如,需要把Python字符串'这是测试文件'生成为PDF, 该PDF中含有文字'这是测试文件'. 经过一番检索,笔者决定 ...

  7. Freemarker基于模板字符串生成静态化html文件

    基于字符串生成静态化文件,就不会通过模板文件.ftl了,也就是项目中压根就不存在模板文件,就是通过用户输入或在配置文件中定义一些模板字符串,基于这些字符串来生成静态化文件. 将字符串转换成模板:

  8. 微信小程序业务-字符串生成二维码(weapp-qrcode)

    微信小程序业务-字符串生成二维码(weapp-qrcode) 前言 邂逅weapp-qrcode 基本使用 详细参数 小程序组件中使用 image属性详解 想使用网络图片? 参考地址 前言 在小程序项 ...

  9. 生成html_听说你不会用Python将字符串生成PDF?来,我教你!

    这是恋习Python推荐的第118篇好文 来源:Python爬虫与算法 作者:jclian   笔者在今天的工作中,遇到了一个需求,那就是如何将Python字符串生成PDF.比如,需要把Python字 ...

最新文章

  1. 8086/8088 存储器分段概念
  2. 01-插件推荐:RTImageAssets 自动生成 AppIcon 和 @2x @1x 比例图片
  3. stm32逆向与安全科普,bin文件逆向反汇编
  4. 为什么当代人越来越不快乐?
  5. 367. 有效的完全平方数(二分法)
  6. 总投资200亿,中国第五座航天发射中心来了!为何选址在宁波?
  7. SqlBulkCopy批量插入数据库
  8. 智能灯控制页面用HTML编写,一种基于STM32的智能灯控制系统的制作方法
  9. CNNIC报告:中国网民超8亿,人工智能取得突出成果
  10. cad多个窗口并排显示_如何创建包含 CAD 导入和选择的仿真 App
  11. [深度学习] fast-reid入门教程
  12. 固态硬盘用软件测试掉速严重,SSD固态硬盘掉速怎么办?手动执行TRIM指令缓解固态硬盘掉速方法...
  13. Jsp+Servlet飞机票预定系统(JavaWeb毕业设计源码)
  14. Kickoff(上路了)
  15. Mybatis---简单缓存了解
  16. 2020软件工程专硕考研经验指导
  17. linux获取ip上网,linux dhcp 获取ip地址能上网,设置静态ip地址则不能上网
  18. ckeditor5 添加ckeditor5-line-height-plugin插件
  19. VMware vSphere 服务器虚拟化部署安装图解
  20. golang 加密文件_如何使用Go加密文件

热门文章

  1. rsync+inotify 实现数据实时同步
  2. F5实现2台机器的热备 Priority Group Activation
  3. phpMyAdmin安装配置
  4. PC 平台上的一种快速 Red Hat Linux 安装方法
  5. 中国IT业发展案例剖析之--豪杰解霸
  6. python学习 day22 (3月29日)----(生成器推导式)
  7. Protostuff序列化和反序列化
  8. golang 格式化时间成datetime
  9. Android 启动多个闹钟。
  10. 感觉自己应该重新读一次Javascript