Java'da Base64 Kodlama — java.util.Base64 Örnekleri
Ücretsiz Base64 Kodlayıcı Online aracını doğrudan tarayıcınızda kullanın — kurulum gerektirmez.
Base64 Kodlayıcı Online Online Dene →Bir HTTP Basic Auth başlığı oluştururken, Kubernetes secret'ına sertifika gömerken ya da JSON API üzerinden ikili veri iletirken ilk adım hep aynıdır: base64 kodlama ile ham baytları ASCII güvenli bir string'e dönüştürmek. Java, kullanımdan kaldırılan sun.misc.BASE64Encoder'ın yerini alan ve Java 8'den bu yana standart API olan java.util.Base64 ile bunu kolaylaştırıyor. Kod yazmadan hızlı bir kodlama için ToolDeck'in Base64 Encoder aracı tarayıcıda anında sonuç verir. Bu kılavuz Base64.getEncoder(), getUrlEncoder(), getMimeEncoder(), dosya kodlama, wrap(OutputStream) ile akış ve deneyimli Java geliştiricilerinin bile düştüğü hataları kapsar. Tüm örnekler Java 8 ile Java 21+ arasında derlenir.
- ✓Base64.getEncoder().encodeToString(bytes), Java 8'den bu yana JDK'ya yerleşik standart tek satırdır; Java 17 ve 21'de de değişmedi.
- ✓Kodlamadan önce String.getBytes() metoduna her zaman StandardCharsets.UTF_8 geçin — atladığınızda platform varsayılanı kullanılır ve bu JVM'ler arasında farklılık gösterir.
- ✓getUrlEncoder(), URL güvenli çıktı üretir (+ yerine -, / yerine _) ve withoutPadding() sondaki = karakterlerini kaldırır.
- ✓getMimeEncoder() her 76 karakterde bir satır sonu ekler — e-posta (MIME) ve PEM sertifika formatlarının gerektirdiği budur.
- ✓Büyük dosyalar için, tüm dosyayı belleğe yüklemeden akış sağlamak üzere Base64.getEncoder().wrap(OutputStream) kullanın.
Base64 Kodlama Nedir?
Base64, rastgele ikili veriyi 64 yazdırılabilir ASCII karakterden oluşan bir string'e dönüştürür: A-Z, a-z, 0-9, + ve /. Her 3 bayt girdi tam olarak 4 Base64 karakteri üretir. Girdi uzunluğu 3'ün katı değilse bir veya iki = dolgu karakteri eklenir. Kodlanmış çıktı her zaman orijinal veriden yaklaşık %33 daha büyüktür.
Base64 bir şifreleme değildir. Kodlanmış string'e sahip olan herkes onu çözebilir. Amacı aktarım güvenliğidir: HTTP başlıkları, JSON yükleri, XML belgeler ve e-posta gövdeleri ham ikili baytları bozulmadan taşıyamayan metin tabanlı protokollerdir. Yaygın Java kullanım durumları arasında HTTP Basic Authentication, PEM sertifikalarını gömmek, ikili veriyi veritabanı metin sütunlarında saklamak ve JWT token segmentleri oluşturmak sayılabilir.
deploy-svc:sk_live_4eC39HqLyjWDarjtT1zdp7dc
ZGVwbG95LXN2Yzpza19saXZlXzRlQzM5SHFMeWpXRGFyanRUMXpkcDdkYw==
Base64.getEncoder().encodeToString() — Standart API
java.util.Base64 Java 8'de sun.misc.BASE64Encoder'ın resmi yerini almak üzere tanıtıldı. Sınıf, her biri belirli bir varyant için yapılandırılmış bir Base64.Encoder iç sınıf örneği döndüren üç statik fabrika metodu sunar — RFC 4648'de tanımlanan üç Base64 varyantını kapsar. Üçüncü taraf kütüphane gerekmez. Maven bağımlılığı yok. Sadece import edin ve çağırın.
Temel Örnek — String Kodlama
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
}
}Çoğu Java geliştiricisinin ilk seferde atladığı kritik adım: String kodlamadan önce byte[]'a dönüştürülmek zorundadır. Base64 karakterler üzerinde değil, baytlar üzerinde çalışır. encodeToString() bir byte[] alır ve Base64 String'i doğrudan döndürür. Kodlanmış sonuca bayt olarak ihtiyaç duyuyorsanız encode(byte[]) kullanın — bu, ASCII kodlu Base64 karakterlerinin byte[]'ını döndürür; doğrudan OutputStream'e yazarken veya ikili protokol çerçeveleri oluştururken kullanışlıdır.
HTTP Basic Auth — En Yaygın Kullanım Durumu
HTTP Basic Authentication, Java geliştiricilerinin Base64 kodlamaya başvurduğu tek en yaygın nedendir. Spesifikasyon (RFC 7617), kimlik bilgileri string'inin kullanıcıadı:şifre biçiminde Base64 kodlanarak Authorization başlığına yerleştirilmesini gerektirir. Bunu yanlış yapıldığını pek çok kez gördüm — genellikle iki noktalı ayırıcıyı unutarak veya bileşenleri ayrı ayrı kodlayarak.
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";
// kullanıcıadı:şifre → 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
}
}Döngü — Kodlama ve Çözme
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";
// Kodla
String encoded = Base64.getEncoder()
.encodeToString(original.getBytes(StandardCharsets.UTF_8));
System.out.println(encoded);
// WC1Db3JyZWxhdGlvbi1JRDogcmVxXzhhNGYyYzkxLWU3YjMtNGQ1Ni05MDEyLTNmN2E4YjljMGQxZQ==
// Çöz
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'si Java 8'den Java 17 ve Java 21'e kadar aynıdır. JDK yükseltirken herhangi bir geçiş gerekmez. Aynı kod Java 8'den bu yana her sürümde derlenir ve çalışır.String Olmayan Veriyi Kodlama — byte[], UUID ve Zaman Damgaları
Java'da Base64 kodlama her zaman bir byte[] ile başlar. String'ler getBytes(StandardCharsets.UTF_8) aracılığıyla dönüştürülür, ancak diğer türlerin önce dönüştürme adımına ihtiyacı vardır. UUID'ler, zaman damgaları ve sayısal tanımlayıcılar Base64 ile kodlanabilmek için önce string veya bayt gösterimine dönüştürülmelidir.
UUID — String Gösterimi Olarak Kodlama
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 — Ham 16 Baytı Kodlama
Daha kısa bir kodlanmış sonuç istiyorsanız UUID'yi 36 karakterlik string biçimine dönüştürmek yerine 128 bitini 16 ham bayt olarak çıkarın. Base64 çıktısı 48 karakterden 24'e düşer.
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
// String tabanlı yaklaşıma göre 48 karakter yerine 22 karakterZaman Damgası ve Karışık Yük
import java.time.Instant;
import java.util.Base64;
import java.nio.charset.StandardCharsets;
// JWT tarzı yük simülasyonu
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 güvenli, dolgu yok)byte[] üzerinde içeriğini almayı bekleyerek toString() çağırmayın — bu size [B@6d06d69c gibi dizinin kimlik hash'ini verir. Bunun yerine new String(bytes, StandardCharsets.UTF_8) kullanın ya da bayt dizisini doğrudan encodeToString()'e iletin.Base64.Encoder Metot Referansı
java.util.Base64 sınıfı, her biri belirli bir varyant için yapılandırılmış bir Base64.Encoder döndüren üç fabrika metodu sunar. Kodlayıcı örnekleri thread-safe ve durumsuz — bir kez oluşturup yeniden kullanabilirsiniz.
Base64.getUrlEncoder() — URL Güvenli Kodlama
URL güvenli kodlayıcı, RFC 4648 Bölüm 5'te tanımlandığı üzere +'nın -'ya ve /'nin _'ya dönüştürüldüğü alternatif bir alfabe kullanır. Bu, Base64 string'in bir URL sorgu parametresinde, dosya adında veya çerez değerinde göründüğü durumlarda önemlidir — standart Base64 karakterleri URL sınırlayıcıları ve dosya sistemi ayrılmış karakterleriyle çakışır.
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); // Standart kodlayıcı — URL'leri bozan + ve / içerir String standard = Base64.getEncoder().encodeToString(data); System.out.println(standard); // aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s/c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw== // URL güvenli kodlayıcı — sorgu parametreleri ve dosya adları için güvenli String urlSafe = Base64.getUrlEncoder().encodeToString(data); System.out.println(urlSafe); // aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s_c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw== // Dolgu yok — JWT'ler ve kompakt token'lar için String noPadding = Base64.getUrlEncoder().withoutPadding().encodeToString(data); System.out.println(noPadding); // aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s_c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw
withoutPadding() varyantı sondaki = karakterlerini kaldırır. JWT spesifikasyonları başlık ve yük segmentleri için dolgu olmayan URL güvenli Base64 gerektirir; bu nedenle JWT token'larını elle oluştururken veya işlerken tam olarak ihtiyaç duyduğunuz çağrı getUrlEncoder().withoutPadding()'dir.
withoutPadding() metodu yeni bir kodlayıcı örneği döndürür — orijinali değiştirmez. Her ikisi de static final alanlara atanabilir ve thread'ler arasında güvenle yeniden kullanılabilir.Dosya ve API Yanıtından Kodlama
Java'da Base64 kodlamanın en yaygın iki gerçek dünya senaryosu: diskten ikili dosya okuma (sertifikalar, görseller, yapılandırma paketleri) ve bir HTTP yanıtından alınan veriyi kodlama.
Dosyayı Base64 ile Kodlama
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("Orijinal: %d bayt%n", fileBytes.length);
System.out.printf("Kodlanmış: %d karakter%n", encoded.length());
// Kodlanmış içeriği metin dosyasına yaz
Files.writeString(
Path.of("certs/server.pem.b64"),
encoded
);
} catch (java.io.IOException e) {
System.err.println("Dosya okunamadı: " + e.getMessage());
}
}
}API Yanıt Gövdesini Kodlama
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("%d bayt → %d karakter kodlandı%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("İstek başarısız: " + e.getMessage());
}
}
}CLI bölümünden önce kısa bir not: bir dosyayı veya API yanıtını yapıştırıp kod yazmadan Base64 çıktısını almak istiyorsanız çevrimiçi Base64 Encoder hem metin hem ikili girdiyi destekler.
Komut Satırından Base64 Kodlama
Bazen terminalde bir string veya dosyayı kodlamanız yeterlidir — Java projesi, IDE veya derleme adımı olmadan. Çoğu Unix sistemi base64 komutuyla gelir; JDK kuruluysa Java'ya özgü bir yaklaşım için jshell kullanabilirsiniz.
# macOS / Linux — string kodlama
echo -n "deploy-bot:sk_prod_9f2a7c4e" | base64
# ZGVwbG95LWJvdDpza19wcm9kXzlmMmE3YzRl
# Dosya kodlama
base64 < certs/server.pem > certs/server.pem.b64
# jshell kullanımı (JDK 9+)
echo 'System.out.println(java.util.Base64.getEncoder().encodeToString("deploy-bot:sk_prod_9f2a7c4e".getBytes()))' | jshell -
# java ile tek satır
java -e 'System.out.println(java.util.Base64.getEncoder().encodeToString(args[0].getBytes()))' "my-secret"
# Not: java -e JDK 23+ gerektirir (JEP 477)jshell yaklaşımı, Java kodunuzun bir Unix aracıyla aynı çıktıyı üretip üretmediğini doğrulamanız veya servisinizin gönderdiği ile alıcının beklediği arasındaki uyumsuzluğu ayıklamanız gerektiğinde oldukça kullanışlıdır. Bu amaçla bir shell takma adı oluşturdum.
base64 komutu çözme için -D kullanır. Linux'ta (GNU coreutils) ise -d kullanılır. Kodlama davranışı her ikisinde de aynıdır. Linux'taki -w 0 bayrağı çıktıda satır kaydırmayı devre dışı bırakır; diğer komutlara aktarırken genellikle istenen budur.Apache Commons Codec — Yüksek Performanslı Alternatif
Çoğu uygulama için java.util.Base64 yeterince hızlıdır. Ancak sıkı bir döngüde milyonlarca kodlama işlemi yapıyorsanız — log alım pipeline'ları veya yüksek verimli mesaj broker'ları düşünün — Apache Commons Codec kıyaslanmaya değer. Java 8'den çok önce var olan bu kütüphane, biraz farklı bir API yüzeyi ile savaşta test edilmiş bir alternatif sunar.
// 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);
// Standart kodlama
String encoded = Base64.encodeBase64String(telemetryPayload);
// URL güvenli kodlama
String urlSafe = Base64.encodeBase64URLSafeString(telemetryPayload);
// String'in geçerli Base64 olup olmadığını kontrol et
boolean valid = Base64.isBase64(encoded);
System.out.println(valid); // trueApache Commons Codec ayrıca akış senaryoları için Base64OutputStream ve Base64InputStream sağlar; JDK kodlayıcısının eksik olduğu bir doğrulama metodu da içerir. Commons Codec zaten bağımlılık ağacınızdaysa (birçok Apache projesinde bulunur), onu kullanmak için hiçbir neden yoktur.
Guava BaseEncoding
Google'ın Guava kütüphanesi, yapılandırılabilir satır ayırıcıları, dolgu kontrolü ve hem standart hem URL güvenli alfabe desteğiyle akıcı bir API sunan BaseEncoding'i içerir. API temiz okunur, ancak yalnızca Base64 kodlama için Guava (yaklaşık 3 MB) eklemek gereksiz fazladır. Guava zaten koleksiyon veya önbellekleme yardımcıları için projenizdeyse kodlama API'si güzel bir bonus olur.
// 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);
// Standart Base64
String standard = BaseEncoding.base64().encode(webhookPayload);
// URL güvenli
String urlSafe = BaseEncoding.base64Url().encode(webhookPayload);
// Dolgu yok
String noPad = BaseEncoding.base64Url().omitPadding().encode(webhookPayload);
// Satır ayırıcılı (PEM tarzı)
String wrapped = BaseEncoding.base64()
.withSeparator("\n", 64)
.encode(webhookPayload);Base64.getMimeEncoder() — MIME ve PEM Satır Sarmalı Çıktı
MIME kodlayıcı, MIME spesifikasyonuna (RFC 2045) uygun olarak her 76 karakterde \r\n satır sonu ekler. PEM sertifikaları, S/MIME e-posta ekleri ve bazı eski API'ler bu formatı bekler. Standart ve URL güvenli kodlayıcılar tek kesintisiz bir satır üretir — satır sarmalı Base64 bekleyen bir sisteme çıktılarını iletirseniz, sistem sessizce başarısız olabilir veya veriyi reddedebilir.
import java.util.Base64;
import java.nio.charset.StandardCharsets;
// PEM sertifika gövdesi simülasyonu
byte[] certData = new byte[256]; // Pratikte .der dosyasından okunur
new java.security.SecureRandom().nextBytes(certData);
// Varsayılan MIME kodlayıcı — satır başına 76 karakter, \r\n ayırıcı
String mimeEncoded = Base64.getMimeEncoder().encodeToString(certData);
System.out.println(mimeEncoded);
// QYx2K3p8Xg7JmN1R+wFkLd... (76 karakter)
// Ht5Bv9CzAq0PnSjYl8WxUe... (76 karakter)
// ...
// Özel MIME kodlayıcı — satır başına 64 karakter (PEM standardı), \n ayırıcı
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() kullanmayın. Satır sonları bu bağlamlarda veriyi bozar. Bunun yerine getEncoder() veya getUrlEncoder() kullanın.Base64.getEncoder().wrap() ile Büyük Dosyaları Akış Halinde Kodlama
Tüm dosyayı Files.readAllBytes() ile bir byte[]'a yüklemek küçük dosyalar için işe yarar; ancak 50-100 MB'ın üzerindeki dosyalarda OutOfMemoryError riskiyle karşılaşırsınız. JDK, Base64.getEncoder().wrap(OutputStream) sağlar; bu, siz yazarken veriyi anında kodlayan bir OutputStream döndürür. Kodlanmış baytlar, tüm girdiyi tamponlamadan altta yatan akışa akar.
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("%d bayt Base64 kodlayıcıdan geçirildi%n", totalBytes);
}
// base64Out kapatıldığında son dolgu baytları otomatik olarak yazılır
}
}Try-with-resources bloğu temizleme ve kapatma işlemlerini yönetir. İnsanların takıldığı bir detay: son Base64 dolgusu yalnızca sarmalayıcı OutputStream kapatıldığında yazılır. Kapatmayı unutursanız (veya yalnızca dış akışı kapatırsanız), kodlanmış çıktınızın son birkaç karakteri eksik olabilir.
Ağ Soketine Akış
wrap() metodu herhangi bir OutputStream ile çalışır — dosya çıktısı, soket çıktısı, HTTP yanıt gövdesi, hatta ByteArrayOutputStream. Aşağıda, birim testi veya HTTP üzerinden gönderilecek yük oluşturmak için kullanışlı olan, Base64 kodlu veriyi doğrudan bellek içi tampon'a yazan bir örnek verilmiştir:
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)) {
// Veriyi parçalar halinde yaz — akıştan okumayı simüle eder
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=
// Döngüyü doğrula
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'in varsayılan tampon boyutuyla eşleşir ve bellek kullanımı ile sistem çağrısı yükü arasında iyi bir denge sağlar. Daha küçük tamponlar okuma/yazma çağrısı sayısını artırır; daha büyük tamponlar bellek tüketir ancak anlamlı bir verim iyileştirmesi sağlamaz.Thread-Safe Kodlayıcı Örnekleri — Saklayın ve Yeniden Kullanın
Fabrika metotlarının döndürdüğü Base64.Encoder değişmez ve thread-safe'dir. Her kodlama işleminde Base64.getEncoder() çağırmak her seferinde yeni bir nesne oluşturur. JVM bunu büyük olasılıkla optimize eder, ancak kodlayıcıyı bir static final alanda saklamak niyeti netleştirir ve yoğun yollarda gereksiz bellek tahsislerini önler.
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class TokenService {
// Bir kez oluştur, her yerde kullan — thread-safe
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);
}
}Bu desen, kodlamanın birden fazla controller veya servis metodu arasında paylaşıldığı Spring Boot servislerinde özellikle kullanışlıdır. withoutPadding() çağrısı yeni bir kodlayıcı örneği döndürür; böylece hem dolgulu hem dolgusuz varyantları ayrı alanlarda saklayabilirsiniz. encodeToString() veya encode()'e yapılan her çağrı durumsuz — senkronizasyon gerekmez, paylaşılan değişken durum yoktur.
Yaygın Hatalar
Sorun: Charset argümanı olmadan String.getBytes() çağırmak, platformun varsayılan kodlamasını kullanır: Windows'ta windows-1252, çoğu Linux sisteminde UTF-8 ve macOS'ta değişkendir. Aynı kod farklı makinelerde farklı Base64 çıktısı üretir.
Çözüm: Her zaman StandardCharsets.UTF_8 açıkça geçin.
String text = "Ключ доступа: prod-east"; byte[] bytes = text.getBytes(); // platform varsayılanı — öngörülemez String encoded = Base64.getEncoder().encodeToString(bytes);
String text = "Ключ доступа: prod-east"; byte[] bytes = text.getBytes(StandardCharsets.UTF_8); String encoded = Base64.getEncoder().encodeToString(bytes);
Sorun: Base64.getEncoder(), + ve / karakterleri üretir. URL sorgu dizisine yerleştirildiğinde, + boşluk ve / yol ayırıcısı olarak yorumlanarak alıcı tarafta sessizce veriyi bozar.
Çözüm: URL'de görünecek herhangi bir değer için Base64.getUrlEncoder() kullanın.
// URL sorgu parametresindeki token — bozulur
String token = Base64.getEncoder()
.encodeToString(sessionData);
String url = "https://auth.internal/verify?token=" + token;// URL güvenli kodlama — + veya / karakteri yok
String token = Base64.getUrlEncoder()
.withoutPadding()
.encodeToString(sessionData);
String url = "https://auth.internal/verify?token=" + token;Sorun: getUrlEncoder() ile kodlayıp getDecoder() ile çözmek (veya tam tersi) IllegalArgumentException fırlatır; çünkü - ve _ standart Base64 alfabesinde, + ve / ise URL güvenli alfabede geçerli değildir.
Çözüm: Her zaman eşleşen çözücüyü kullanın: URL güvenli için getUrlDecoder(), standart için getDecoder().
String encoded = Base64.getUrlEncoder()
.encodeToString(data);
// Daha sonra...
byte[] decoded = Base64.getDecoder() // YANLIŞ çözücü
.decode(encoded);
// Kodlanmış - veya _ içeriyorsa IllegalArgumentExceptionString encoded = Base64.getUrlEncoder()
.encodeToString(data);
// Daha sonra...
byte[] decoded = Base64.getUrlDecoder() // eşleşen çözücü
.decode(encoded);Sorun: Akış kodlayıcısı, tam 3 baytlık grubu beklerken en fazla 2 giriş baytını tamponlar. Sarmalayıcı OutputStream'i kapatmazsanız son 1-4 Base64 karakteri (dolgu dahil) hiçbir zaman yazılmaz.
Çözüm: Try-with-resources kullanın veya çıktıyı okumadan önce sarmalı akış üzerinde close() metodunu açıkça çağırın.
ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStream b64os = Base64.getEncoder().wrap(baos); b64os.write(data); // baos.toString() EKSİK — son baytlar yazılmadı
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (OutputStream b64os = Base64.getEncoder().wrap(baos)) {
b64os.write(data);
} // close() son dolguyu yazar
String encoded = baos.toString(); // tamBase64 Kodlama Metotları — Karşılaştırma
Çoğu proje için: java.util.Base64 doğru seçimdir. Sıfır bağımlılık, JDK'ya yerleşik, thread-safe ve RFC 4648'in üç varyantını kapsar. Apache Commons Codec'e yalnızca zaten classpath'inizdeyse ve isBase64() doğrulama metoduna veya akış tabanlı Base64OutputStream'e ihtiyaç duyuyorsanız başvurun. Guava'nın BaseEncoding'i, projeniz zaten Guava'ya bağımlıysa mantıklı bir seçenektir; ancak yalnızca Base64 için 3 MB'lık bir bağımlılık eklemek savunulması güç bir karardır.
Üç senaryo, üç tercih: Basic Auth veya JWT kodlama gerektiren standart bir web servisi mi? JDK ile devam edin. Spring veya Apache HTTP Client aracılığıyla Commons Codec çeken bir legacy proje mi? Kullanın — classpath'te iki Base64 kütüphanesi bulundurmanın anlamı yoktur. Önbellekleme ve koleksiyonlar için Guava kullanan bir proje mi? Temiz akıcı API'si için BaseEncoding kullanın. Yalnızca Base64 kodlama için asla kütüphane eklemeyin — JDK sürümü 2014'ten bu yana yeterince iyidir.
Java kodunuzu çalıştırmadan kodlanmış bir sonucu hızlıca doğrulamanız gerekirse, Base64 Encoder aracına yapıştırın ve kodunuzun ürettiğiyle eşleşip eşleşmediğini kontrol edin.
Sıkça Sorulan Sorular
Java'da bir String nasıl Base64 kodlanır?
Önce getBytes(StandardCharsets.UTF_8) ile string'i bayta dönüştürün, ardından bayt dizisini Base64.getEncoder().encodeToString() metoduna iletin. UTF-8'i her zaman açıkça belirtin — charset argümanı olmadan getBytes() çağırmak, işletim sistemleri ve JVM yapılandırmaları arasında farklılık gösteren platform varsayılanını kullanır.
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));
// Z3JhbnRfdHlwZT1jbGllbnRfY3JlZGVudGlhbHMmc2NvcGU9cmVhZDptZXRyaWNzBase64.getEncoder() ile Base64.getUrlEncoder() arasındaki fark nedir?
Her ikisi de Base64'e kodlar, ancak getUrlEncoder() RFC 4648 Bölüm 5'te tanımlanan URL güvenli alfabeyi kullanır. + yerine - ve / yerine _ koyar; böylece çıktı URL'lerde ve dosya adlarında percent-encoding gerektirmeden kullanılabilir. Standart kodlayıcı + ve / kullanır; bu karakterler URL sorgu parametreleri ve yol bölümleriyle çakışır.
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 // (burada aynı, ancak + → - ve / → _ karakterleri göründüğünde geçerlidir)
java.util.Base64, Java 8 ve Java 17'de aynı mı?
Evet. java.util.Base64 API'si Java 8'de tanıtıldığından bu yana değişmedi. Sınıf, iç içe Encoder ve Decoder sınıfları ve tüm fabrika metotları (getEncoder, getUrlEncoder, getMimeEncoder) Java 8, 11, 17 ve 21'de özdeştir. JDK sürümünüzü yükseltirken herhangi bir geçiş veya kod değişikliği gerekmez.
// Bu kod Java 8'den Java 21+'a kadar aynı şekilde derlenir ve çalışır
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==Java'da bir dosyayı Base64 ile nasıl kodlarım?
Files.readAllBytes(Path) ile dosyayı bir bayt dizisine okuyun ve Base64.getEncoder().encodeToString() metoduna iletin. Tamamı belleğe yüklenmemesi gereken büyük dosyalar için Base64.getEncoder().wrap(OutputStream) kullanarak kodlanmış çıktıyı akış halinde iletin.
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);sun.misc.BASE64Encoder neden kullanımdan kaldırıldı?
sun.misc.BASE64Encoder, hiçbir zaman genel API'nin parçası olmayan dahili bir JDK sınıfıydı. Oracle'ın kullanılmaması konusunda açıkça uyardığı sun.misc paketinde yer alıyordu. Java 8, resmi, genel ve desteklenen alternatif olarak java.util.Base64'ü tanıttı. Java 9 ve modül sistemiyle birlikte, sun.misc sınıflarına erişim JDK yapılandırmasına bağlı olarak uyarı veya hata üretir.
// Eski yol — KULLANMAYIN, modern JDK'larda kaldırıldı // import sun.misc.BASE64Encoder; // String encoded = new BASE64Encoder().encode(data); // Java 8'den bu yana doğru yol import java.util.Base64; String encoded = Base64.getEncoder().encodeToString(data);
Java'da Base64 kodlama ve çözme döngüsü nasıl yapılır?
Base64.getEncoder().encodeToString(bytes) ile kodlayın ve Base64.getDecoder().decode(encodedString) ile çözün. Çözülen bayt dizisini new String(bytes, StandardCharsets.UTF_8) kullanarak tekrar String'e dönüştürün. getBytes() ve new String() için aynı charset kullandığınız sürece döngü orijinal veriyi tam olarak korur.
import java.util.Base64; import java.nio.charset.StandardCharsets; // Kodla String original = "session_token=eyJhbGciOiJSUzI1NiJ9"; byte[] originalBytes = original.getBytes(StandardCharsets.UTF_8); String encoded = Base64.getEncoder().encodeToString(originalBytes); // Çöz byte[] decodedBytes = Base64.getDecoder().decode(encoded); String decoded = new String(decodedBytes, StandardCharsets.UTF_8); System.out.println(original.equals(decoded)); // true
İlgili Araçlar
- Base64 Decoder — Base64 dizelerini özgün metin veya ikili biçime geri çözün — kodlamanın tersine işlemi.
- URL Encoder — URL'lerde güvenli kullanım için dizeleri percent-encode edin — Base64 URL güvenli kodlamadan farklı, ancak sıklıkla birlikte kullanılır.
- JWT Decoder — Başlık ve yük segmentleri Base64url kodlu JSON olan JWT token'larını inceleyin — kütüphane gerektirmeden çözün.
- JSON Formatter — Base64 kodlamadan önce veya sonra JSON yüklerini biçimlendirin — API entegrasyonlarını hata ayıklarken kullanışlıdır.
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.