2008-09-24 35 views
5

Cách hiệu quả nhất để đọc luồng vào luồng khác là gì? Trong trường hợp này, tôi đang cố gắng đọc dữ liệu trong một luồng trực tuyến vào một luồng chung. Tôi biết tôi có thể làm như sau: dòng
1. đọc bởi dòng và ghi dữ liệu vào dòng
2. khối đọc byte và ghi vào dòng
3. vvĐọc dữ liệu trong FileStream vào một Dòng chung

Tôi chỉ cố gắng để tìm ra cách hiệu quả nhất.

Cảm ơn

+0

Bạn có ý nghĩa gì khi hiệu quả? Đó là nhanh nhất, sử dụng số lượng bộ nhớ ít nhất, hoặc một số tiêu chí khác? –

Trả lời

7

Stephen Toub thảo luận về một đường dẫn luồng trong cột MSDN .NET của mình. here. Trong bài viết, ông mô tả phương thức CopyStream() sao chép từ một luồng đầu vào sang luồng khác. Điều này nghe khá giống với những gì bạn đang cố gắng làm.

+0

Tôi thực sự thích bài viết đó cho phối cảnh nhiệm vụ song song, nhưng bản sao luồng đó khá hữu ích theo đúng nghĩa của nó. Tuy nhiên, nếu luồng không hỗ trợ thuộc tính Độ dài (nếu CanSeek là sai, ngoại lệ), bộ đệm phải là độ dài của luồng đầu vào và được thực hiện trong một lần đọc duy nhất. –

1

Đọc bộ đệm byte và viết nhanh nhất. Các phương pháp như ReadLine() cần phải tìm các dấu phân tách dòng, mất nhiều thời gian hơn là chỉ làm đầy bộ đệm.

0

tôi giả bởi dòng chung chung, bạn có nghĩa là bất kỳ loại khác của dòng, giống như một Stream Memory vv

Nếu vậy, cách hiệu quả nhất là để đọc khối lượng byte và viết chúng vào dòng người nhận. Kích thước chunk có thể là một cái gì đó giống như 512 byte.

7

tôi cuộn lại với nhau một phương pháp nhanh chóng mở rộng (do VS 2008 w/3,5 chỉ):

public static class StreamCopier 
{ 
    private const long DefaultStreamChunkSize = 0x1000; 

    public static void CopyTo(this Stream from, Stream to) 
    { 
     if (!from.CanRead || !to.CanWrite) 
     { 
     return; 
     } 

     var buffer = from.CanSeek 
     ? new byte[from.Length] 
     : new byte[DefaultStreamChunkSize]; 
     int read; 

     while ((read = from.Read(buffer, 0, buffer.Length)) > 0) 
     { 
     to.Write(buffer, 0, read); 
     } 
    } 
} 

Nó có thể được sử dụng như sau:

using (var input = File.OpenRead(@"C:\wrnpc12.txt")) 
using (var output = File.OpenWrite(@"C:\wrnpc12.bak")) 
{ 
    input.CopyTo(output); 
} 

Bạn cũng có thể trao đổi logic xung quanh một chút và viết một phương thức CopyFrom().

Các vấn đề liên quan