2011-02-09 15 views
14

Jak dołączyć część tablicy bajtów do obiektu StringBuilder w Javie? Mam segment funkcji odczytywanej ze strumienia InputStream do tablicy bajtów. Następnie chcę dołączyć co czytam w obiekt StringBuilder:dołączyć część tablicy bajtów java do 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 
} 

Odpowiedz

18

Nie należy używać StringBuilder dla tego, ponieważ może to spowodować błędy kodowania dla kodowania o zmiennej szerokości. Można użyć java.io.ByteArrayOutputStream zamiast, i przekonwertować go na ciąg, kiedy wszystkie dane zostały odczytane:

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 

Jeśli kodowanie jest wiadomo, że nie zawierają sekwencje wielobajtowe (ty pracują z danymi ASCII, na przykład) , a następnie będzie działać StringBuilder.

12

Można po prostu utworzyć ciąg ze swojego bufora:

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

Następnie jeśli trzeba można po prostu dołączyć go do StringBuilder.

+2

Jakie kodowanie wykorzystuje twój tekst? Powyższa metoda będzie działała z ASCII, ale może zawieść w przypadku dowolnych wielobajtowych łańcuchów, takich jak UTF-8 lub UTF-16 (możesz odczytać częściowy ciąg z bufora i uzyskać na końcu tylko połowę definicji znaku, a także pozostawić nieprawidłowy początek dla następnej części) – tomash

+3

'String s = nowy ciąg (bufor, 0, len," UTF-8 ");' dla innych kodowań niż ASCII –

+0

Czy sprawdziłeś przypadkiem, czy działa on szybciej niż 'ByteArrayOutputStream'? Przypuszczam, że tak będzie. – Kashyap

-2

Coś jak poniżej powinno załatwić sprawę.

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