Jeśli potrzebne są krótkie instrukcje, wówczas nie ma sposobu na przejście między krokami String. Konstruktor String miksuje konwersję i konstruowanie obiektów dla wygody w bardzo częstym przypadku, ale nie ma takiego konstruktora wygody dla StringBuilder.
Jeśli jest wydajność jesteś zainteresowany, to możesz uniknąć pośredniego obiekt String za pomocą czegoś takiego:
new StringBuilder(Charset.forName(charsetName).decode(ByteBuffer.wrap(inBytes)))
Jeśli chcesz, aby móc dostroić wydajność, można kontrolować Odszyfruj samemu. Na przykład możesz nie używać zbyt dużej ilości pamięci, używając wartości averageCharsPerByte jako szacunkowej ilości pamięci potrzebnej. Zamiast zmiany rozmiaru bufora, jeśli oszacowanie było zbyt krótkie, można użyć wynikowego StringBuilder do gromadzenia wszystkich części.
CharsetDecoder cd = Charset.forName(charsetName).newDecoder();
cd.onMalformedInput(CodingErrorAction.REPLACE);
cd.onUnmappableCharacter(CodingErrorAction.REPLACE);
int lengthEstimate = Math.ceil(cd.averageCharsPerByte()*inBytes.length) + 1;
ByteBuffer inBuf = ByteBuffer.wrap(inBytes);
CharBuffer outBuf = CharBuffer.allocate(lengthEstimate);
StringBuilder out = new StringBuilder(lengthEstimate);
CoderResult cr;
while (true) {
cr = cd.decode(inBuf, outBuf, true);
out.append(outBuf);
outBuf.clear();
if (cr.isUnderflow()) break;
if (!cr.isOverflow()) cr.throwException();
}
cr = cd.flush(outBuf);
if (!cr.isUnderflow()) cr.throwException();
out.append(outBuf);
Wątpię jednak, czy powyższy kod będzie wart wysiłku w większości aplikacji. Jeśli aplikacja jest zainteresowana wydajnością, prawdopodobnie nie powinna zajmować się również StringBuilder, ale obsługuje wszystko na poziomie bufora.
Śmiem twierdzić, że nie jest to teoretycznie optymalne, ale czy w rzeczywistości jest to * problem *? Czy wykonałeś odpowiednie testy, aby pokazać, jaki ma to wpływ? –
Co jest następną rzeczą, którą robisz z tym StringBuilderem? – Thilo
Jeśli chcesz mieć większą kontrolę nad procesem dekodowania i jakiej pamięci używasz, możesz bezpośrednio użyć ['CharsetDecoder'] (http://docs.oracle.com/javase/7/docs/api/java/nio/charset /CharsetDecoder.html) i dekodować w dedykowanym 'CharBuffer' (zamiast używać' StringBuilder'). –