Каков наилучший способ сделать вывод одного потока входным для другого - PullRequest
5 голосов
/ 25 ноября 2008

Мне интересно, есть ли лучший / встроенный способ, кроме использования байтового буфера и циклического чтения, для чтения из одного потока и записи его в другой (в .NET). Обычно это делается для применения преобразования к потоку и его перемещения.

В данном случае, что я загружаю файл, помещаю его в поток deflate и записываю в файл (обработка ошибок удалена для простоты):

byte[] buffer = new byte[10000000];
using (FileStream fsin = new FileStream(filename, FileMode.Open))
{
    using (FileStream fsout = new FileStream(zipfilename, FileMode.CreateNew))
    {
        using (DeflateStream ds = new DeflateStream(fsout, CompressionMode.Compress))
        {
            int read = 0;
            do
            {
                read = fsin.Read(buffer, 0, buffer.Length);
                ds.Write(buffer, 0, read);
            }
            while (read > 0);
        }
    }
}
buffer = null;

Edit:

.NET 4.0 теперь имеет функцию Stream.CopyTo, Аллилуйя

Ответы [ 3 ]

5 голосов
/ 25 ноября 2008

Нет лучшего способа, чем этот, хотя я склоняюсь к циклической части в методе расширения CopyTo, например,

public static void CopyTo(this Stream source, Stream destination)
{
    var buffer = new byte[0x1000];
    int bytesInBuffer;
    while ((bytesInBuffer = source.Read(buffer, 0, buffer.Length)) > 0)
    {
        destination.Write(buffer, 0, bytesInBuffer);
    }
}

Который вы могли бы затем назвать:

fsin.CopyTo(ds);
3 голосов
/ 06 июля 2010

.NET 4.0 теперь имеет функцию Stream.CopyTo

1 голос
/ 25 ноября 2008

Теперь, когда я думаю об этом, я никогда не видел встроенной поддержки для передачи результатов входного потока непосредственно в выходной поток, как вы описываете. Эта статья о MSDN содержит некоторый код для класса StreamPipeline, который выполняет то, что вы описываете.

...