This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-mime4j.git
commit 6caa08a24e47490d097965efe174e768bfac8f38 Author: Benoit TELLIER <[email protected]> AuthorDate: Sun Mar 8 22:16:50 2026 +0100 [PERF] String allocation & conversions ByteArrayBuffer.toString() creates an intermediate byte array + a new String per field header. Direction: Expose a CharBuffer or compare directly in bytes on hot paths. Check if ContentUtil.asString() can reuse a CharsetDecoder instantiated once per thread. --- .../apache/james/mime4j/util/ByteArrayBuffer.java | 3 ++- .../org/apache/james/mime4j/util/ContentUtil.java | 26 +++++----------------- .../james/mime4j/util/RecycledByteArrayBuffer.java | 3 ++- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/org/apache/james/mime4j/util/ByteArrayBuffer.java b/core/src/main/java/org/apache/james/mime4j/util/ByteArrayBuffer.java index 6aa0f193..6183a6d1 100644 --- a/core/src/main/java/org/apache/james/mime4j/util/ByteArrayBuffer.java +++ b/core/src/main/java/org/apache/james/mime4j/util/ByteArrayBuffer.java @@ -19,6 +19,7 @@ package org.apache.james.mime4j.util; +import java.nio.charset.StandardCharsets; /** * A resizable byte array. @@ -175,7 +176,7 @@ public final class ByteArrayBuffer implements ByteSequence { @Override public String toString() { - return new String(toByteArray()); + return new String(this.buffer, 0, this.len, StandardCharsets.ISO_8859_1); } } diff --git a/core/src/main/java/org/apache/james/mime4j/util/ContentUtil.java b/core/src/main/java/org/apache/james/mime4j/util/ContentUtil.java index b5c365dc..d4257b76 100644 --- a/core/src/main/java/org/apache/james/mime4j/util/ContentUtil.java +++ b/core/src/main/java/org/apache/james/mime4j/util/ContentUtil.java @@ -221,6 +221,9 @@ public class ContentUtil { if (byteSequence == null) { return null; } + if (byteSequence instanceof ByteArrayBuffer) { + return new String(((ByteArrayBuffer) byteSequence).buffer(), offset, length, StandardCharsets.ISO_8859_1); + } char[] underlying = new char[length]; for (int i = offset; i < offset + length; i++) { underlying[i - offset] = (char) (byteSequence.byteAt(i) & 0xff); @@ -316,12 +319,7 @@ public class ContentUtil { if (b == null) { return null; } - try { - return new String(b, (charset != null ? charset : Charsets.DEFAULT_CHARSET).name()); - } catch (UnsupportedEncodingException ex) { - // Should never happen - throw new Error(ex); - } + return new String(b, charset != null ? charset : Charsets.DEFAULT_CHARSET); } public static String toAsciiString(final byte[] b) { @@ -332,13 +330,7 @@ public class ContentUtil { if (b == null) { return null; } - try { - return new String(b, off, len, - (charset != null ? charset : Charsets.DEFAULT_CHARSET).name()); - } catch (UnsupportedEncodingException ex) { - // Should never happen - throw new Error(ex); - } + return new String(b, off, len, charset != null ? charset : Charsets.DEFAULT_CHARSET); } public static String toAsciiString(final byte[] b, int off, int len) { @@ -349,13 +341,7 @@ public class ContentUtil { if (b == null) { return null; } - try { - return new String(b.buffer(), 0, b.length(), - (charset != null ? charset : Charsets.DEFAULT_CHARSET).name()); - } catch (UnsupportedEncodingException ex) { - // Should never happen - throw new Error(ex); - } + return new String(b.buffer(), 0, b.length(), charset != null ? charset : Charsets.DEFAULT_CHARSET); } public static String toAsciiString(final ByteArrayBuffer b) { diff --git a/core/src/main/java/org/apache/james/mime4j/util/RecycledByteArrayBuffer.java b/core/src/main/java/org/apache/james/mime4j/util/RecycledByteArrayBuffer.java index 900381a4..500a7127 100644 --- a/core/src/main/java/org/apache/james/mime4j/util/RecycledByteArrayBuffer.java +++ b/core/src/main/java/org/apache/james/mime4j/util/RecycledByteArrayBuffer.java @@ -19,6 +19,7 @@ package org.apache.james.mime4j.util; +import java.nio.charset.StandardCharsets; /** * A resizable byte array. @@ -177,7 +178,7 @@ public final class RecycledByteArrayBuffer implements ByteSequence { @Override public String toString() { - return new String(toByteArray()); + return new String(this.buffer, 0, this.len, StandardCharsets.ISO_8859_1); } public void release() { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
