簡體   English   中英

如何從MemoryStream寫入DataWriter到磁盤

[英]How to write from MemoryStream into DataWriter into disk

我有已附加文件存儲流的DataWriter。 我想如何在特定情況下首先將數據寫入內存,以便我可以知道字節的大小,並在寫入器中存儲數據的大小。

如何在不創建兩個內存緩沖區的情況下做到這一點?

DataWriter writer; // writer is parameter passed from somewhere else.

using (var inMemory = new InMemoryRandomAccessStream())
{
    // fill inMemory with data.

    // ***Here*** How can I avoid this?
    var buffer = new byte[checked((int)inMemory.Position)].AsBuffer();

    inMemory.Seek(0);
    await inMemory.ReadAsync(buffer, buffer.Length, InputStreamOptions.ReadAhead);

    writer.WriteUInt32(buffer.Length); // write size
    writer.WriteBuffer(buffer); // write data
}

如您所見,我正在使用兩個緩沖區,一個用於內存流,另一個用於ibuffer。

我不知道如何直接將inMemory內容寫入已經附加了文件存儲流的DataWriter中。

我必須編寫自己的緩沖區流,以防止創建重復的緩沖區。 盡管流緩沖區在內部像list一樣工作,但是當list變大時,它有好處。

internal sealed class BufferStream : IDisposable
{
    private byte[] _array = Array.Empty<byte>();
    private int _index = -1;
    private const int MaxArrayLength = 0X7FEFFFFF;

    public int Capacity => _array.Length;
    public int Length => _index + 1;

    public void WriteIntoDataWriterStreamAsync(IDataWriter writer)
    {
        // AsBuffer wont cause copy, its just wrapper around array.
        if(_index >= 0) writer.WriteBuffer(_array.AsBuffer(0, _index)); 
    }

    public void WriteBuffer(IBuffer buffer)
    {
        EnsureSize(checked((int) buffer.Length));

        for (uint i = 0; i < buffer.Length; i++)
        {
            _array[++_index] = buffer.GetByte(i);
        }
    }

    public void Flush()
    {
        Array.Clear(_array, 0, _index);
        _index = -1;
    }

    // list like resizing.
    private void EnsureSize(int additionSize)
    {
        var min = additionSize + _index;
        if (_array.Length <= min)
        {
            var newsize = (int) Math.Min((uint) _array.Length * 2, MaxArrayLength);
            if (newsize <= min) newsize = min + 1;
            Array.Resize(ref _array, newsize);
        }
    }

    public void Dispose()
    {
        _array = null;
    }
}

然后,我可以輕松地做到這一點。

using (var buffer = new BufferStream())
{
    // fill buffer

    writer.WriteInt32(buffer.Length); // write size
    buffer.WriteIntoDataWriterStream(writer); // write data
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM