Java'da Base64 Kodlama — java.util.Base64 Örnekleri

·Java Security & API Engineer·İnceleyenPavel Novak·Yayınlandı

Ü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.

Before · text
After · text
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

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
    }
}

Ç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.

Java — HTTP Basic Auth başlığı
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

Java 8+ — kodlama ve çözme döngüsü
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
    }
}
Not: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

Java — UUID'yi Base64 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);
// NmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4

Kompakt 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.

Java — kompakt UUID kodlama
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 karakter

Zaman Damgası ve Karışık Yük

Java — zaman damgalı JSON benzeri yük kodlama
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)
Uyarı:Bir 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.

Metot
Tür
Açıklama
getEncoder()
Base64.Encoder
Standart alfabe kullanan temel RFC 4648 kodlayıcısını döndürür (A-Z, a-z, 0-9, +, /)
getUrlEncoder()
Base64.Encoder
URL güvenli alfabe kullanan kodlayıcıyı döndürür (+ yerine -, / yerine _)
getMimeEncoder()
Base64.Encoder
Her 76 karakterde \r\n satır sonu ekleyen MIME kodlayıcısını döndürür
getMimeEncoder(lineLength, lineSeparator)
Base64.Encoder
Özel satır uzunluğu ve ayırıcı baytlarla MIME kodlayıcısı
encoder.withoutPadding()
Base64.Encoder
Sondaki = dolgu karakterlerini atlayan bir kodlayıcı döndürür
encoder.encode(byte[])
byte[]
Bayt dizisini kodlar, kodlanmış bayt dizisini döndürür
encoder.encodeToString(byte[])
String
Bayt dizisini kodlar, doğrudan kodlanmış String döndürür
encoder.wrap(OutputStream)
OutputStream
Akış tabanlı Base64 kodlaması için bir OutputStream sarar

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.

Java — URL güvenli Base64 kodlama
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.

Not: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

Java — dosya 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

Java 11+ — HTTP yanıtını 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.

Bash — komut satırından Base64 kodlama
# 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.

Not:macOS'ta 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.

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);

// 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);  // true

Apache 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.

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);

// 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.

Java — MIME Base64 kodlama
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-----");
Uyarı:JWT token'ları, HTTP başlıkları veya URL parametreleri için 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.

Java — akış tabanlı Base64 kodlama
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:

Java — ByteArrayOutputStream'e akış
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-segment
Not:Akış örneğindeki tampon boyutu (8192 bayt) rastgele değildir. BufferedInputStream'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.

Java — yeniden kullanılabilir kodlayıcı örnekleri
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

getBytes() metodunu charset belirtmeden çağırma

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.

Before · Java
After · Java
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);
URL parametreleri için standart kodlayıcı kullanma

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.

Before · Java
After · Java
// 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;
Yanlış kodlayıcı varyantıyla çözme

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().

Before · Java
After · Java
String encoded = Base64.getUrlEncoder()
    .encodeToString(data);
// Daha sonra...
byte[] decoded = Base64.getDecoder()  // YANLIŞ çözücü
    .decode(encoded);
// Kodlanmış - veya _ içeriyorsa IllegalArgumentException
String encoded = Base64.getUrlEncoder()
    .encodeToString(data);
// Daha sonra...
byte[] decoded = Base64.getUrlDecoder()  // eşleşen çözücü
    .decode(encoded);
wrap() OutputStream'ini kapatmama

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.

Before · Java
After · Java
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();  // tam

Base64 Kodlama Metotları — Karşılaştırma

Metot
URL Güvenli
Akış
Satır Sonları
Özel Türler
Kurulum Gerekir
Base64.getEncoder()
✓ (wrap)
Hayır (JDK 8+)
Base64.getUrlEncoder()
✓ (wrap)
Hayır (JDK 8+)
Base64.getMimeEncoder()
✓ (wrap)
✓ (76 karakter)
Hayır (JDK 8+)
Apache Commons Codec
Maven bağımlılığı
Guava BaseEncoding
✓ (yapılandırılabilir)
Maven bağımlılığı
jcmd / CLI base64
✓ (pipe)
N/A
Sistem kurulumu

Ç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.

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

Base64.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.

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
// (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.

Java
// 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.

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);

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.

Java
// 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.

Java
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 DecoderBase64 dizelerini özgün metin veya ikili biçime geri çözün — kodlamanın tersine işlemi.
  • URL EncoderURL'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 DecoderBaşlık ve yük segmentleri Base64url kodlu JSON olan JWT token'larını inceleyin — kütüphane gerektirmeden çözün.
  • JSON FormatterBase64 kodlamadan önce veya sonra JSON yüklerini biçimlendirin — API entegrasyonlarını hata ayıklarken kullanışlıdır.
Şu dillerde de mevcut: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 NovakTeknik İnceleyici

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.