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]

Reply via email to