From e84c1f8fdea3cdc7360befbda69a931450da44e8 Mon Sep 17 00:00:00 2001 From: dvohra09 Date: Mon, 10 Nov 2025 17:59:55 -0800 Subject: [PATCH 1/8] Create BlobStringConverter.java --- .../com/baeldung/BlobStringConverter.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/BlobStringConverter.java diff --git a/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/BlobStringConverter.java b/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/BlobStringConverter.java new file mode 100644 index 000000000000..b6e3fec8d5bf --- /dev/null +++ b/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/BlobStringConverter.java @@ -0,0 +1,52 @@ +import java.sql.Blob; +import java.sql.SQLException; +import java.nio.charset.StandardCharsets; +import javax.sql.rowset.serial.SerialBlob; +import java.nio.charset.StandardCharsets; + + +public class BlobStringConverter { + + /** + * Converts a java.sql.Blob object to a String using UTF-8 encoding. + * @param blob The Blob object to convert. + * @return The String representation of the Blob data. + * @throws SQLException If a database access error occurs. + */ + public static String blobToString(Blob blob) throws SQLException { + if (blob == null) { + return null; + } + + // Get the entire Blob content as a byte array + // NOTE: Blobs can be very large. Check the length before fetching the full array. + // The first argument to getBytes is the position (1-based), and the second is the length. + long length = blob.length(); + if (length > Integer.MAX_VALUE) { + throw new SQLException("Blob is too large for a single String conversion."); + } + + byte[] bytes = blob.getBytes(1, (int) length); + + // Convert the byte array to a String using the UTF-8 charset + return new String(bytes, StandardCharsets.UTF_8); + } + + /** + * Converts a String object to a java.sql.Blob using UTF-8 encoding. + * @param text The String to convert. + * @return A SerialBlob object containing the String data. + * @throws SQLException If a database access error occurs. + */ + public static Blob stringToBlob(String text) throws SQLException { + if (text == null) { + return null; + } + + // Convert the String to a byte array using the UTF-8 charset + byte[] bytes = text.getBytes(StandardCharsets.UTF_8); + + // Create a SerialBlob object from the byte array + return new SerialBlob(bytes); + } +} From 9a8f870b87425dfd5b3b6ee2947b938282283e02 Mon Sep 17 00:00:00 2001 From: dvohra09 Date: Mon, 10 Nov 2025 18:00:40 -0800 Subject: [PATCH 2/8] Rename BlobStringConverter.java to baeldungBlobStringConverter.java --- .../baeldungBlobStringConverter.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core-java-modules/core-java-string-conversions-4/src/main/java/com/{baeldung/BlobStringConverter.java => blobstringconverter/baeldungBlobStringConverter.java} (100%) diff --git a/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/BlobStringConverter.java b/core-java-modules/core-java-string-conversions-4/src/main/java/com/blobstringconverter/baeldungBlobStringConverter.java similarity index 100% rename from core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/BlobStringConverter.java rename to core-java-modules/core-java-string-conversions-4/src/main/java/com/blobstringconverter/baeldungBlobStringConverter.java From e7182b33b882a9b2c143c22339923b374b56169e Mon Sep 17 00:00:00 2001 From: dvohra09 Date: Mon, 10 Nov 2025 18:02:36 -0800 Subject: [PATCH 3/8] Update and rename core-java-modules/core-java-string-conversions-4/src/main/java/com/blobstringconverter/baeldungBlobStringConverter.java to core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java --- .../blobstringconverter/BlobStringConverter.java} | 2 ++ 1 file changed, 2 insertions(+) rename core-java-modules/core-java-string-conversions-4/src/main/java/com/{blobstringconverter/baeldungBlobStringConverter.java => baeldung/blobstringconverter/BlobStringConverter.java} (97%) diff --git a/core-java-modules/core-java-string-conversions-4/src/main/java/com/blobstringconverter/baeldungBlobStringConverter.java b/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java similarity index 97% rename from core-java-modules/core-java-string-conversions-4/src/main/java/com/blobstringconverter/baeldungBlobStringConverter.java rename to core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java index b6e3fec8d5bf..440fd57fe055 100644 --- a/core-java-modules/core-java-string-conversions-4/src/main/java/com/blobstringconverter/baeldungBlobStringConverter.java +++ b/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java @@ -1,3 +1,5 @@ +package java.com.baeldung.blobstringconverter; + import java.sql.Blob; import java.sql.SQLException; import java.nio.charset.StandardCharsets; From 13a474acb031ae75860deb9e28dcdefe443e6b43 Mon Sep 17 00:00:00 2001 From: dvohra09 Date: Mon, 10 Nov 2025 18:03:29 -0800 Subject: [PATCH 4/8] Update BlobStringConverter.java --- .../com/baeldung/blobstringconverter/BlobStringConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java b/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java index 440fd57fe055..c70425ab2db1 100644 --- a/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java +++ b/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java @@ -1,4 +1,4 @@ -package java.com.baeldung.blobstringconverter; +package com.baeldung.blobstringconverter; import java.sql.Blob; import java.sql.SQLException; From 56acc9cd5fb6fd5c9262697c53b9faf9d55cac9d Mon Sep 17 00:00:00 2001 From: dvohra09 Date: Mon, 10 Nov 2025 18:11:05 -0800 Subject: [PATCH 5/8] Create BlobStringConverterUnitTest.java --- .../BlobStringConverterUnitTest.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 core-java-modules/core-java-string-conversions-4/src/test/java/com/baeldung/blobstringconverter/BlobStringConverterUnitTest.java diff --git a/core-java-modules/core-java-string-conversions-4/src/test/java/com/baeldung/blobstringconverter/BlobStringConverterUnitTest.java b/core-java-modules/core-java-string-conversions-4/src/test/java/com/baeldung/blobstringconverter/BlobStringConverterUnitTest.java new file mode 100644 index 000000000000..35b75d6ff70a --- /dev/null +++ b/core-java-modules/core-java-string-conversions-4/src/test/java/com/baeldung/blobstringconverter/BlobStringConverterUnitTest.java @@ -0,0 +1,65 @@ +import org.junit.jupiter.api.Test; +import java.sql.Blob; +import java.sql.SQLException; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class BlobStringConverterUnitTest { + + // Test a standard ASCII string + @Test + void givenStandardAsciiString_whenPerformingConversion_thenConversionSuccessful() throws SQLException { + String originalString = "Hello, world!"; + + // String to Blob + Blob blob = BlobStringConverter.stringToBlob(originalString); + assertNotNull(blob); + + // Blob to String + String convertedString = BlobStringConverter.blobToString(blob); + + // Assert the converted string is equal to the original + assertEquals(originalString, convertedString); + } + + // Test a string with special characters (important for correct encoding) + @Test + void givenStringWithSpecialCharacters_whenPerformingConversion_thenConversionSuccessful() throws SQLException { + // String with non-ASCII characters (e.g., Japanese, German umlaut) + String originalString = "Test: こんにちは, äöü"; + + // String to Blob + Blob blob = BlobStringConverter.stringToBlob(originalString); + + // Blob to String + String convertedString = BlobStringConverter.blobToString(blob); + + assertEquals(originalString, convertedString); + } + + // Test an empty string + @Test + void givenEmptyString_whenPerformingConversion_thenConversionSuccessful() throws SQLException { + String originalString = ""; + + // String to Blob + Blob blob = BlobStringConverter.stringToBlob(originalString); + + // Blob to String + String convertedString = BlobStringConverter.blobToString(blob); + + assertEquals(originalString, convertedString); + } + + // Test null input for conversion methods + @Test + void givenNullString_whenPerformingConversion_thenConversionSuccessful() throws SQLException { + // Test String to Blob with null + assertNull(BlobStringConverter.stringToBlob(null), + "stringToBlob should return null for null input."); + + // Test Blob to String with null + assertNull(BlobStringConverter.blobToString(null), + "blobToString should return null for null input."); + } +} From 7a3ee93b722bc384d02bc021fa08f45eff67a612 Mon Sep 17 00:00:00 2001 From: dvohra09 Date: Mon, 10 Nov 2025 18:28:38 -0800 Subject: [PATCH 6/8] Update BlobStringConverterUnitTest.java --- .../blobstringconverter/BlobStringConverterUnitTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core-java-modules/core-java-string-conversions-4/src/test/java/com/baeldung/blobstringconverter/BlobStringConverterUnitTest.java b/core-java-modules/core-java-string-conversions-4/src/test/java/com/baeldung/blobstringconverter/BlobStringConverterUnitTest.java index 35b75d6ff70a..14eb2e3d2062 100644 --- a/core-java-modules/core-java-string-conversions-4/src/test/java/com/baeldung/blobstringconverter/BlobStringConverterUnitTest.java +++ b/core-java-modules/core-java-string-conversions-4/src/test/java/com/baeldung/blobstringconverter/BlobStringConverterUnitTest.java @@ -1,8 +1,11 @@ +package com.baeldung.blobstringconverter; + import org.junit.jupiter.api.Test; import java.sql.Blob; import java.sql.SQLException; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; public class BlobStringConverterUnitTest { From 9a1e4ae87d8abe83a0f1018ef3dd4016350bbca0 Mon Sep 17 00:00:00 2001 From: dvohra09 Date: Mon, 10 Nov 2025 18:39:50 -0800 Subject: [PATCH 7/8] Update BlobStringConverter.java --- .../BlobStringConverter.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java b/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java index c70425ab2db1..f44deac96896 100644 --- a/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java +++ b/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java @@ -4,8 +4,6 @@ import java.sql.SQLException; import java.nio.charset.StandardCharsets; import javax.sql.rowset.serial.SerialBlob; -import java.nio.charset.StandardCharsets; - public class BlobStringConverter { @@ -20,14 +18,18 @@ public static String blobToString(Blob blob) throws SQLException { return null; } - // Get the entire Blob content as a byte array - // NOTE: Blobs can be very large. Check the length before fetching the full array. - // The first argument to getBytes is the position (1-based), and the second is the length. long length = blob.length(); + + // FIX: Check for zero length to avoid SerialException: Invalid arguments. + if (length == 0) { + return ""; + } + if (length > Integer.MAX_VALUE) { throw new SQLException("Blob is too large for a single String conversion."); } + // Get the entire Blob content as a byte array. The position starts at 1. byte[] bytes = blob.getBytes(1, (int) length); // Convert the byte array to a String using the UTF-8 charset @@ -45,10 +47,11 @@ public static Blob stringToBlob(String text) throws SQLException { return null; } - // Convert the String to a byte array using the UTF-8 charset + // Convert the String to a byte array using the UTF-8 charset. + // This is safe even for an empty string ("") which results in a zero-length byte array. byte[] bytes = text.getBytes(StandardCharsets.UTF_8); // Create a SerialBlob object from the byte array return new SerialBlob(bytes); - } + } } From 1bfd5ec008498a8473848d84abc8e9203b88b347 Mon Sep 17 00:00:00 2001 From: dvohra09 Date: Mon, 10 Nov 2025 20:02:23 -0800 Subject: [PATCH 8/8] Update BlobStringConverter.java --- .../com/baeldung/blobstringconverter/BlobStringConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java b/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java index f44deac96896..ef3259edbc2b 100644 --- a/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java +++ b/core-java-modules/core-java-string-conversions-4/src/main/java/com/baeldung/blobstringconverter/BlobStringConverter.java @@ -20,7 +20,7 @@ public static String blobToString(Blob blob) throws SQLException { long length = blob.length(); - // FIX: Check for zero length to avoid SerialException: Invalid arguments. + // Check for zero length to avoid SerialException: Invalid arguments. if (length == 0) { return ""; }