Base64-kodning i Java — java.util.Base64 Exempel
Använd det kostnadsfria Base64 Encode Online direkt i webbläsaren — ingen installation krävs.
Prova Base64 Encode Online online →Varje gång jag kopplar upp ett HTTP Basic Auth-huvud, bäddar in ett certifikat i en Kubernetes-hemlighet, eller skickar binärdata genom ett JSON-API är första steget detsamma: base64-koda de råa bytena till en ASCII-säker sträng. Java gör detta enkelt med java.util.Base64, standard-API:et tillgängligt sedan Java 8 som ersatte den utfasade sun.misc.BASE64Encoder. För en snabb engångskodning utan att skriva kod hanterar ToolDecks Base64 Encoder det direkt i webbläsaren. Den här guiden täcker Base64.getEncoder(), getUrlEncoder(), getMimeEncoder(), filkodning, streaming med wrap(OutputStream), och de misstag som även erfarna Java-utvecklare snavar på. Alla exempel kompileras på Java 8 till Java 21+.
- ✓Base64.getEncoder().encodeToString(bytes) är standardenradaren — inbyggd i JDK sedan Java 8, oförändrad genom Java 17 och 21.
- ✓Skicka alltid StandardCharsets.UTF_8 till String.getBytes() före kodning — utelämnar du det används plattformens standard, som varierar mellan JVM:er.
- ✓getUrlEncoder() producerar URL-säker utdata (- i stället för +, _ i stället för /) och withoutPadding() tar bort avslutande =-tecken.
- ✓getMimeEncoder() infogar radbrytningar var 76:e tecken — krävs av e-post (MIME) och PEM-certifikatformat.
- ✓För stora filer, använd Base64.getEncoder().wrap(OutputStream) för att streama utan att ladda hela filen i minnet.
Vad är Base64-kodning?
Base64 konverterar godtyckliga binärdata till en sträng bestående av 64 utskrivbara ASCII-tecken: A-Z, a-z, 0-9, + och /. Varje 3 indatabytes producerar exakt 4 Base64-tecken. Om indatalängden inte är en multipel av 3 läggs ett eller två = utfylltecken till. Den kodade utdatan är alltid ungefär 33% större än ursprungsdata.
Base64 är inte kryptering. Vem som helst med den kodade strängen kan avkoda den. Syftet är transportssäkerhet: HTTP-huvuden, JSON-payloads, XML-dokument och e-postkroppar är textbaserade protokoll som inte kan transportera råa binära bytes utan att de förstörs. Vanliga Java-användningsfall inkluderar HTTP Basic Authentication, inbäddning av PEM-certifikat, lagring av binärdata i textkolumner i databaser och konstruktion av JWT-tokensegment.
deploy-svc:sk_live_4eC39HqLyjWDarjtT1zdp7dc
ZGVwbG95LXN2Yzpza19saXZlXzRlQzM5SHFMeWpXRGFyanRUMXpkcDdkYw==
Base64.getEncoder().encodeToString() — Standard-API:et
java.util.Base64 introducerades i Java 8 som den officiella ersättaren för sun.misc.BASE64Encoder. Klassen tillhandahåller tre statiska fabriksmetoder — var och en returnerar en Base64.Encoder nästlad klassinstans — som täcker de tre Base64-varianter som definieras i RFC 4648. Inget tredjepartsbibliotek behövs. Inget Maven-beroende. Importera och anropa bara.
Minimalt exempel — Koda en sträng
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
}
}Det viktiga steget som de flesta Java-utvecklare missar vid första försöket: en String måste konverteras till byte[] före kodning. Base64 opererar på bytes, inte tecken. encodeToString() tar emot en byte[] och returnerar Base64- String direkt. Om du behöver det kodade resultatet som bytes i stället, använd encode(byte[]) — detta returnerar en byte[] av ASCII-kodade Base64-tecken, användbart när du skriver direkt till en OutputStream eller bygger binära protokollramar.
HTTP Basic Auth — Det vanligaste användningsfallet
HTTP Basic Authentication är förmodligen den enskilt vanligaste anledningen till att Java-utvecklare använder Base64-kodning. Specifikationen (RFC 7617) kräver att autentiseringssträngen användarnamn:lösenord Base64-kodas och placeras i Authorization-huvudet. Jag har sett detta göras fel fler gånger än jag kan räkna — vanligtvis genom att glömma kolonseparatorn eller koda komponenterna separat.
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
}
}Round-Trip — Koda och avkoda
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";
// Koda
String encoded = Base64.getEncoder()
.encodeToString(original.getBytes(StandardCharsets.UTF_8));
System.out.println(encoded);
// WC1Db3JyZWxhdGlvbi1JRDogcmVxXzhhNGYyYzkxLWU3YjMtNGQ1Ni05MDEyLTNmN2E4YjljMGQxZQ==
// Avkoda
byte[] decodedBytes = Base64.getDecoder().decode(encoded);
String decoded = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println(original.equals(decoded)); // true
}
}java.util.Base64 API:et är identiskt från Java 8 till Java 17 och Java 21. Ingen migrering behövs när du uppgraderar din JDK. Samma kod kompileras och körs på valfri version sedan Java 8.Koda icke-strängdata — byte[], UUID och tidsstämplar
Base64-kodning i Java börjar alltid med en byte[]. Strängar konverteras via getBytes(StandardCharsets.UTF_8), men andra typer behöver ett konverteringssteg först. UUID:n, tidsstämplar och numeriska identifierare måste serialiseras till en sträng- eller byte-representation innan du kan Base64-koda dem.
UUID — Koda som strängrepresentation
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);
// NmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4Kompakt UUID — Koda de råa 16 bytena
Om du vill ha ett kortare kodat resultat, extrahera UUID:ets 128 bitar som 16 råa bytes i stället för att konvertera till dess 36-teckens strängform. Base64-utdatan minskar från 48 tecken till 24.
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 tecken jämfört med 48 för den strängbaserade metodenTidsstämpel och blandad payload
import java.time.Instant;
import java.util.Base64;
import java.nio.charset.StandardCharsets;
// Simulerar en JWT-liknande 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-säker, utan utfyllnad)toString() på en byte[] i förväntan om att få dess innehåll — det ger dig arrayens identitetshash som [B@6d06d69c. Använd new String(bytes, StandardCharsets.UTF_8) eller skicka byte-arrayen direkt till encodeToString().Base64.Encoder — Metodreferens
Klassen java.util.Base64 exponerar tre fabriksmetoder, var och en returnerar en Base64.Encoder konfigurerad för en specifik variant. Kodarinstanserna är trådsäkra och tillståndslösa — skapa dem en gång och återanvänd dem.
Base64.getUrlEncoder() — URL-säker kodning
Den URL-säkra kodaren använder ett alternativt alfabet där + blir - och / blir _, som definieras i RFC 4648 avsnitt 5. Detta är viktigt när Base64-strängen visas i en URL-frågeparameter, ett filnamn eller ett cookie-värde — standardtecken i Base64 kolliderar med URL-avgränsare och filsystemets reserverade tecken.
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); // Standardkodare — innehåller + och / som bryter URL:er String standard = Base64.getEncoder().encodeToString(data); System.out.println(standard); // aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s/c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw== // URL-säker kodare — säker för frågeparametrar och filnamn String urlSafe = Base64.getUrlEncoder().encodeToString(data); System.out.println(urlSafe); // aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s_c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw== // URL-säker utan utfyllnad — för JWT:er och kompakta tokens String noPadding = Base64.getUrlEncoder().withoutPadding().encodeToString(data); System.out.println(noPadding); // aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s_c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw
Varianten withoutPadding() tar bort de avslutande = tecknen. JWT-specifikationer kräver URL-säker Base64 utan utfyllnad för header- och payload-segmenten, så getUrlEncoder().withoutPadding() är exakt det anrop du vill ha när du konstruerar eller manipulerar JWT-tokens manuellt.
withoutPadding() returnerar en ny kodarinstans — den modifierar inte originalet. Båda kan tilldelas static final-fält och återanvändas säkert i flera trådar.Koda från fil och API-svar
De två vanligaste verkliga scenarierna för Base64-kodning i Java: läsa en binärfil från disk (certifikat, bilder, konfigurationspaket) och koda data mottagen från ett HTTP-svar.
Koda en fil till Base64
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("Original: %d bytes%n", fileBytes.length);
System.out.printf("Kodad: %d tecken%n", encoded.length());
// Skriv kodat innehåll till en textfil
Files.writeString(
Path.of("certs/server.pem.b64"),
encoded
);
} catch (java.io.IOException e) {
System.err.println("Kunde inte läsa filen: " + e.getMessage());
}
}
}Koda ett API-svars body
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("Kodade %d bytes → %d tecken%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("Begäran misslyckades: " + e.getMessage());
}
}
}En kort notering innan CLI-avsnittet: om du bara behöver klistra in en fil eller ett API-svar och få Base64-utdata utan att skriva kod hanterar online Base64 Encoder både text- och binärindata.
Base64-kodning via kommandoraden
Ibland behöver du bara koda en sträng eller fil från terminalen — inget Java-projekt, ingen IDE, inget byggsteg. De flesta Unix-system levereras med ett base64 -kommando, och om du har ett JDK installerat kan du använda jshell för ett Java-nativt tillvägagångssätt.
# macOS / Linux — koda en sträng
echo -n "deploy-bot:sk_prod_9f2a7c4e" | base64
# ZGVwbG95LWJvdDpza19wcm9kXzlmMmE3YzRl
# Koda en fil
base64 < certs/server.pem > certs/server.pem.b64
# Med jshell (JDK 9+)
echo 'System.out.println(java.util.Base64.getEncoder().encodeToString("deploy-bot:sk_prod_9f2a7c4e".getBytes()))' | jshell -
# Med java direkt som en one-liner
java -e 'System.out.println(java.util.Base64.getEncoder().encodeToString(args[0].getBytes()))' "my-secret"
# Notera: java -e kräver JDK 23+ (JEP 477)jshell-metoden är särskilt användbar när du behöver verifiera att din Java-kod producerar samma utdata som ett Unix-verktyg, eller när du felsöker ett mismatch mellan vad din tjänst skickar och vad mottagaren förväntar sig. Jag har ett shell-alias för det.
base64 -D för avkodning. På Linux (GNU coreutils) används -d. Kodningsbeteendet är identiskt på båda. Flaggan -w 0 på Linux inaktiverar radbrytning i utdatan, vilket vanligtvis är vad du vill ha när du leder utdata till andra kommandon.Apache Commons Codec — Högprestandaalternativ
För de flesta applikationer är java.util.Base64 tillräckligt snabb. Men om du behandlar miljontals kodningsoperationer i en tät loop — tänk loggintagningspipelines eller meddelandebrokers med hög genomströmning — är Apache Commons Codec värt att benchmarka. Det har funnits länge före Java 8 och ger ett välbeprövat alternativ med ett något annorlunda API.
// 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);
// Standardkodning
String encoded = Base64.encodeBase64String(telemetryPayload);
// URL-säker kodning
String urlSafe = Base64.encodeBase64URLSafeString(telemetryPayload);
// Kontrollera om en sträng är giltig Base64
boolean valid = Base64.isBase64(encoded);
System.out.println(valid); // trueApache Commons Codec tillhandahåller även Base64OutputStream och Base64InputStream för streamingscenarier och inkluderar en valideringsmetod som JDK-kodaren saknar. Om Commons Codec redan finns i ditt beroendeträd (det ingår i många Apache-projekt) finns det ingen anledning att låta bli att använda det.
Guava BaseEncoding
Googles Guava-bibliotek inkluderar BaseEncoding som erbjuder ett flytande API för Base64 med konfigurerbar radavskiljare, utfyllnadskontroll och stöd för både standard- och URL-säkra alfabet. API:et läser bra, men att lägga till Guava (ungefär 3 MB) enbart för Base64-kodning är överdrivet. Om Guava redan finns i ditt projekt för dess samlingar eller caching-verktyg är kodnings-API:et en trevlig bonus.
// 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);
// Standard Base64
String standard = BaseEncoding.base64().encode(webhookPayload);
// URL-säker
String urlSafe = BaseEncoding.base64Url().encode(webhookPayload);
// Utan utfyllnad
String noPad = BaseEncoding.base64Url().omitPadding().encode(webhookPayload);
// Med radavskiljare (PEM-stil)
String wrapped = BaseEncoding.base64()
.withSeparator("\n", 64)
.encode(webhookPayload);Base64.getMimeEncoder() — MIME- och PEM-radbruten utdata
MIME-kodaren infogar \r\n radbrytningar var 76:e tecken, i enlighet med MIME-specifikationen (RFC 2045). PEM-certifikat, S/MIME-e-postbilagor och vissa äldre API:er förväntar sig detta format. Standard- och URL-säkra kodare producerar en enda obruten rad — om du skickar deras utdata till ett system som förväntar sig radbruten Base64 kan det tyst misslyckas eller avvisa data.
import java.util.Base64;
import java.nio.charset.StandardCharsets;
// Simulerar en PEM-certifikatskropp
byte[] certData = new byte[256]; // I praktiken, läs från en .der-fil
new java.security.SecureRandom().nextBytes(certData);
// Standard MIME-kodare — 76 tecken per rad, \r\n-avskiljare
String mimeEncoded = Base64.getMimeEncoder().encodeToString(certData);
System.out.println(mimeEncoded);
// QYx2K3p8Xg7JmN1R+wFkLd... (76 tecken)
// Ht5Bv9CzAq0PnSjYl8WxUe... (76 tecken)
// ...
// Anpassad MIME-kodare — 64 tecken per rad (PEM-standard), \n-avskiljare
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-----");getMimeEncoder() för JWT-tokens, HTTP-huvuden eller URL-parametrar. Radbrytningarna kommer att förstöra data i dessa sammanhang. Använd getEncoder() eller getUrlEncoder() i stället.Streama stora filer med Base64.getEncoder().wrap()
Att ladda en hel fil till en byte[] med Files.readAllBytes() fungerar för små filer, men för allt över 50-100 MB riskerar du OutOfMemoryError. JDK:et erbjuder Base64.getEncoder().wrap(OutputStream), som returnerar en OutputStream som kodar data direkt när du skriver till den. De kodade bytena flödar vidare till den underliggande strömmen utan att buffra hela indata.
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("Streamade %d bytes genom Base64-kodaren%n", totalBytes);
}
// Stängning av base64Out tömmer automatiskt de sista utfyllnadsbytena
}
}Try-with-resources-blocket hanterar tömning och stängning. En detalj som många fastnar på: den sista Base64-utfyllnaden skrivs bara när den omslutande OutputStream stängs. Om du glömmer att stänga den (eller bara stänger den yttre strömmen) kan de sista tecknen i din kodade utdata saknas.
Streama till en nätverkssocket
Metoden wrap() fungerar med valfri OutputStream — filutdata, socketutdata, HTTP-svarskropp, till och med ByteArrayOutputStream. Här är ett exempel som skriver Base64-kodad data direkt till en minnesbuffert, vilket är användbart för enhetstestning eller att bygga payloads som ska skickas via HTTP:
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)) {
// Skriv data i bitar — simulerar läsning från en ström
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=
// Verifiera round-trip
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-segmentBufferedInputStream och är en bra balans mellan minnesanvändning och systemanropsoverhead. Mindre buffertar ökar antalet läs/skrivanrop; större buffertar slösar minne utan meningsfull genomströmningsförbättring.Trådsäkra kodarinstanser — Lagra och återanvänd
Den Base64.Encoder som returneras av fabriksmetoderna är oföränderlig och trådsäker. Att anropa Base64.getEncoder() vid varje kodningsoperation skapar ett nytt objekt varje gång. JVM:en optimerar förmodligen bort detta, men att lagra kodaren i ett static final -fält tydliggör avsikten och undviker onödiga allokeringar i heta kodstigar.
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class TokenService {
// Skapa en gång, återanvänd överallt — trådsäker
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);
}
}Det här mönstret är särskilt användbart i Spring Boot-tjänster där en verktygsklass hanterar kodning för flera controllers eller servicemetoder. Anropet withoutPadding() returnerar en ny kodarinstans, så du kan lagra både utfylld och outfylld variant som separata fält. Varje anrop till encodeToString() eller encode() är tillståndslöst — ingen synkronisering behövs, inget delat muterbart tillstånd.
Vanliga misstag
Problem: String.getBytes() utan ett teckenuppsättningsargument använder plattformens standardkodning, som är windows-1252 på Windows, UTF-8 på de flesta Linux-system och varierar på macOS. Samma kod producerar olika Base64-utdata på olika maskiner.
Lösning: Skicka alltid StandardCharsets.UTF_8 explicit.
String text = "Åtkomstnyckel: prod-east"; byte[] bytes = text.getBytes(); // plattformsstandard — oförutsägbar String encoded = Base64.getEncoder().encodeToString(bytes);
String text = "Åtkomstnyckel: prod-east"; byte[] bytes = text.getBytes(StandardCharsets.UTF_8); String encoded = Base64.getEncoder().encodeToString(bytes);
Problem: Base64.getEncoder() producerar tecknen + och /. När de placeras i en URL-frågesträng tolkas + som mellanslag och / som sökvägsseparator, vilket tyst förstör värdet hos mottagaren.
Lösning: Använd Base64.getUrlEncoder() för alla värden som ska visas i en URL.
// Token i URL-frågeparameter — kommer att gå sönder
String token = Base64.getEncoder()
.encodeToString(sessionData);
String url = "https://auth.internal/verify?token=" + token;// URL-säker kodning — inga + eller /-tecken
String token = Base64.getUrlEncoder()
.withoutPadding()
.encodeToString(sessionData);
String url = "https://auth.internal/verify?token=" + token;Problem: Att koda med getUrlEncoder() och avkoda med getDecoder() (eller vice versa) kastar IllegalArgumentException eftersom - och _ inte är giltiga i standard-Base64-alfabetet, och + och / inte är giltiga i det URL-säkra alfabetet.
Lösning: Avkoda alltid med matchande avkodare: getUrlDecoder() för URL-säker, getDecoder() för standard.
String encoded = Base64.getUrlEncoder()
.encodeToString(data);
// Senare...
byte[] decoded = Base64.getDecoder() // FEL avkodare
.decode(encoded);
// IllegalArgumentException om encoded innehåller - eller _String encoded = Base64.getUrlEncoder()
.encodeToString(data);
// Senare...
byte[] decoded = Base64.getUrlDecoder() // matchande avkodare
.decode(encoded);Problem: Streamingkodaren buffrar upp till 2 indatabytes och väntar på en komplett 3-byte-grupp. Om du inte stänger den omslutande OutputStream skrivs aldrig de sista 1-4 Base64-tecknen (inklusive utfyllnad).
Lösning: Använd try-with-resources, eller anropa close() explicit på den omslutna strömmen innan du läser utdatan.
ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStream b64os = Base64.getEncoder().wrap(baos); b64os.write(data); // baos.toString() är OFULLSTÄNDIG — saknar sista bytes
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (OutputStream b64os = Base64.getEncoder().wrap(baos)) {
b64os.write(data);
} // close() tömmer den sista utfyllnaden
String encoded = baos.toString(); // komplettBase64-kodningsmetoder — Jämförelse
För de flesta projekt är java.util.Base64 det rätta valet. Noll beroenden, inbyggt i JDK, trådsäkert och täcker alla tre RFC 4648-varianter. Välj Apache Commons Codec bara om det redan finns i din classpath och du behöver valideringsmetoden isBase64() eller streaming- Base64OutputStream. Guavas BaseEncoding är ett rimligt alternativ om ditt projekt redan beror på Guava, men att lägga till ett 3 MB-beroende enbart för Base64 är svårt att motivera.
Tre scenarier, tre val: en vanlig webbtjänst som behöver Basic Auth eller JWT-kodning? Håll dig till JDK. Äldre projekt som redan drar in Commons Codec via Spring eller Apache HTTP Client? Använd det — det finns ingen anledning att ha två Base64-bibliotek i classpath. Projekt som använder Guava för caching och samlingar? Använd BaseEncoding för dess rena flytande API. Lägg aldrig till ett bibliotek enbart för Base64-kodning — JDK-versionen har varit tillräcklig sedan 2014.
Om du snabbt behöver verifiera ett kodat resultat utan att köra din Java-kod, klistra in det i Base64 Encoder för att bekräfta att utdatan stämmer med vad din kod producerar.
Vanliga frågor
Hur Base64-kodar jag en sträng i Java?
Konvertera strängen till bytes först med getBytes(StandardCharsets.UTF_8) och skicka sedan byte-arrayen till Base64.getEncoder().encodeToString(). Ange alltid UTF-8 explicit — att anropa getBytes() utan teckenuppsättningsargument använder plattformens standard, som varierar mellan operativsystem och JVM-konfigurationer.
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));
// Z3JhbnRfdHlwZT1jbGllbnRfY3JlZGVudGlhbHMmc2NvcGU9cmVhZDptZXRyaWNzVad är skillnaden mellan Base64.getEncoder() och Base64.getUrlEncoder()?
Båda kodar till Base64, men getUrlEncoder() använder det URL-säkra alfabetet som definieras i RFC 4648 avsnitt 5. Det ersätter + med - och / med _ så att utdata kan visas i URL:er och filnamn utan procentkodning. Standardkodaren använder + och / som kolliderar med URL-frågeparametrar och sökvägssegment.
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 // (samma här, men med + → - och / → _ när dessa tecken förekommer)
Är java.util.Base64 densamma i Java 8 och Java 17?
Ja. java.util.Base64 API:et har inte förändrats sedan det introducerades i Java 8. Klassen, dess nästlade Encoder- och Decoder-klasser samt alla fabriksmetoder (getEncoder, getUrlEncoder, getMimeEncoder) är identiska i Java 8, 11, 17 och 21. Ingen migrering eller kodändringar behövs när du uppgraderar din JDK-version.
// Den här koden kompileras och körs identiskt på Java 8 till 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==Hur Base64-kodar jag en fil i Java?
Läs in filen till en byte-array med Files.readAllBytes(Path) och skicka den till Base64.getEncoder().encodeToString(). För stora filer som inte bör laddas in i minnet i sin helhet, använd Base64.getEncoder().wrap(OutputStream) för att streama den kodade utdata.
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);Varför deprecerades sun.misc.BASE64Encoder?
sun.misc.BASE64Encoder var en intern JDK-klass som aldrig ingick i det publika API:et. Den låg i paketet sun.misc som Oracle uttryckligen varnade mot att använda. Java 8 introducerade java.util.Base64 som den officiella, publika och stödda ersättaren. Sedan Java 9 och modulsystemet ger åtkomst till sun.misc-klasser varningar eller fel beroende på JDK-konfiguration.
// Gammalt sätt — använd INTE, borttaget i moderna JDK:er // import sun.misc.BASE64Encoder; // String encoded = new BASE64Encoder().encode(data); // Korrekt sätt sedan Java 8 import java.util.Base64; String encoded = Base64.getEncoder().encodeToString(data);
Hur gör jag en round-trip Base64-kodning och avkodning i Java?
Koda med Base64.getEncoder().encodeToString(bytes) och avkoda med Base64.getDecoder().decode(encodedString). Konvertera den avkodade byte-arrayen tillbaka till en sträng med new String(bytes, StandardCharsets.UTF_8). Round-tripen bevarar originaldata exakt — så länge du använder samma teckenuppsättning för både getBytes() och new String().
import java.util.Base64; import java.nio.charset.StandardCharsets; // Koda String original = "session_token=eyJhbGciOiJSUzI1NiJ9"; byte[] originalBytes = original.getBytes(StandardCharsets.UTF_8); String encoded = Base64.getEncoder().encodeToString(originalBytes); // Avkoda byte[] decodedBytes = Base64.getDecoder().decode(encoded); String decoded = new String(decodedBytes, StandardCharsets.UTF_8); System.out.println(original.equals(decoded)); // true
Relaterade verktyg
- Base64 Decoder — Avkoda Base64-strängar tillbaka till ursprunglig text eller binärform — den omvända operationen till kodning.
- URL Encoder — Procentkoda strängar för säker användning i URL:er — skiljer sig från URL-säker Base64-kodning men används ofta sida vid sida.
- JWT Decoder — Inspektera JWT-tokens vars header- och payload-segment är Base64url-kodad JSON — avkoda dem utan ett bibliotek.
- JSON Formatter — Formatera JSON-payloads snyggt före eller efter Base64-kodning — användbart vid felsökning av API-integrationer.
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.
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.