Base64 Encoding in Java

Java 8+ provides the java.util.Base64 class for encoding and decoding.

Basic Usage

Encode to Base64

import java.util.Base64;

String text = "Hello, World!";
String encoded = Base64.getEncoder().encodeToString(text.getBytes());
System.out.println(encoded); // "SGVsbG8sIFdvcmxkIQ=="

Decode from Base64

import java.util.Base64;

String encoded = "SGVsbG8sIFdvcmxkIQ==";
byte[] decoded = Base64.getDecoder().decode(encoded);
System.out.println(new String(decoded)); // "Hello, World!"

URL-Safe Base64

Use getUrlEncoder() and getUrlDecoder() for URL-safe encoding:

import java.util.Base64;

String text = "Hello, World!";

// Encode
String encoded = Base64.getUrlEncoder().encodeToString(text.getBytes());
System.out.println(encoded);

// Without padding
String noPadding = Base64.getUrlEncoder().withoutPadding().encodeToString(text.getBytes());
System.out.println(noPadding);

// Decode
byte[] decoded = Base64.getUrlDecoder().decode(encoded);
System.out.println(new String(decoded));

MIME Base64

For MIME-formatted output (line breaks every 76 characters):

import java.util.Base64;

String text = "A very long string that needs to be wrapped...";

String encoded = Base64.getMimeEncoder().encodeToString(text.getBytes());
System.out.println(encoded);

File to Base64

Encode a File

import java.util.Base64;
import java.nio.file.Files;
import java.nio.file.Path;

Path path = Path.of("image.png");
byte[] bytes = Files.readAllBytes(path);
String encoded = Base64.getEncoder().encodeToString(bytes);
System.out.println(encoded);

Decode to File

import java.util.Base64;
import java.nio.file.Files;
import java.nio.file.Path;

String encoded = "iVBORw0KGgo..."; // Base64 string
byte[] decoded = Base64.getDecoder().decode(encoded);
Files.write(Path.of("output.png"), decoded);

With Streams

For large files, use streams:

import java.util.Base64;
import java.io.*;

// Encode stream
try (InputStream in = new FileInputStream("input.bin");
     OutputStream out = Base64.getEncoder().wrap(new FileOutputStream("output.txt"))) {
    in.transferTo(out);
}

// Decode stream
try (InputStream in = Base64.getDecoder().wrap(new FileInputStream("input.txt"));
     OutputStream out = new FileOutputStream("output.bin")) {
    in.transferTo(out);
}

Legacy (pre-Java 8)

For Java 7 and earlier, use Apache Commons Codec or javax.xml.bind.DatatypeConverter:

// javax.xml.bind (Java 6-8, removed in Java 11)
import javax.xml.bind.DatatypeConverter;

String encoded = DatatypeConverter.printBase64Binary(text.getBytes());
byte[] decoded = DatatypeConverter.parseBase64Binary(encoded);