2014-06-05 19 views
11

Tôi đọc this post nhưng tôi không theo dõi. Tôi đã thấy this nhưng chưa thấy ví dụ thích hợp về việc chuyển đổi ByteArrayInputStream thành String bằng cách sử dụng ByteArrayOutputStream.Chuyển đổi nội dung của A ByteArrayInputStream thành chuỗi

Để truy xuất nội dung của ByteArrayInputStream dưới dạng String, đang sử dụng một đề xuất ByteArrayOutputstream hoặc có cách nào thích hợp hơn không?

Tôi đã xem xét this example và mở rộng ByteArrayInputStream và sử dụng Decorator để tăng chức năng tại thời gian chạy. Bất kỳ sự quan tâm nào trong việc này là một giải pháp tốt hơn để sử dụng một số ByteArrayOutputStream?

+1

Bạn có thể muốn một 'InputStreamReader', như được mô tả trong liên kết thứ hai mà bạn đã cung cấp. Một 'ByteArrayOutputStream' sẽ không chuyển đổi byte thành ký tự. –

+0

Bạn có thực sự có một ByteArrayInputStream (có nghĩa là bạn có một byte []) hay bạn chỉ có một InputStream? –

+0

@BrettOkken Tôi thực sự có một ByteArrayInputStream có hàm tạo được truyền một mảng byte (kích thước khác nhau) – Mushy

Trả lời

23

Một ByteArrayOutputStream có thể đọc từ bất kỳ InputStream đồng năng suất cuối một byte[].

Tuy nhiên với một ByteArrayInputStream nó là đơn giản:

int n = in.available(); 
byte[] bytes = new byte[n]; 
in.read(bytes, 0, n); 
String s = new String(bytes, StandardCharsets.UTF_8); // Or any encoding. 

Đối với một ByteArrayInputStreamavailable() mang lại tổng số byte.


trả lời bình luận: sử dụng ByteArrayOutputStream

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
byte[] buf = new byte[8192]; 
for (;;) { 
    int nread = in.read(buf, 0, buf.length); 
    if (nread <= 0) { 
     break; 
    } 
    baos.write(buf, 0, nread); 
} 
in.close(); 
baos.close(); 
byte[] bytes = baos.toByteArray(); 

đây trong có thể là bất kỳ InputStream.

+1

Làm thế nào một ByteArrayOutputStream đọc từ một ByteArrayInputStream? – Mushy

+1

Tôi đã mở rộng câu trả lời. Về nguyên tắc, một vòng lặp đọc từ 'InputStream' và ghi vào' ByteArrayOutputStream'. Theo truyền thống, bộ đệm I/O có kích thước nghi lễ là sức mạnh của 2. –

+0

Đồng ý với sức mạnh của 2 kích thước; Tôi thích điều đó và cảm ơn bạn. – Mushy

1

Sử dụng Scanner và chuyển cho constructor của nó các ByteArrayInputStream sau đó đọc dữ liệu từ máy quét của bạn, kiểm tra ví dụ này:

ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(new byte[] { 65, 80 }); 
Scanner scanner = new Scanner(arrayInputStream); 
scanner.useDelimiter("\\Z");//To read all scanner content in one String 
String data = ""; 
if (scanner.hasNext()) 
    data = scanner.next(); 
System.out.println(data); 
+0

Nếu tôi có tài liệu 'XML' hoặc' HTML', tôi có thể đọc nó mà không có giới hạn không? – Mushy

+0

Có, không có giới hạn. – Mifmif

1

Sử dụng Base64 mã hóa

Giả sử bạn có ByteArrayOutputStream của bạn:

ByteArrayOutputStream baos =... 
String s = new String(Base64.Encoder.encode(baos.toByteArray())); 

Xem http://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html

+0

Giải pháp tốt. Nhưng, tôi sẽ cần phải đầu tiên kết nối ByteArrayInputStream của tôi vào ByteArrayOutputStream của tôi. Làm thế nào là hoàn thành? – Mushy

+1

Điều quan trọng là phải nói rằng Base64.Encoder được phát hành trong Java 8. :) – Jacobi

+0

Nó phải là String s = new String (Base64.getEncoder(). Encode (baos.toByteArray())); cảm ơn mặc dù. –

6

Tại sao không ai đề cập org.apache.commons.io.IOUtils?

import java.nio.charset.StandardCharsets; 
import org.apache.commons.io.IOUtils; 

String result = IOUtils.toString(in, StandardCharsets.UTF_8); 

Chỉ một dòng mã.

+0

Tôi đã thêm hai câu lệnh 'import' bắt buộc để không phải ai cũng phải tìm kiếm chúng. Xin lỗi ... nó không chỉ là một dòng mã nữa;) – dokaspar

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