Base64 coderen in Java β€” java.util.Base64 Voorbeelden

Β·Java Security & API EngineerΒ·Beoordeeld doorPavel NovakΒ·Gepubliceerd

Gebruik de gratis Base64 Encode Online direct in je browser β€” geen installatie nodig.

Base64 Encode Online online uitproberen β†’

Elke keer als ik een HTTP Basic Auth-header opzet, een certificaat insluit in een Kubernetes-secret, of binaire data door een JSON-API stuur, is de eerste stap hetzelfde: base64-coderen van de ruwe bytes naar een ASCII-veilige string. Java maakt dit eenvoudig met java.util.Base64, de standaard-API beschikbaar sinds Java 8 die de verouderde sun.misc.BASE64Encoder vervangt. Voor een snelle éénmalige codering zonder code te schrijven, ToolDeck's Base64 Encoder doet het direct in de browser. Deze gids behandelt Base64.getEncoder(), getUrlEncoder(), getMimeEncoder(), bestandscodering, streaming met wrap(OutputStream), en de fouten die zelfs ervaren Java-ontwikkelaars blijven maken. Alle voorbeelden compileren op Java 8 t/m Java 21+.

  • βœ“Base64.getEncoder().encodeToString(bytes) is de standaard one-liner β€” ingebouwd in de JDK sinds Java 8, ongewijzigd in Java 17 en 21.
  • βœ“Geef altijd StandardCharsets.UTF_8 mee aan String.getBytes() voor het coderen β€” weglaten gebruikt de platformstandaard, die per JVM verschilt.
  • βœ“getUrlEncoder() produceert URL-veilige uitvoer (- in plaats van +, _ in plaats van /) en withoutPadding() verwijdert afsluitende = tekens.
  • βœ“getMimeEncoder() voegt elke 76 tekens een regelinde in β€” vereist door e-mail (MIME) en PEM-certificaatformaten.
  • βœ“Gebruik voor grote bestanden Base64.getEncoder().wrap(OutputStream) om te streamen zonder het hele bestand in het geheugen te laden.

Wat is Base64-codering?

Base64 zet willekeurige binaire data om naar een string die bestaat uit 64 afdrukbare ASCII-tekens: A-Z, a-z, 0-9, +, en /. Elke 3 bytes invoer leveren precies 4 Base64-tekens op. Als de invoerlengte geen veelvoud van 3 is, worden er één of twee = opvultekens toegevoegd. De gecodeerde uitvoer is altijd ongeveer 33% groter dan de originele data.

Base64 is geen versleuteling. Iedereen met de gecodeerde string kan deze decoderen. Het doel is transportveiligheid: HTTP-headers, JSON-payloads, XML-documenten en e-mailberichten zijn op tekst gebaseerde protocollen die geen ruwe binaire bytes kunnen bevatten zonder corruptie. Veelgebruikte Java-toepassingen zijn HTTP Basic Authentication, het insluiten van PEM-certificaten, het opslaan van binaire data in database-tekstkolommen en het samenstellen van JWT-tokensegmenten.

Before Β· text
After Β· text
deploy-svc:sk_live_4eC39HqLyjWDarjtT1zdp7dc
ZGVwbG95LXN2Yzpza19saXZlXzRlQzM5SHFMeWpXRGFyanRUMXpkcDdkYw==

Base64.getEncoder().encodeToString() β€” De standaard-API

java.util.Base64 werd geΓ―ntroduceerd in Java 8 als de officiΓ«le vervanging van sun.misc.BASE64Encoder. De klasse biedt drie statische factory-methoden β€” elk retourneert een Base64.Encoder instantie van de geneste klasse β€” die de drie Base64-varianten uit RFC 4648 afdekken. Er is geen library van derden nodig. Geen Maven-afhankelijkheid. Gewoon importeren en aanroepen.

Minimaal voorbeeld β€” Een string coderen

Java 8+
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class EncodeDemo {
    public static void main(String[] args) {
        String credentials = "monitoring-svc:9f2a7c4e-b1d8-4a3f";
        byte[] credentialBytes = credentials.getBytes(StandardCharsets.UTF_8);

        String encoded = Base64.getEncoder().encodeToString(credentialBytes);
        System.out.println(encoded);
        // bW9uaXRvcmluZy1zdmM6OWYyYTdjNGUtYjFkOC00YTNm
    }
}

De cruciale stap die de meeste Java-ontwikkelaars bij de eerste poging missen: een String moet worden omgezet naar byte[] vΓ³Γ³r het coderen. Base64 werkt op bytes, niet op tekens. encodeToString() accepteert een byte[] en geeft de Base64 String direct terug. Als je het gecodeerde resultaat als bytes nodig hebt, gebruik dan encode(byte[]) β€” dit geeft een byte[] van de ASCII-gecodeerde Base64-tekens terug, handig bij het rechtstreeks schrijven naar een OutputStream of bij het bouwen van binaire protocolframes.

HTTP Basic Auth β€” De meest voorkomende toepassing

HTTP Basic Authentication is waarschijnlijk de meest voorkomende reden waarom Java-ontwikkelaars Base64-codering inzetten. De specificatie (RFC 7617) vereist dat de credentials-string gebruikersnaam:wachtwoord Base64-gecodeerd wordt en in de Authorization-header wordt geplaatst. Ik heb dit vaker fout zien gaan dan ik kan tellen β€” meestal door het vergeten van de dubbelepuntscheider of het afzonderlijk coderen van de onderdelen.

Java β€” HTTP Basic Auth header
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class BasicAuthExample {
    public static void main(String[] args) throws Exception {
        String username = "metrics-exporter";
        String apiKey = "sk_live_4eC39HqLyjWDarjtT1zdp7dc";

        // username:password β†’ Base64
        String credentials = username + ":" + apiKey;
        String authHeader = "Basic " + Base64.getEncoder()
            .encodeToString(credentials.getBytes(StandardCharsets.UTF_8));

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.example.com/v2/metrics"))
            .header("Authorization", authHeader)
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.statusCode());  // 200
    }
}

Rondreis β€” Coderen en decoderen

Java 8+ β€” encode and decode round-trip
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class RoundTrip {
    public static void main(String[] args) {
        String original = "X-Correlation-ID: req_8a4f2c91-e7b3-4d56-9012-3f7a8b9c0d1e";

        // Coderen
        String encoded = Base64.getEncoder()
            .encodeToString(original.getBytes(StandardCharsets.UTF_8));
        System.out.println(encoded);
        // WC1Db3JyZWxhdGlvbi1JRDogcmVxXzhhNGYyYzkxLWU3YjMtNGQ1Ni05MDEyLTNmN2E4YjljMGQxZQ==

        // Decoderen
        byte[] decodedBytes = Base64.getDecoder().decode(encoded);
        String decoded = new String(decodedBytes, StandardCharsets.UTF_8);

        System.out.println(original.equals(decoded));  // true
    }
}
Opmerking:De java.util.Base64 API is identiek van Java 8 t/m Java 17 en Java 21. Er is geen migratie nodig bij het upgraden van de JDK. Dezelfde code compileert en draait op elke versie vanaf Java 8.

Niet-String-data coderen β€” byte[], UUID en tijdstempels

Base64-codering in Java begint altijd met een byte[]. Strings worden omgezet via getBytes(StandardCharsets.UTF_8), maar andere typen vereisen eerst een conversiestap. UUID's, tijdstempels en numerieke identificatoren moeten worden geserialiseerd naar een string- of byte-representatie voordat je ze kunt Base64-coderen.

UUID β€” Coderen als stringrepresentatie

Java β€” Base64 encoding a UUID
import java.util.Base64;
import java.util.UUID;
import java.nio.charset.StandardCharsets;

UUID sessionId = UUID.fromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8");
String encoded = Base64.getEncoder()
    .encodeToString(sessionId.toString().getBytes(StandardCharsets.UTF_8));
System.out.println(encoded);
// NmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4

Compacte UUID β€” De ruwe 16 bytes coderen

Als je een kortere gecodeerde uitvoer wilt, extraheer dan de 128 bits van de UUID als 16 ruwe bytes in plaats van te converteren naar de 36-tekens stringvorm. De Base64-uitvoer daalt van 48 naar 24 tekens.

Java β€” compact UUID encoding
import java.nio.ByteBuffer;
import java.util.Base64;
import java.util.UUID;

UUID eventId = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");

ByteBuffer buffer = ByteBuffer.wrap(new byte[16]);
buffer.putLong(eventId.getMostSignificantBits());
buffer.putLong(eventId.getLeastSignificantBits());

String compact = Base64.getUrlEncoder()
    .withoutPadding()
    .encodeToString(buffer.array());
System.out.println(compact);
// VQ6EAOKbQdSnFkRmVUQAAA
// 22 tekens vs 48 voor de op-string-gebaseerde aanpak

Tijdstempel en gemengde payload

Java β€” encoding a JSON-like payload with timestamp
import java.time.Instant;
import java.util.Base64;
import java.nio.charset.StandardCharsets;

// Simulatie van een JWT-achtige payload
String payload = String.format(
    "{"sub":"usr_7b3c","iss":"auth.internal","iat":%d,"exp":%d}",
    Instant.now().getEpochSecond(),
    Instant.now().plusSeconds(3600).getEpochSecond()
);

String encoded = Base64.getUrlEncoder()
    .withoutPadding()
    .encodeToString(payload.getBytes(StandardCharsets.UTF_8));
System.out.println(encoded);
// eyJzdWIiOiJ1c3JfN2IzYyIsImlzcyI6ImF1dGguaW50ZXJuYWwiLCJpYXQiOj... (URL-veilig, zonder opvulling)
Waarschuwing:Roep toString() niet aan op een byte[] in de verwachting de inhoud te zien β€” dat geeft de identity-hash van de array zoals [B@6d06d69c. Gebruik new String(bytes, StandardCharsets.UTF_8) of geef de byte-array direct door aan encodeToString().

Referentie: Base64.Encoder-methoden

De java.util.Base64 klasse biedt drie factory-methoden, elk retourneert een Base64.Encoder geconfigureerd voor een specifieke variant. De encoder-instanties zijn thread-veilig en stateloos β€” maak ze eenmalig aan en hergebruik ze.

Methode
Type
Beschrijving
getEncoder()
Base64.Encoder
Geeft een standaard RFC 4648-encoder terug met het standaardalfabet (A-Z, a-z, 0-9, +, /)
getUrlEncoder()
Base64.Encoder
Geeft een encoder terug met het URL-veilige alfabet (- in plaats van +, _ in plaats van /)
getMimeEncoder()
Base64.Encoder
Geeft een MIME-encoder terug die elke 76 tekens \r\n-regeleinden invoegt
getMimeEncoder(lineLength, lineSeparator)
Base64.Encoder
MIME-encoder met aangepaste regellengte en scheidingsbytes
encoder.withoutPadding()
Base64.Encoder
Geeft een encoder terug die afsluitende = opvultekens weglaat
encoder.encode(byte[])
byte[]
Codeert een byte-array en geeft de gecodeerde byte-array terug
encoder.encodeToString(byte[])
String
Codeert een byte-array en geeft direct een gecodeerde String terug
encoder.wrap(OutputStream)
OutputStream
Omhult een OutputStream voor streaming Base64-codering

Base64.getUrlEncoder() β€” URL-veilige codering

De URL-veilige encoder gebruikt een alternatief alfabet waarbij + wordt - en / wordt _, zoals gedefinieerd in RFC 4648 sectie 5. Dit is van belang wanneer de Base64-string voorkomt in een URL-queryparameter, een bestandsnaam of een cookiewaarde β€” standaard Base64-tekens conflicteren met URL-scheidingstekens en door het bestandssysteem gereserveerde tekens.

Java β€” URL-safe Base64 encoding
import java.util.Base64;
import java.nio.charset.StandardCharsets;

String redirectUri = "https://app.internal/callback?state=auth_pending&nonce=9f2a7c";
byte[] data = redirectUri.getBytes(StandardCharsets.UTF_8);

// Standaardencoder β€” bevat + en / die URL's breken
String standard = Base64.getEncoder().encodeToString(data);
System.out.println(standard);
// aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s/c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw==

// URL-veilige encoder β€” veilig voor queryparameters en bestandsnamen
String urlSafe = Base64.getUrlEncoder().encodeToString(data);
System.out.println(urlSafe);
// aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s_c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw==

// URL-veilig zonder opvulling β€” voor JWT's en compacte tokens
String noPadding = Base64.getUrlEncoder().withoutPadding().encodeToString(data);
System.out.println(noPadding);
// aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s_c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw

De withoutPadding() variant verwijdert de afsluitende = tekens. JWT-specificaties vereisen URL-veilige Base64 zonder opvulling voor de header- en payload-segmenten, dus getUrlEncoder().withoutPadding() is precies de aanroep die je nodig hebt bij het handmatig samenstellen of bewerken van JWT-tokens.

Opmerking:De withoutPadding()-methode geeft een nieuwe encoder-instantie terug β€” de originele wordt niet gewijzigd. Beide kunnen worden toegewezen aan static final-velden en veilig worden hergebruikt door meerdere threads.

Coderen vanuit bestand en API-respons

De twee meest voorkomende praktijkscenario's voor Base64-codering in Java: een binair bestand lezen van schijf (certificaten, afbeeldingen, configuratiebundels) en data coderen die ontvangen is van een HTTP-respons.

Een bestand naar Base64 coderen

Java β€” encoding a file
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;

public class FileEncoder {
    public static void main(String[] args) {
        try {
            byte[] fileBytes = Files.readAllBytes(Path.of("certs/server.pem"));
            String encoded = Base64.getEncoder().encodeToString(fileBytes);

            System.out.printf("Origineel: %d bytes%n", fileBytes.length);
            System.out.printf("Gecodeerd: %d tekens%n", encoded.length());

            // Gecodeerde inhoud naar een tekstbestand schrijven
            Files.writeString(
                Path.of("certs/server.pem.b64"),
                encoded
            );
        } catch (java.io.IOException e) {
            System.err.println("Bestand kon niet worden gelezen: " + e.getMessage());
        }
    }
}

Een API-responslichaam coderen

Java 11+ β€” encoding an HTTP response
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Base64;

public class ApiEncoder {
    public static void main(String[] args) {
        try {
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.example.com/v2/reports/weekly.pdf"))
                .header("Authorization", "Bearer tok_8f2a9c3d")
                .build();

            HttpResponse<byte[]> response = client.send(
                request, HttpResponse.BodyHandlers.ofByteArray()
            );

            if (response.statusCode() == 200) {
                String encoded = Base64.getEncoder()
                    .encodeToString(response.body());
                System.out.printf("Gecodeerd %d bytes β†’ %d tekens%n",
                    response.body().length, encoded.length());
            } else {
                System.err.printf("HTTP %d: %s%n",
                    response.statusCode(),
                    new String(response.body()));
            }
        } catch (Exception e) {
            System.err.println("Verzoek mislukt: " + e.getMessage());
        }
    }
}

Korte opmerking vΓ³Γ³r de CLI-sectie: als je gewoon een bestand of API-respons wilt plakken en de Base64-uitvoer wilt krijgen zonder code te schrijven, kan de online Base64 Encoder zowel tekst- als binaire invoer verwerken.

Base64-codering via de opdrachtregel

Soms wil je gewoon een string of bestand coderen vanuit de terminal β€” zonder Java-project, zonder IDE, zonder build-stap. De meeste Unix-systemen worden geleverd met een base64 commando, en als je een JDK hebt geΓ―nstalleerd kun je jshell gebruiken voor een Java-native aanpak.

Bash β€” command-line Base64 encoding
# macOS / Linux β€” een string coderen
echo -n "deploy-bot:sk_prod_9f2a7c4e" | base64
# ZGVwbG95LWJvdDpza19wcm9kXzlmMmE3YzRl

# Een bestand coderen
base64 < certs/server.pem > certs/server.pem.b64

# Met jshell (JDK 9+)
echo 'System.out.println(java.util.Base64.getEncoder().encodeToString("deploy-bot:sk_prod_9f2a7c4e".getBytes()))' | jshell -

# Met java rechtstreeks als one-liner
java -e 'System.out.println(java.util.Base64.getEncoder().encodeToString(args[0].getBytes()))' "my-secret"
# Opmerking: java -e vereist JDK 23+ (JEP 477)

De jshell-aanpak is bijzonder nuttig wanneer je wilt controleren of jouw Java-code dezelfde uitvoer produceert als een Unix-tool, of wanneer je een verschil debugt tussen wat jouw service verstuurt en wat de ontvanger verwacht. Ik houd er een shell-alias voor bij.

Opmerking:Op macOS gebruikt het base64-commando -D voor decodering. Op Linux (GNU coreutils) is dat -d. Het coderingsgedrag is op beide platforms identiek. De vlag -w 0op Linux schakelt regelafbreking in de uitvoer uit, wat je meestal wilt bij het doorsluizen naar andere commando's.

Apache Commons Codec β€” Hoogperformant alternatief

Voor de meeste toepassingen is java.util.Base64 snel genoeg. Maar als je miljoenen coderingsbewerkingen uitvoert in een strakke lus β€” denk aan log-ingestie-pipelines of hoogvolume-berichtbrokers β€” is Apache Commons Codec het benchmarken waard. De library bestaat al lang vΓ³Γ³r Java 8 en biedt een beproefd alternatief met een iets ander API-oppervlak.

Java β€” Apache Commons Codec
// Maven: org.apache.commons:commons-codec:1.17.0
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;

byte[] telemetryPayload = ("{"service":"metrics-collector","
    + ""host":"prod-east-07","
    + ""cpu_pct":72.4,"
    + ""mem_mb":3891,"
    + ""timestamp":1710523200}")
    .getBytes(StandardCharsets.UTF_8);

// Standaardcodering
String encoded = Base64.encodeBase64String(telemetryPayload);

// URL-veilige codering
String urlSafe = Base64.encodeBase64URLSafeString(telemetryPayload);

// Controleer of een string geldige Base64 is
boolean valid = Base64.isBase64(encoded);
System.out.println(valid);  // true

Apache Commons Codec biedt ook Base64OutputStream en Base64InputStream voor streaming-scenario's, en bevat een validatiemethode die de JDK-encoder mist. Als Commons Codec al in je afhankelijkheidsboom zit (het wordt meegeleverd met veel Apache-projecten), is er geen reden om het niet te gebruiken.

Guava BaseEncoding

Google's Guava-library bevat BaseEncoding dat een vloeiende API biedt voor Base64 met configureerbare regelscheidingstekens, opvulbeheer en ondersteuning voor zowel standaard- als URL-veilige alfabetten. De API leest prettig, maar Guava toevoegen (circa 3 MB) uitsluitend voor Base64-codering is overdreven. Als Guava al in jouw project zit voor de collecties of caching-utilities, is de codering-API een prettige bonus.

Java β€” Guava BaseEncoding
// Maven: com.google.guava:guava:33.1.0-jre
import com.google.common.io.BaseEncoding;
import java.nio.charset.StandardCharsets;

byte[] webhookPayload = ("{"event":"deployment.completed","
    + ""repo":"payments-api","
    + ""sha":"a7f2c91e4b3d","
    + ""environment":"production"}")
    .getBytes(StandardCharsets.UTF_8);

// Standaard Base64
String standard = BaseEncoding.base64().encode(webhookPayload);

// URL-veilig
String urlSafe = BaseEncoding.base64Url().encode(webhookPayload);

// Zonder opvulling
String noPad = BaseEncoding.base64Url().omitPadding().encode(webhookPayload);

// Met regelscheidingstekens (PEM-stijl)
String wrapped = BaseEncoding.base64()
    .withSeparator("\n", 64)
    .encode(webhookPayload);

Base64.getMimeEncoder() β€” MIME- en PEM-uitvoer met regelafbreking

De MIME-encoder voegt \r\n regeleinden in elke 76 tekens in, overeenkomstig de MIME-specificatie (RFC 2045). PEM-certificaten, S/MIME-e-mailbijlagen en sommige legacy-API's verwachten dit formaat. De standaard- en URL-veilige encoders produceren één ononderbroken regel β€” als je hun uitvoer doorgeeft aan een systeem dat regelafgebroken Base64 verwacht, kan dit stil mislukken of de data worden geweigerd.

Java β€” MIME Base64 encoding
import java.util.Base64;
import java.nio.charset.StandardCharsets;

// Simuleer een PEM-certificaatlichaam
byte[] certData = new byte[256];  // Lees in de praktijk uit een .der-bestand
new java.security.SecureRandom().nextBytes(certData);

// Standaard MIME-encoder β€” 76 tekens per regel, \r\n-scheidingsteken
String mimeEncoded = Base64.getMimeEncoder().encodeToString(certData);
System.out.println(mimeEncoded);
// QYx2K3p8Xg7JmN1R+wFkLd...  (76 tekens)
// Ht5Bv9CzAq0PnSjYl8WxUe...  (76 tekens)
// ...

// Aangepaste MIME-encoder β€” 64 tekens per regel (PEM-standaard), \n-scheidingsteken
Base64.Encoder pemEncoder = Base64.getMimeEncoder(64, new byte[]{'\n'});
String pemBody = pemEncoder.encodeToString(certData);
System.out.println("-----BEGIN CERTIFICATE-----");
System.out.println(pemBody);
System.out.println("-----END CERTIFICATE-----");
Waarschuwing:Gebruik getMimeEncoder() niet voor JWT-tokens, HTTP-headers of URL-parameters. De regeleinden beschadigen de data in die contexten. Gebruik in die gevallen getEncoder() of getUrlEncoder().

Grote bestanden streamen met Base64.getEncoder().wrap()

Een heel bestand laden in een byte[] met Files.readAllBytes() werkt voor kleine bestanden, maar voor alles boven de 50-100 MB riskeer je een OutOfMemoryError. De JDK biedt Base64.getEncoder().wrap(OutputStream), dat een OutputStream teruggeeft die data on-the-fly codeert terwijl je ernaar schrijft. De gecodeerde bytes stromen door naar de onderliggende stream zonder de volledige invoer te bufferen.

Java β€” streaming Base64 encoding
import java.io.*;
import java.nio.file.*;
import java.util.Base64;

public class StreamingEncoder {
    public static void main(String[] args) throws IOException {
        Path inputPath = Path.of("backups/database-export.sql.gz");
        Path outputPath = Path.of("backups/database-export.sql.gz.b64");

        try (
            InputStream in = Files.newInputStream(inputPath);
            OutputStream fileOut = Files.newOutputStream(outputPath);
            OutputStream base64Out = Base64.getEncoder().wrap(fileOut)
        ) {
            byte[] buffer = new byte[8192];
            int bytesRead;
            long totalBytes = 0;

            while ((bytesRead = in.read(buffer)) != -1) {
                base64Out.write(buffer, 0, bytesRead);
                totalBytes += bytesRead;
            }

            System.out.printf("Gestreamd %d bytes door Base64-encoder%n", totalBytes);
        }
        // Sluiten van base64Out spoelt de afsluitende opvultekens automatisch door
    }
}

Het try-with-resources-blok verwerkt het doorspoelen en sluiten. EΓ©n detail dat mensen verrast: de afsluitende Base64-opvulling wordt pas geschreven wanneer de omhullende OutputStream wordt gesloten. Als je vergeet hem te sluiten (of alleen de buitenste stream sluit), kunnen de laatste paar tekens van de gecodeerde uitvoer ontbreken.

Streamen naar een netwerksocket

De wrap() methode werkt met elke OutputStream β€” bestandsuitvoer, socket-uitvoer, HTTP-responslichaam, zelfs ByteArrayOutputStream. Hier een voorbeeld dat Base64-gecodeerde data rechtstreeks in een in-memory buffer schrijft, wat handig is voor unit-testing of bij het samenstellen van payloads die via HTTP worden verstuurd:

Java β€” streaming to ByteArrayOutputStream
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.Base64;
import java.nio.charset.StandardCharsets;

ByteArrayOutputStream buffer = new ByteArrayOutputStream();

try (OutputStream encoder = Base64.getEncoder().wrap(buffer)) {
    // Data in stukken schrijven β€” simuleert lezen van een stream
    encoder.write("chunk-1:telemetry-data-".getBytes(StandardCharsets.UTF_8));
    encoder.write("chunk-2:more-payload-".getBytes(StandardCharsets.UTF_8));
    encoder.write("chunk-3:final-segment".getBytes(StandardCharsets.UTF_8));
}

String encoded = buffer.toString(StandardCharsets.UTF_8);
System.out.println(encoded);
// Y2h1bmstMTp0ZWxlbWV0cnktZGF0YS1jaHVuay0yOm1vcmUtcGF5bG9hZC1jaHVuay0zOmZpbmFsLXNlZ21lbnQ=

// Rondreis verifiΓ«ren
byte[] decoded = Base64.getDecoder().decode(encoded);
System.out.println(new String(decoded, StandardCharsets.UTF_8));
// chunk-1:telemetry-data-chunk-2:more-payload-chunk-3:final-segment
Opmerking:De buffergrootte in het streaming-voorbeeld (8192 bytes) is niet willekeurig. Het komt overeen met de standaard buffergrootte van BufferedInputStream en is een goede balans tussen geheugengebruik en systeemaanroepoverhead. Kleinere buffers verhogen het aantal lees-/schrijfaanroepen; grotere buffers verspillen geheugen zonder betekenisvolle doorvoerverbetering.

Thread-veilige encoder-instanties β€” opslaan en hergebruiken

De Base64.Encoder die door de factory-methoden wordt teruggegeven, is onveranderlijk en thread-veilig. Het aanroepen van Base64.getEncoder() bij elke coderingsbewerking maakt telkens een nieuw object aan. De JVM optimaliseert dit waarschijnlijk weg, maar het opslaan van de encoder in een static final veld maakt de bedoeling duidelijk en vermijdt onnodige allocaties in hot paths.

Java β€” reusable encoder instances
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class TokenService {
    // Eenmalig aanmaken, overal hergebruiken β€” thread-veilig
    private static final Base64.Encoder STANDARD = Base64.getEncoder();
    private static final Base64.Encoder URL_SAFE = Base64.getUrlEncoder().withoutPadding();
    private static final Base64.Encoder MIME = Base64.getMimeEncoder();

    public static String encodeForHeader(String value) {
        return STANDARD.encodeToString(value.getBytes(StandardCharsets.UTF_8));
    }

    public static String encodeForUrl(byte[] data) {
        return URL_SAFE.encodeToString(data);
    }

    public static String encodeForEmail(byte[] attachment) {
        return MIME.encodeToString(attachment);
    }
}

Dit patroon is bijzonder nuttig in Spring Boot-services waar een utility-klasse codering verzorgt voor meerdere controllers of servicemethoden. De withoutPadding() aanroep geeft een nieuwe encoder-instantie terug, zodat je zowel gevulde als niet-gevulde varianten kunt opslaan als afzonderlijke velden. Elke aanroep van encodeToString() of encode() is stateloos β€” geen synchronisatie nodig, geen gedeelde veranderlijke toestand.

Veelgemaakte fouten

❌ getBytes() aanroepen zonder een charset op te geven

Probleem: String.getBytes() zonder charset-argument gebruikt de standaardcodering van het platform: windows-1252 op Windows, UTF-8 op de meeste Linux-systemen, en wisselend op macOS. Dezelfde code produceert verschillende Base64-uitvoer op verschillende machines.

Oplossing: Geef altijd StandardCharsets.UTF_8 expliciet mee.

Before Β· Java
After Β· Java
String text = "Toegangssleutel: prod-east";
byte[] bytes = text.getBytes();  // platformstandaard β€” onvoorspelbaar
String encoded = Base64.getEncoder().encodeToString(bytes);
String text = "Toegangssleutel: prod-east";
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
String encoded = Base64.getEncoder().encodeToString(bytes);
❌ De standaardencoder gebruiken voor URL-parameters

Probleem: Base64.getEncoder() produceert + en / tekens. Wanneer die in een URL-querystring voorkomen, wordt + geΓ―nterpreteerd als spatie en / als padscheider, waardoor de waarde stil wordt beschadigd aan de ontvangende kant.

Oplossing: Gebruik Base64.getUrlEncoder() voor elke waarde die in een URL voorkomt.

Before Β· Java
After Β· Java
// Token in URL-queryparameter β€” werkt niet correct
String token = Base64.getEncoder()
    .encodeToString(sessionData);
String url = "https://auth.internal/verify?token=" + token;
// URL-veilige codering β€” geen + of / tekens
String token = Base64.getUrlEncoder()
    .withoutPadding()
    .encodeToString(sessionData);
String url = "https://auth.internal/verify?token=" + token;
❌ Decoderen met de verkeerde encodervariant

Probleem: Coderen met getUrlEncoder() en decoderen met getDecoder() (of andersom) gooit een IllegalArgumentException omdat - en _ niet geldig zijn in het standaard Base64-alfabet, en + en / niet geldig zijn in het URL-veilige alfabet.

Oplossing: Decodeer altijd met de bijpassende decoder: getUrlDecoder() voor URL-veilig, getDecoder() voor standaard.

Before Β· Java
After Β· Java
String encoded = Base64.getUrlEncoder()
    .encodeToString(data);
// Later...
byte[] decoded = Base64.getDecoder()  // VERKEERDE decoder
    .decode(encoded);
// IllegalArgumentException als encoded - of _ bevat
String encoded = Base64.getUrlEncoder()
    .encodeToString(data);
// Later...
byte[] decoded = Base64.getUrlDecoder()  // bijpassende decoder
    .decode(encoded);
❌ De wrap() OutputStream niet sluiten

Probleem: De streaming-encoder buffert maximaal 2 invoerbytes in afwachting van een volledige 3-byte-groep. Als je de omhullende OutputStream niet sluit, worden de laatste 1-4 Base64-tekens (inclusief opvulling) nooit geschreven.

Oplossing: Gebruik try-with-resources, of roep close() expliciet aan op de omhullende stream voordat je de uitvoer leest.

Before Β· Java
After Β· Java
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream b64os = Base64.getEncoder().wrap(baos);
b64os.write(data);
// baos.toString() is ONVOLLEDIG β€” ontbrekende afsluitende bytes
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (OutputStream b64os = Base64.getEncoder().wrap(baos)) {
    b64os.write(data);
}  // close() spoelt de afsluitende opvulling door
String encoded = baos.toString();  // volledig

Vergelijking van Base64-coderingsmethoden

Methode
URL-veilig
Streaming
Regeleinden
Aangepaste typen
Installatie vereist
Base64.getEncoder()
βœ—
βœ“ (wrap)
βœ—
βœ—
Nee (JDK 8+)
Base64.getUrlEncoder()
βœ“
βœ“ (wrap)
βœ—
βœ—
Nee (JDK 8+)
Base64.getMimeEncoder()
βœ—
βœ“ (wrap)
βœ“ (76 tekens)
βœ—
Nee (JDK 8+)
Apache Commons Codec
βœ“
βœ“
βœ“
βœ—
Maven-afhankelijkheid
Guava BaseEncoding
βœ“
βœ“
βœ“ (configureerbaar)
βœ—
Maven-afhankelijkheid
jcmd / CLI base64
βœ—
βœ“ (pipe)
βœ“
N/A
Systeeminstallatie

Voor de meeste projecten: java.util.Base64 is de juiste keuze. Geen afhankelijkheden, ingebouwd in de JDK, thread-veilig en dekt alle drie RFC 4648-varianten. Grijp naar Apache Commons Codec alleen als het al in jouw classpath zit en je de isBase64() validatiemethode of de streaming Base64OutputStream nodig hebt. Guava's BaseEncoding is een redelijke optie als jouw project al afhankelijk is van Guava, maar een afhankelijkheid van 3 MB toevoegen alleen voor Base64 is moeilijk te rechtvaardigen.

Drie scenario's, drie keuzes: standaard webservice die Basic Auth of JWT-codering nodig heeft? Blijf bij de JDK. Legacy-project dat al Commons Codec binnenhaalt via Spring of Apache HTTP Client? Gebruik het β€” geen reden om twee Base64-libraries op de classpath te hebben. Project dat Guava gebruikt voor caching en collecties? Gebruik BaseEncoding voor de nette vloeiende API. Voeg nooit een library toe puur voor Base64-codering β€” de JDK-versie is goed genoeg sinds 2014.

Als je een gecodeerd resultaat snel wilt controleren zonder jouw Java-code te draaien, plak het in de Base64 Encoder om te bevestigen dat de uitvoer overeenkomt met wat jouw code produceert.

Veelgestelde vragen

Hoe codeer ik een String naar Base64 in Java?

Converteer de string eerst naar bytes met getBytes(StandardCharsets.UTF_8) en geef de byte-array vervolgens door aan Base64.getEncoder().encodeToString(). Geef UTF-8 altijd expliciet op β€” aanroepen van getBytes() zonder charset-argument gebruikt de platformstandaard, die verschilt per besturingssysteem en JVM-configuratie.

Java
import java.util.Base64;
import java.nio.charset.StandardCharsets;

String payload = "grant_type=client_credentials&scope=read:metrics";
String encoded = Base64.getEncoder()
    .encodeToString(payload.getBytes(StandardCharsets.UTF_8));
// Z3JhbnRfdHlwZT1jbGllbnRfY3JlZGVudGlhbHMmc2NvcGU9cmVhZDptZXRyaWNz

Wat is het verschil tussen Base64.getEncoder() en Base64.getUrlEncoder()?

Beide coderen naar Base64, maar getUrlEncoder() gebruikt het URL-veilige alfabet zoals gedefinieerd in RFC 4648 sectie 5. Het vervangt + door - en / door _, zodat de uitvoer in URL's en bestandsnamen kan voorkomen zonder percent-codering. De standaardencoder gebruikt + en / die conflicteren met URL-queryparameters en padsegmenten.

Java
byte[] data = "subject=usr_7b3c&role=admin".getBytes(StandardCharsets.UTF_8);

String standard = Base64.getEncoder().encodeToString(data);
// c3ViamVjdD11c3JfN2IzYyZyb2xlPWFkbWlu

String urlSafe = Base64.getUrlEncoder().encodeToString(data);
// c3ViamVjdD11c3JfN2IzYyZyb2xlPWFkbWlu
// (hier hetzelfde, maar + β†’ - en / β†’ _ wanneer die tekens voorkomen)

Is java.util.Base64 hetzelfde in Java 8 en Java 17?

Ja. De java.util.Base64 API is niet veranderd sinds de introductie in Java 8. De klasse, de geneste Encoder- en Decoder-klassen en alle factory-methoden (getEncoder, getUrlEncoder, getMimeEncoder) zijn identiek in Java 8, 11, 17 en 21. Er zijn geen migratie- of codewijzigingen nodig bij het upgraden van de JDK-versie.

Java
// Deze code compileert en draait identiek op Java 8 t/m Java 21+
import java.util.Base64;
import java.nio.charset.StandardCharsets;

String encoded = Base64.getEncoder()
    .encodeToString("stable-api".getBytes(StandardCharsets.UTF_8));
System.out.println(encoded);  // c3RhYmxlLWFwaQ==

Hoe codeer ik een bestand naar Base64 in Java?

Lees het bestand in een byte-array met Files.readAllBytes(Path) en geef het door aan Base64.getEncoder().encodeToString(). Voor grote bestanden die niet volledig in het geheugen geladen mogen worden, gebruik je Base64.getEncoder().wrap(OutputStream) om de gecodeerde uitvoer te streamen.

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

byte[] fileBytes = Files.readAllBytes(Path.of("config/tls-cert.pem"));
String encoded = Base64.getEncoder().encodeToString(fileBytes);

Waarom is sun.misc.BASE64Encoder verouderd?

sun.misc.BASE64Encoder was een interne JDK-klasse die nooit deel uitmaakte van de publieke API. De klasse bevond zich in het sun.misc-pakket, waarvan Oracle expliciet afraadde gebruik te maken. Java 8 introduceerde java.util.Base64 als de officiΓ«le, publieke en ondersteunde vervanging. Sinds Java 9 en het modulesysteem produceren toegangen tot sun.misc-klassen waarschuwingen of fouten, afhankelijk van de JDK-configuratie.

Java
// Oude manier β€” NIET gebruiken, verwijderd in moderne JDKs
// import sun.misc.BASE64Encoder;
// String encoded = new BASE64Encoder().encode(data);

// Juiste manier sinds Java 8
import java.util.Base64;
String encoded = Base64.getEncoder().encodeToString(data);

Hoe doe ik een Base64-rondreis (coderen en decoderen) in Java?

Codeer met Base64.getEncoder().encodeToString(bytes) en decodeer met Base64.getDecoder().decode(encodedString). Converteer de gedecodeerde byte-array terug naar een String met new String(bytes, StandardCharsets.UTF_8). De rondreis behoudt de originele data exact β€” zolang je dezelfde charset gebruikt voor zowel getBytes() als new String().

Java
import java.util.Base64;
import java.nio.charset.StandardCharsets;

// Coderen
String original = "session_token=eyJhbGciOiJSUzI1NiJ9";
byte[] originalBytes = original.getBytes(StandardCharsets.UTF_8);
String encoded = Base64.getEncoder().encodeToString(originalBytes);

// Decoderen
byte[] decodedBytes = Base64.getDecoder().decode(encoded);
String decoded = new String(decodedBytes, StandardCharsets.UTF_8);

System.out.println(original.equals(decoded));  // true

Gerelateerde tools

  • Base64 Decoder β€” Decodeer Base64-strings terug naar de originele tekst of binaire vorm β€” de omgekeerde bewerking van coderen.
  • URL Encoder β€” Percent-codeer strings voor veilig gebruik in URL's β€” anders dan URL-veilige Base64-codering, maar vaak tegelijk gebruikt.
  • JWT Decoder β€” Bekijk JWT-tokens waarvan de header- en payload-segmenten Base64url-gecodeerde JSON zijn β€” decodeer ze zonder library.
  • JSON Formatter β€” Maak JSON-payloads leesbaar voor of na Base64-codering β€” handig bij het debuggen van API-integraties.
Ook beschikbaar in:JavaScriptPython
AO
Aisha OseiJava Security & API Engineer

Aisha is a Java engineer specialising in application security, Spring Security, and API design. She has worked on identity and access management systems, OAuth 2.0 integrations, and microservice security at scale. She writes about secure Java coding practices, token validation, cryptographic utilities, and the Spring ecosystem from a security-first perspective.

PN
Pavel NovakTechnisch beoordelaar

Pavel is a backend engineer with deep roots in the JVM ecosystem, working primarily with Java and Kotlin. He has extensive experience building data-intensive services and integrating third-party APIs at scale. He writes about modern Java features, the Jackson ecosystem, serialisation patterns, and practical approaches to keeping large codebases maintainable.