2011-02-09 12 views
14

Come si aggiunge una porzione di array di byte a un oggetto StringBuilder in Java? Ho un segmento di una funzione che legge da un InputStream in un array di byte. Allora voglio accodare tutto ciò che ho letto in un oggetto StringBuilder:aggiungi la parte dell'array java byte 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 
} 

risposta

18

Si consiglia di non utilizzare un StringBuilder per questo, dal momento che questo può causare errori di codifica per codifiche a larghezza variabile. È possibile utilizzare un java.io.ByteArrayOutputStream invece, e convertirlo in una stringa quando tutti i dati sono stati letti:

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 

Se la codifica è noto per non contenere sequenze multi-byte (si sta lavorando con i dati ASCII, per esempio) , quindi utilizzare un StringBuilder funzionerà.

12

Si potrebbe semplicemente creare una stringa di buffer:

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

Quindi se avete bisogno di si può semplicemente aggiungerlo a un StringBuilder.

+2

Quale codifica utilizza il testo? Il metodo sopra funzionerà con ASCII ma potrebbe fallire su qualsiasi stringa multi-byte come UTF-8 o UTF-16 (puoi leggere la stringa parziale dal buffer e ottenere solo metà della definizione del char alla fine, lasciando anche l'inizio non valido per la porzione successiva) – tomash

+3

'String s = new String (buffer, 0, len," UTF-8 ");' per altre codifiche che ASCII –

+0

Hai verificato per caso se questo si esegue più velocemente di 'ByteArrayOutputStream'? Suppongo che lo farà. – Kashyap

-2

Qualcosa come di seguito dovrebbe fare il trucco per voi.

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