2011-02-09 19 views
14

¿Cómo añado una porción de la matriz de bytes a un objeto StringBuilder en Java? Tengo un segmento de una función que lee desde un InputStream en una matriz de bytes. entonces quiero añadir lo leí en un objeto StringBuilder:anexar parte de la matriz de bytes de Java a 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 
} 

Respuesta

18

No use un StringBuilder para esto, ya que esto puede causar errores de codificación para la codificación de ancho variable. Puede utilizar un java.io.ByteArrayOutputStream lugar, y convertirla en una cadena cuando todos los datos han sido leídos:

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 

Si la codificación se sabe que no contiene secuencias de múltiples bytes (que está trabajando con datos ASCII, por ejemplo) , entonces usar un StringBuilder funcionará.

12

Se podía crear una cadena de su memoria intermedia:

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

A continuación, si necesita que sólo puede agregarlo a un StringBuilder.

+2

¿Qué codificación usa el texto? El método anterior funcionará con ASCII pero puede fallar en cadenas de varios bytes como UTF-8 o UTF-16 (puede leer una cadena parcial desde el búfer y obtener solo la mitad de la definición de char al final, dejando también el comienzo no válido para la siguiente porción) – tomash

+3

'Cadena s = nueva Cadena (buffer, 0, len," UTF-8 ");' para otras codificaciones que ASCII –

+0

¿Revisó por casualidad si esto funciona más rápido que 'ByteArrayOutputStream'? Supongo que sí. – Kashyap

-2

Algo como a continuación debería hacer el truco para usted.

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 
Cuestiones relacionadas