2008-09-24 23 views
9

Có một thành ngữ chính xác hơn/tiêu chuẩn (ví dụ, một phương pháp JDK) cho "đường ống" đầu vào cho đầu ra trong Java không?Thành ngữ Java cho "đường ống"

 
public void pipe(Reader in, Writer out) { 
    CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); 
    while(in.read(buf) >= 0) { 
     out.append(buf.flip()); 
     buf.clear(); 
    } 
} 

[EDIT] Xin lưu ý ReaderWriter được cho. Câu trả lời đúng sẽ chứng minh làm thế nào để có inout và tạo thành một đường ống (tốt nhất là không có nhiều hơn 1 hoặc 2 cuộc gọi phương pháp). Tôi sẽ chấp nhận câu trả lời trong đó inoutInputStream và một OutputStream (tốt hơn là với chuyển đổi từ/đến Reader/Writer). Tôi sẽ không chấp nhận câu trả lời trong đó in hoặc out là một lớp con của Reader/InputStream hoặc Writer/OutputStrem.

+0

bản sao có thể có của [Cách dễ dàng để ghi nội dung của một luồng đầu vào Java vào một luồng đầu ra] (http://stackoverflow.com/questions/43157/easy-way-to-write-contents-of-a-java-inputstream -to-an-outputstream) –

Trả lời

10

từ dự án Apache Commons có số utilily methods thực hiện chính xác những gì bạn cần.

IOUtils.copy(in, out) sẽ thực hiện bản sao đệm của tất cả đầu vào đến đầu ra. Nếu có nhiều điểm trong codebase của bạn yêu cầu xử lý Stream hoặc Reader/Writer, sử dụng IOUtils có thể là một ý tưởng hay.

+0

Wow Apache Commons là một dự án thực sự ấn tượng, chúng làm xước tất cả các vết ngứa của tôi trước khi tôi nhận ra chúng. –

+0

+1 cho Apache Commons –

1

Hãy xem java.io.PipedInputStreamPipedOutputStream hoặc PipedReader/PipedWriter từ cùng một gói.

Từ Tài liệu của PipedInputStream:

Một đường ống input stream nên được kết nối với một dòng đầu ra bằng đường ống; luồng đầu vào đường ống sau đó cung cấp bất kỳ byte dữ liệu nào được ghi vào luồng đầu ra của đường ống. Thông thường, dữ liệu được đọc từ một đối tượng PipedInputStream bởi một luồng và dữ liệu được ghi vào PipedOutputStream tương ứng bằng một số luồng khác. Không nên sử dụng cả hai đối tượng từ một sợi đơn vì nó có thể bế tắc sợi chỉ. Luồng đầu vào đường ống chứa một bộ đệm, tách các hoạt động đọc khỏi các hoạt động ghi, trong giới hạn. Một đường ống được cho là bị hỏng nếu một luồng cung cấp byte dữ liệu cho luồng đầu ra đường ống được kết nối không còn sống nữa.

+0

Có cách nào để xây dựng PipedInputStream từ một InputStream đã cho (hoặc Reader) không? –

+0

Tôi tin rằng bạn có thể làm một cái gì đó như "PipedInputStream mới (theInputStreamInstance)" (tức là, "bọc InputStream với PipedInputStream). –

+0

Xin lỗi, nhảy trước khi tôi nhìn.: (Có vẻ như không có cách nào để lấy một luồng hiện có và biến nó thành Một PipedInputStream phải được gắn với PipedOutputStream Nếu bạn muốn, bạn có thể chuyển byte từ InputStream sang PipedOutputStream được gắn với PipedInputStream –

1

Tối ưu hóa duy nhất có sẵn là thông qua FileChannels trong API NIO: Reads, Writes. JVM có thể tối ưu hóa cuộc gọi này để di chuyển dữ liệu từ một tệp đến Kênh đích mà trước tiên không phải di chuyển dữ liệu đến không gian hạt nhân. Xem this article để biết chi tiết.

+0

Làm thế nào để lấy một FileChannel từ Reader, Writer, InputStream , hoặc OutputStream? –

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