2010-09-20 17 views
11

BinaryReader không có thuộc tính EndOfStream. Có an toàn để sử dụng mã sau đây để kiểm tra xem có kết thúc luồng không?EndOfStream cho BinaryReader

reader.BaseStream.Length>reader.BaseStream.Position

+0

Loại luồng nào? Không phải tất cả các luồng đều biết chiều dài của chúng lên phía trước. –

Trả lời

7

Điều đó tùy thuộc. Có nhiều loại luồng khác nhau không triển khai thuộc tính Độ dài hoặc Vị trí, bạn sẽ nhận được NotSupportedException. Ví dụ: NetworkStream. Tất nhiên, nếu bạn sử dụng một luồng như vậy thì bạn thực sự phải biết trước bao lâu để gọi phương thức BinaryReader.Read(). Vì vậy, có, nó là tốt.

+1

Đây không phải là phổ biến ... Có thể có một tình huống khi bạn cần đọc đến phần cuối của NetworkStream (điều này xảy ra khi bên kia đóng kết nối). – torvin

+0

Kỳ vọng là phía bên kia nói lời tạm biệt một cách độc đáo. Nếu nó không thì ngoại lệ bạn nhận được khi bạn tiếp tục đọc từ một kết nối khép kín chắc chắn là phổ quát. –

-1

Đó là những gì tôi đã luôn luôn làm trong quá khứ và tôi chưa bao giờ thấy một vấn đề với nó. Mã sử ​​dụng nó đã được trong một môi trường sản xuất trong 2 năm.

+5

Hãy thử nó trên một DeflateStream đôi khi. . . –

+0

Và với loại luồng nào? –

+0

@Jim Tôi không biết điều đó. Đó là thông tin tốt, cảm ơn. Câu trả lời của Henk nhận được +1 rồi. –

2

Điều này sẽ không hoạt động như một giải pháp chung vì nó giả định rằng giá trị BaseStream hỗ trợ thuộc tính Length. Nhiều việc thực hiện Stream không thay thế và thay vào đó hãy ném NotSupportedException. Đặc biệt, bất kỳ luồng cơ sở mạng nào như HttpRequestStreamNetworkStream

10

Cách dễ nhất tôi tìm thấy là kiểm tra giá trị trả về của phương thức PeekChar() của BinaryReader. Nếu nó trả về -1, thì bạn đã đến cuối luồng.

+1

Tính năng này hoạt động trừ khi Luồng cơ bản không hỗ trợ tìm kiếm. –

+0

Có, tôi cũng phát hiện ra rằng trong thực tế, nếu bạn gọi 'PeekChar()' thường xuyên, nó có thể rất chậm khi xử lý các tệp. –

+0

Đồng thời, có vẻ như sẽ ném ngoại lệ nếu dữ liệu tại vị trí đó xảy ra là một ký tự không hợp lệ. Đôi khi tôi nhận được điều này: 'System.ArgumentException: Bộ đệm đầu ra là quá nhỏ để chứa các ký tự được giải mã, mã hóa 'Unicode (UTF-8)' dự phòng 'System.Text.DecoderReplacementFallback'.' –

1

Tôi nhận thấy rằng việc so sánh Vị trí với Độ dài KHÔNG hoạt động trên StreamReader ngay cả khi BaseStream bên dưới hỗ trợ tìm kiếm. Dường như bộ đệm StreamReader đọc trước từ BaseStream. Đây phải là lý do tại sao StreamReader cung cấp một thuộc tính EndOfStream, đó là một điều tốt, và tôi muốn BinaryReader cũng làm như vậy. Kiểm tra các giá trị này (Độ dài và Vị trí) trên dòng cơ sở trên BinaryReader để không hoạt động như StreamReader, tức là dựa vào BinaryReader chỉ lấy số byte chính xác từ BaseStream cần để thực hiện cuộc gọi phương thức của người dùng. Có lẽ nếu BinaryReader trong thực tế hoạt động theo cách này thì đó là lý do tại sao nó không cần cung cấp EndOfStream, nhưng tôi chắc chắn nó muốn cung cấp một EndOfStream để tôi biết rằng phần cuối của tệp đã được xử lý đúng cách cho khách hàng theo cách độc lập.

Tất nhiên Người đọc không phải là Luồng, nhưng đối với kết thúc hành vi tệp thì sẽ tốt hơn nếu có giao diện chung cho phép khách hàng của lớp đầu vào/đầu ra biết được A. kết thúc tệp là một khái niệm hợp lý nguồn dữ liệu cơ bản và B. khi kết thúc tệp xảy ra nếu A là hợp lý.

0

Kiểm tra thuộc tính Dòng sản phẩm CanSeek. Nếu thuộc tính này trả về true thì bạn có thể so sánh các luồng Độ dài với Vị trí của luồng để biết liệu bạn có đang ở cuối luồng không. Nếu thuộc tính này trả về false thì điều này sẽ không hoạt động.

Đối với luồng mạng bạn có thể cần phải phân biệt giữa phần cuối của các byte khả dụng (máy khách ở đầu kia vẫn còn nhiều thứ để viết nhưng chưa) và luồng đang bị đóng. Thuộc tính IsConnected cho kết nối Tcp cơ bản không đáng tin cậy khi biết luồng đã đóng. Có thể liệt kê các kết nối mà máy tính có và xem luồng bạn đang sử dụng có nằm trong số đó không. Điều này đáng tin cậy hơn, nhưng phức tạp hơn. Có thể tốt hơn nếu chỉ xử lý IOExceptions khi bạn không thể đọc bất kỳ loại nào của

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