2010-08-24 32 views
5

Hiho,sao chép luồng qua byte []

tôi phải sao chép luồng nhập. Và sau một chút tìm kiếm trên mạng, tôi đã thử điều này với sự giúp đỡ của một con mồi. Mã của tôi trông như thế này ("được" là inputstream):

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    while (is.read() != -1) { 
     bos.write(is.read()); 
    } 
    byte[] ba = bos.toByteArray(); 

    InputStream test = new ByteArrayInputStream(ba); 
    InputStream test2 = new ByteArrayInputStream(ba); 

Và nó hoạt động .. gần

Trong cả hai dòng, programm sao chép chỉ có mỗi nhân vật thứ hai Vì vậy, "DOR A =" 104 "/>" trong "is" -stream trở thành: "O = 14 /" trong các luồng khác

Sự cố là gì? tôi không thể hiểu những gì đang xảy ra.

Hope ai có thể cung cấp cho tôi những giải pháp :)

lời chào

Trả lời

6

Bạn phải gán byte đọc trong while vòng lặp để một biến. Trong mã hiện tại của bạn, bạn chỉ cần loại bỏ nó. Sau đây là chính xác:

int b; 
while((b = read()) != -1) { 
    bos.write(b); 
} 

Tất nhiên đọc một byte không hiệu quả lắm. Bạn nên cân nhắc sử dụng mảng byte trong phiên bản tiếp theo của mình.

+1

Cảm ơn rất nhiều! tôi hiểu vấn đề là gì :) (vì tôi đã sử dụng phương pháp đọc hai lần nó nhảy hai lần) – Graslandpinguin

+0

Nó không chính xác. Nó không biên dịch. Bạn không thể khai báo biến trong một điều kiện trong khi. – EJP

+0

@EJP: Vậy tại sao bạn quay lại sửa chữa của mình (và có thể đã chọn để downvote thay thế)? – musiKk

16

Đó là bởi vì bạn bỏ qua tất cả các nhân vật kỳ lạ, trừ khi họ là -1, bằng cách gọi read() hai lần trong vòng lặp của bạn. Dưới đây là cách đúng bằng một bộ đệm (bạn có thể điều chỉnh kích thước bộ đệm):

int count; 
byte[] buffer = new byte[8192]; 
while ((count = in.read(buffer)) > 0) 
    out.write(buffer, 0, count); 
Các vấn đề liên quan