Se si tratta di istruzioni brevi desiderate, non vi è alcun modo per aggirare il passaggio Stringa. Il costruttore di stringhe mescola la conversione e la costruzione di oggetti per convenienza in un caso molto comune, ma non esiste un costruttore di tale convenienza per un oggetto StringBuilder.
Se si tratta di prestazioni che ti interessa, allora si potrebbe evitare l'oggetto String intermedio utilizzando qualcosa di simile:
new StringBuilder(Charset.forName(charsetName).decode(ByteBuffer.wrap(inBytes)))
Se si vuole essere in grado di mettere a punto le prestazioni, è possibile controllare il decodifica te stesso. Ad esempio, potresti voler evitare di usare troppa memoria, usando averageCharsPerByte come stima di quanta memoria sarà necessaria. Invece di ridimensionare il buffer se tale stima era troppo breve, è possibile utilizzare lo StringBuilder risultante per accumulare tutte le parti.
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);
Dubito che il codice sopra varrà la pena nella maggior parte delle applicazioni, però. Se un'applicazione è interessata alle prestazioni, probabilmente non dovrebbe occuparsi di StringBuilder, ma gestirà tutto a livello di buffer.
Oserei dire che non è teoricamente ottimale, ma in realtà è un * problema *? Hai fatto test appropriati per mostrare quale impatto ha questo? –
Qual è la prossima cosa che stai facendo con quel StringBuilder? – Thilo
Se si desidera un maggiore controllo sul processo di decodifica e sulla memoria utilizzata, è possibile utilizzare direttamente un ['CharsetDecoder'] (http://docs.oracle.com/javase/7/docs/api/java/nio/charset /CharsetDecoder.html) e decodificare in un 'CharBuffer' dedicato (invece di usare' StringBuilder'). –