2011-02-09 69 views
14

Làm cách nào để nối thêm một phần mảng byte vào đối tượng StringBuilder trong Java? Tôi có một phân đoạn của một hàm đọc từ InputStream thành một mảng byte. sau đó tôi muốn thêm bất cứ điều gì tôi đọc vào một đối tượng StringBuilder:nối thêm một phần của mảng byte java vào StringBuilder

byte[] buffer = new byte[4096]; 
InputStream is; 
// 
//some setup code 
// 
while (is.available() > 0) 
{ 
    int len = is.read(buffer); 
    //I want to append buffer[0] to buffer[len] into StringBuilder at this point 
} 

Trả lời

18

Bạn không nên sử dụng StringBuilder vì điều này có thể gây ra lỗi mã hóa cho mã hóa có chiều rộng thay đổi. Bạn có thể sử dụng một java.io.ByteArrayOutputStream thay vào đó, và chuyển đổi nó thành một chuỗi khi tất cả các dữ liệu đã được đọc:

byte[] buffer = new byte[4096]; 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
InputStream is; 
// 
//some setup code 
// 
while (is.available() > 0) { 
    int len = is.read(buffer); 
    out.write(buffer, 0, len); 
} 
String result = out.toString("UTF-8"); // for instance 

Nếu mã hóa được biết là không có trình tự đa byte (bạn đang làm việc với các dữ liệu ASCII, ví dụ) , sau đó sử dụng StringBuilder sẽ hoạt động.

12

Bạn chỉ có thể tạo ra một String ra của bộ đệm của bạn:

String s = new String(buffer, 0, len);

Sau đó, nếu bạn cần bạn chỉ có thể thêm nó cho một StringBuilder.

+2

Văn bản của bạn sử dụng văn bản nào? Phương thức trên sẽ làm việc với ASCII nhưng có thể thất bại trên bất kỳ chuỗi nhiều byte nào như UTF-8 hoặc UTF-16 (bạn có thể đọc một phần chuỗi từ bộ đệm và chỉ nhận được một nửa định nghĩa char ở cuối; – tomash

+3

'String s = chuỗi mới (buffer, 0, len," UTF-8 ");' cho các mã hóa khác hơn ASCII –

+0

Bạn có kiểm tra bằng bất kỳ cơ hội nào nếu điều này thực hiện nhanh hơn 'ByteArrayOutputStream' không? Tôi cho là vậy. – Kashyap

-2

Thứ gì đó như dưới đây sẽ thực hiện thủ thuật cho bạn.

byte[] buffer = new byte[3]; 
buffer[0] = 'a'; 
buffer[1] = 'b'; 
buffer[2] = 'c'; 
StringBuilder sb = new StringBuilder(new String(buffer,0,buffer.length-1)); 
System.out.println("buffer has:"+sb.toString()); //prints ab 
Các vấn đề liên quan