Si son enunciados cortos los que desea, no hay forma de evitar el paso de String en el medio. El constructor String mezcla la conversión y la construcción de objetos para mayor comodidad en un caso muy común, pero no existe un constructor de conveniencia para StringBuilder.
Si se trata de rendimiento le interesa, entonces es posible que evite el objeto de cadena intermedia mediante el uso de algo como esto:
new StringBuilder(Charset.forName(charsetName).decode(ByteBuffer.wrap(inBytes)))
Si usted quiere ser capaz de ajustar el rendimiento, se puede controlar el decodificar el proceso usted mismo. Por ejemplo, es posible que desee evitar el uso de demasiada memoria, utilizando averageCharsPerByte como una estimación de la cantidad de memoria que se necesitará. En lugar de cambiar el tamaño del búfer si ese cálculo era demasiado corto, podría usar el StringBuilder resultante para acumular todas las partes.
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);
Sin embargo, dudo que el código anterior valga la pena en la mayoría de las aplicaciones. Si una aplicación está interesada en el rendimiento, probablemente no debería tratar con StringBuilder tampoco, pero maneja todo a nivel del búfer.
Me atrevo a decir que no es teóricamente óptimo, ¿pero en realidad es un * problema *? ¿Has hecho las pruebas adecuadas para demostrar el impacto que esto está teniendo? –
¿Qué es lo siguiente que estás haciendo con ese StringBuilder? – Thilo
Si desea tener más control sobre el proceso de decodificación y qué memoria usa, puede usar directamente un ['CharsetDecoder'] (http://docs.oracle.com/javase/7/docs/api/java/nio/charset) /CharsetDecoder.html) y decodificar en un 'CharBuffer' dedicado (en lugar de usar un' StringBuilder'). –