Of course! Here’s a comprehensive guide to using Base64 encoding and decoding in Java, covering the modern, recommended approach and the older, deprecated one.

What is Base64?
Base64 is an encoding scheme that represents binary data in an ASCII string format. It's not encryption; it's a way to safely transmit data over media that are designed to handle text. It converts binary data (like images, files, or encrypted data) into a string of "safe" characters (A-Z, a-z, 0-9, '+', '/', and '=').
The Modern Approach (Java 8+)
Since Java 8, the java.util package includes a dedicated java.util.Base64 class. This is the recommended way to handle Base64 operations. It's clean, efficient, and part of the standard library.
Key Classes and Methods
java.util.Base64: The main class for getting an encoder/decoder.java.util.Base64.Encoder: An encoder for the Base64 encoding scheme.java.util.Base64.Decoder: A decoder for the Base64 encoding scheme.
Common Methods on Base64:
getEncoder(): Returns a Base64 encoder that encodes using the basic type.getMimeEncoder(): Returns a Base64 encoder that encodes using the MIME type, which adds line breaks at regular intervals.getUrlEncoder(): Returns a Base64 encoder that encodes using the URL and filename safe variant.getDecoder(): Returns a Base64 decoder for the basic type.getMimeDecoder(): Returns a Base64 decoder for the MIME type.getUrlDecoder(): Returns a Base64 decoder for the URL and filename safe variant.
Code Examples
Let's look at the most common use cases.
Example 1: Basic Encoding and Decoding (Strings)
This is the simplest case, converting a String to a Base64 string and back.

import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class Base64Example {
public static void main(String[] args) {
// The original string
String originalString = "Hello, World! This is a test.";
// 1. Encode the String to Base64
// We need to convert the String to bytes first using a standard charset (UTF-8)
byte[] originalBytes = originalString.getBytes(StandardCharsets.UTF_8);
Base64.Encoder encoder = Base64.getEncoder();
String encodedString = encoder.encodeToString(originalBytes);
System.out.println("Original String: " + originalString);
System.out.println("Encoded String: " + encodedString);
// 2. Decode the Base64 String back to the original String
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedBytes = decoder.decode(encodedString);
// Convert the byte array back to a String
String decodedString = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println("Decoded String: " + decodedString);
// Verification
System.out.println("Are original and decoded strings equal? " + originalString.equals(decodedString));
}
}
Output:
Original String: Hello, World! This is a test.
Encoded String: SGVsbG8sIFdvcmxkISBUaGlzIGlzIGEgdGVzdC4=
Decoded String: Hello, World! This is a test.
Are original and decoded strings equal? true
Example 2: Encoding and Decoding Binary Data (like a File)
The encode and decode methods work directly with byte arrays, making them perfect for handling any binary data.
import java.util.Base64;
public class Base64BinaryExample {
public static void main(String[] args) {
// Let's use a simple byte array as a stand-in for file data
byte[] originalData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// --- Encoding ---
Base64.Encoder encoder = Base64.getEncoder();
byte[] encodedBytes = encoder.encode(originalData);
System.out.println("Original Data: " + bytesToHex(originalData));
System.out.println("Encoded Bytes: " + new String(encodedBytes)); // Base64 is a String representation
System.out.println("Encoded String: " + encoder.encodeToString(originalData));
// --- Decoding ---
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedBytes = decoder.decode(encodedBytes);
System.out.println("Decoded Bytes: " + bytesToHex(decodedBytes));
// Verification
boolean areEqual = java.util.Arrays.equals(originalData, decodedBytes);
System.out.println("Are original and decoded byte arrays equal? " + areEqual);
}
// Helper method to print byte arrays in a readable hex format
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X ", b));
}
return sb.toString();
}
}
Output:
Original Data: 01 02 03 04 05 06 07 08 09 0A
Encoded Bytes: AQIDBAUGBwgJ
Encoded String: AQIDBAUGBwgJ
Decoded Bytes: 01 02 03 04 05 06 07 08 09 0A
Are original and decoded byte arrays equal? true
Example 3: URL and Filename Safe Encoding
When Base64 is used in URLs, the standard '+' and '/' characters can cause issues. The URL-safe variant replaces them with '-' and '_'.

import java.util.Base64;
public class Base64UrlExample {
public static void main(String[] args) {
String originalString = "This is for a URL!";
// Get the URL-safe encoder
Base64.Encoder urlEncoder = Base64.getUrlEncoder();
String urlEncodedString = urlEncoder.encodeToString(originalString.getBytes(StandardCharsets.UTF_8));
System.out.println("Original String: " + originalString);
System.out.println("URL Encoded String: " + urlEncodedString);
// Get the URL-safe decoder
Base64.Decoder urlDecoder = Base64.getUrlDecoder();
byte[] decodedBytes = urlDecoder.decode(urlEncodedString);
String decodedString = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println("Decoded String: " + decodedString);
}
}
Output:
Original String: This is for a URL!
URL Encoded String: VGhpcyBpcyBmb3IgYSBVUkwh
Decoded String: This is for a URL!
(Note: In this specific case, the output is the same because the original string didn't contain characters that would be changed. If it contained a '+' or '/', the URL-safe version would differ.)
The Deprecated Approach (Java 7 and below)
Before Java 8, you had to use the javax.xml.bind.DatatypeConverter class. This class is still available for backward compatibility but is deprecated. You should avoid using it in new code.
Why is it deprecated?
- It requires an external library (
javax.xml.bind) which was removed as a default part of the Java Runtime Environment (JRE) in Java 9 (modularization). - It's less intuitive and not part of the core
java.utilpackage.
Example with DatatypeConverter (For Reference Only)
import javax.xml.bind.DatatypeConverter; // Deprecated
public class DeprecatedBase64Example {
public static void main(String[] args) {
String originalString = "This is a deprecated example.";
// --- Encoding (Deprecated) ---
byte[] originalBytes = originalString.getBytes(StandardCharsets.UTF_8);
String encodedString = DatatypeConverter.printBase64Binary(originalBytes);
System.out.println("Original String: " + originalString);
System.out.println("Encoded String (Deprecated): " + encodedString);
// --- Decoding (Deprecated) ---
byte[] decodedBytes = DatatypeConverter.parseBase64Binary(encodedString);
String decodedString = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println("Decoded String (Deprecated): " + decodedString);
}
}
Summary: Which One Should I Use?
| Feature | java.util.Base64 (Java 8+) |
javax.xml.bind.DatatypeConverter (Deprecated) |
|---|---|---|
| Availability | Built-in since Java 8. Part of the standard library. | Requires javax.xml.bind library. Removed from default JRE in Java 9+. |
| Recommendation | ✅ USE THIS for all new code. | ❌ AVOID. Use only for maintaining legacy code. |
| API | Clean, separate Encoder and Decoder classes. Intuitive methods like encodeToString(). |
Single class with static methods like printBase64Binary() and parseBase64Binary(). |
| Variants | Easy to get getEncoder(), getUrlEncoder(), getMimeEncoder(). |
Only provides basic encoding/decoding. |
Final advice: Always use java.util.Base64 for your Java projects. It's the modern, standard, and most reliable way to handle Base64 encoding and decoding.
