gpt4 book ai didi

c# - 将字符串作为流读取而不复制

转载 作者:行者123 更新时间:2023-12-04 02:22:57 25 4
gpt4 key购买 nike

我在一个字符串中有一些数据。我有一个将流作为输入的函数。我想将我的数据提供给我的函数,而不必将完整的字符串复制到流中。本质上,我正在寻找一个可以包装字符串并从中读取的流类。

我在网上看到的唯一建议是 StringReader,它不是一个流,或者创建一个内存流并写入它,这意味着复制数据。我可以编写自己的流对象,但棘手的部分是处理编码,因为流以字节为单位。有没有办法在不编写新的流类的情况下做到这一点?

我正在 BizTalk 中实现管道组件。 BizTalk 完全使用流来处理所有事情,因此您总是在流中将事物传递给 BizTalk。 BizTalk 将始终以小块的形式从该流中读取,因此如果我可以从流中读取 BizTalk 想要它的方式,那么将整个字符串复制到流中是没有意义的(尤其是在字符串很大的情况下)。

最佳答案

这是一个合适的StringReaderStream有以下缺点:

  • Read 的缓冲区必须至少是 maxBytesPerChar长。可以实现 Read通过保留内部一个字符来用于小缓冲区 buff = new byte[maxBytesPerChar] .但对于大多数用途来说不是必需的。
  • Seek ,可以进行搜索,但一般来说会非常棘手。 (有些搜索案例,比如搜索开始,搜索结束,实现起来很简单。)
  • /// <summary>
    /// Convert string to byte stream.
    /// <para>
    /// Slower than <see cref="Encoding.GetBytes()"/>, but saves memory for a large string.
    /// </para>
    /// </summary>
    public class StringReaderStream : Stream
    {
    private string input;
    private readonly Encoding encoding;
    private int maxBytesPerChar;
    private int inputLength;
    private int inputPosition;
    private readonly long length;
    private long position;

    public StringReaderStream(string input)
    : this(input, Encoding.UTF8)
    { }

    public StringReaderStream(string input, Encoding encoding)
    {
    this.encoding = encoding ?? throw new ArgumentNullException(nameof(encoding));
    this.input = input;
    inputLength = input == null ? 0 : input.Length;
    if (!string.IsNullOrEmpty(input))
    length = encoding.GetByteCount(input);
    maxBytesPerChar = encoding == Encoding.ASCII ? 1 : encoding.GetMaxByteCount(1);
    }

    public override bool CanRead => true;

    public override bool CanSeek => false;

    public override bool CanWrite => false;

    public override long Length => length;

    public override long Position
    {
    get => position;
    set => throw new NotImplementedException();
    }

    public override void Flush()
    {
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
    if (inputPosition >= inputLength)
    return 0;
    if (count < maxBytesPerChar)
    throw new ArgumentException("count has to be greater or equal to max encoding byte count per char");
    int charCount = Math.Min(inputLength - inputPosition, count / maxBytesPerChar);
    int byteCount = encoding.GetBytes(input, inputPosition, charCount, buffer, offset);
    inputPosition += charCount;
    position += byteCount;
    return byteCount;
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
    throw new NotImplementedException();
    }

    public override void SetLength(long value)
    {
    throw new NotImplementedException();
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
    throw new NotImplementedException();
    }
    }

    关于c# - 将字符串作为流读取而不复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26168205/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com