Java-তে Base64 Encode — java.util.Base64 উদাহরণ
বিনামূল্যে অনলাইন Base64 এনকোড অনলাইন সরাসরি আপনার ব্রাউজারে ব্যবহার করুন — ইনস্টলের প্রয়োজন নেই।
Base64 এনকোড অনলাইন অনলাইনে ব্যবহার করুন →যখনই আমি HTTP Basic Auth হেডার সংযুক্ত করি, Kubernetes secret-এ সার্টিফিকেট এম্বেড করি, অথবা JSON API-এর মাধ্যমে বাইনারি ডেটা পাঠাই, প্রথম ধাপটি সবসময় একই: base64 encode করে কাঁচা বাইটগুলিকে ASCII-safe স্ট্রিংয়ে রূপান্তর করা। Java এটি সহজ করে দেয় java.util.Base64-এর মাধ্যমে, যা Java 8 থেকে পাওয়া যায় এবং deprecated sun.misc.BASE64Encoder-এর জায়গা নিয়েছে। কোড না লিখে দ্রুত এককালীন এনকোডিংয়ের জন্য, ToolDeck-এর Base64 Encoder ব্রাউজারেই তাৎক্ষণিকভাবে এটি করে দেয়। এই গাইডে Base64.getEncoder(), getUrlEncoder(), getMimeEncoder(), ফাইল এনকোডিং, wrap(OutputStream)-এর মাধ্যমে স্ট্রিমিং, এবং অভিজ্ঞ Java ডেভেলপারদেরও যে ভুলগুলি প্রায়ই হয় তা কভার করা হয়েছে। সমস্ত উদাহরণ Java 8 থেকে Java 21+ পর্যন্ত কম্পাইল হয়।
- ✓Base64.getEncoder().encodeToString(bytes) হলো স্ট্যান্ডার্ড এক-লাইনার — Java 8 থেকে JDK-এ বিল্ট-ইন, Java 17 ও 21 পর্যন্ত অপরিবর্তিত।
- ✓এনকোড করার আগে String.getBytes()-এ সবসময় StandardCharsets.UTF_8 পাস করুন — না করলে প্ল্যাটফর্মের ডিফল্ট ব্যবহার হয়, যা JVM ভেদে ভিন্ন হয়।
- ✓getUrlEncoder() URL-safe আউটপুট তৈরি করে (+ এর বদলে -, / এর বদলে _) এবং withoutPadding() শেষের = অক্ষর ছেঁটে দেয়।
- ✓getMimeEncoder() প্রতি ৭৬ অক্ষরে লাইন ব্রেক যোগ করে — ইমেইল (MIME) এবং PEM সার্টিফিকেট ফরম্যাটের জন্য প্রয়োজনীয়।
- ✓বড় ফাইলের জন্য, সম্পূর্ণ ফাইল মেমরিতে লোড না করে স্ট্রিম করতে Base64.getEncoder().wrap(OutputStream) ব্যবহার করুন।
Base64 এনকোডিং কী?
Base64 যেকোনো বাইনারি ডেটাকে ৬৪টি প্রিন্টযোগ্য ASCII অক্ষরের সমন্বয়ে তৈরি স্ট্রিংয়ে রূপান্তর করে: A-Z, a-z, 0-9, +, এবং /। ইনপুটের প্রতি ৩ বাইট ঠিক ৪টি Base64 অক্ষর তৈরি করে। ইনপুটের দৈর্ঘ্য ৩-এর গুণিতক না হলে, এক বা দুটি = প্যাডিং অক্ষর যুক্ত হয়। এনকোড করা আউটপুট সবসময় মূল ডেটার চেয়ে প্রায় ৩৩% বড়।
Base64 এনক্রিপশন নয়। এনকোড করা স্ট্রিং যে কেউ ডিকোড করতে পারে। এর উদ্দেশ্য হলো ট্রান্সপোর্ট সেফটি: HTTP হেডার, JSON পেলোড, XML ডকুমেন্ট এবং ইমেইল বডি টেক্সট-ভিত্তিক প্রোটোকল যা দুর্নীতি ছাড়া কাঁচা বাইনারি বাইট বহন করতে পারে না। সাধারণ Java ব্যবহারের ক্ষেত্রে রয়েছে HTTP Basic Authentication, PEM সার্টিফিকেট এম্বেড করা, ডেটাবেস টেক্সট কলামে বাইনারি ডেটা সংরক্ষণ, এবং JWT টোকেন সেগমেন্ট তৈরি।
deploy-svc:sk_live_4eC39HqLyjWDarjtT1zdp7dc
ZGVwbG95LXN2Yzpza19saXZlXzRlQzM5SHFMeWpXRGFyanRUMXpkcDdkYw==
Base64.getEncoder().encodeToString() — স্ট্যান্ডার্ড API
java.util.Base64 Java 8-এ sun.misc.BASE64Encoder-এর সরকারি বিকল্প হিসেবে চালু হয়েছিল। ক্লাসটি তিনটি স্ট্যাটিক ফ্যাক্টরি মেথড সরবরাহ করে — প্রতিটি একটি Base64.Encoder নেস্টেড ক্লাস ইনস্ট্যান্স ফেরত দেয় — RFC 4648-এ সংজ্ঞায়িত তিনটি Base64 ভ্যারিয়েন্ট কভার করে। কোনো থার্ড-পার্টি লাইব্রেরি দরকার নেই। কোনো Maven dependency নেই। শুধু import করুন এবং call করুন।
ন্যূনতম উদাহরণ — একটি String এনকোড করুন
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
}
}প্রথমবার Java ডেভেলপাররা যে মূল ধাপটি মিস করেন: এনকোড করার আগে একটি String কে byte[]-এ রূপান্তর করতে হবে। Base64 বাইটের উপর কাজ করে, অক্ষরের উপর নয়। encodeToString() একটি byte[] গ্রহণ করে এবং সরাসরি Base64 String ফেরত দেয়। যদি এনকোড করা ফলাফল বাইট হিসেবে দরকার হয়, তাহলে encode(byte[]) ব্যবহার করুন — এটি ASCII-encoded Base64 অক্ষরের একটি byte[] ফেরত দেয়, যা সরাসরি OutputStream-এ লেখা বা বাইনারি প্রোটোকল ফ্রেম তৈরির সময় উপকারী।
HTTP Basic Auth — সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্র
HTTP Basic Authentication সম্ভবত Java ডেভেলপারদের Base64 এনকোডিং ব্যবহারের সবচেয়ে সাধারণ কারণ। স্পেসিফিকেশন (RFC 7617) অনুযায়ী credentials স্ট্রিং username:password Base64-encode করে Authorization হেডারে রাখতে হয়। আমি এটি অগণিতবার ভুল হতে দেখেছি — সাধারণত কোলন সেপারেটর ভুলে যাওয়া বা উপাদানগুলি আলাদাভাবে এনকোড করার কারণে।
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 — এনকোড এবং ডিকোড
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";
// এনকোড
String encoded = Base64.getEncoder()
.encodeToString(original.getBytes(StandardCharsets.UTF_8));
System.out.println(encoded);
// WC1Db3JyZWxhdGlvbi1JRDogcmVxXzhhNGYyYzkxLWU3YjMtNGQ1Ni05MDEyLTNmN2E4YjljMGQxZQ==
// ডিকোড
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 Java 8 থেকে Java 17 এবং Java 21 পর্যন্ত অভিন্ন। JDK আপগ্রেড করার সময় কোনো মাইগ্রেশনের প্রয়োজন নেই। Java 8 থেকে যেকোনো সংস্করণে একই কোড কম্পাইল ও রান হয়।নন-স্ট্রিং ডেটা এনকোড করা — byte[], UUID, এবং Timestamps
Java-তে Base64 এনকোডিং সবসময় একটি byte[] দিয়ে শুরু হয়। স্ট্রিং getBytes(StandardCharsets.UTF_8)-এর মাধ্যমে রূপান্তরিত হয়, কিন্তু অন্যান্য টাইপের জন্য আগে একটি রূপান্তর ধাপ দরকার। UUID, timestamp এবং সংখ্যাগত আইডেন্টিফায়ার Base64-encode করার আগে স্ট্রিং বা বাইট রিপ্রেজেন্টেশনে সিরিয়ালাইজ করতে হবে।
UUID — স্ট্রিং রিপ্রেজেন্টেশন হিসেবে এনকোড
import java.util.Base64;
import java.util.UUID;
import java.nio.charset.StandardCharsets;
UUID sessionId = UUID.fromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8");
String encoded = Base64.getEncoder()
.encodeToString(sessionId.toString().getBytes(StandardCharsets.UTF_8));
System.out.println(encoded);
// NmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4কমপ্যাক্ট UUID — কাঁচা ১৬ বাইট এনকোড
যদি ছোট এনকোড ফলাফল চান, তাহলে UUID-এর ৩৬-অক্ষরের স্ট্রিং ফর্মে রূপান্তর না করে UUID-এর ১২৮ বিটকে ১৬টি কাঁচা বাইট হিসেবে বের করুন। Base64 আউটপুট ৪৮ অক্ষর থেকে ২৪-এ নেমে আসবে।
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
// স্ট্রিং-ভিত্তিক পদ্ধতির ৪৮ অক্ষরের তুলনায় ২২ অক্ষরTimestamp এবং মিশ্র পেলোড
import java.time.Instant;
import java.util.Base64;
import java.nio.charset.StandardCharsets;
// JWT-স্টাইল পেলোড সিমুলেশন
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-safe, প্যাডিং ছাড়া)byte[]-এ toString() কল করে তার কন্টেন্ট পাওয়ার আশা করবেন না — এটি অ্যারের identity hash যেমন [B@6d06d69c দেবে। new String(bytes, StandardCharsets.UTF_8) ব্যবহার করুন অথবা বাইট অ্যারেটি সরাসরি encodeToString()-এ পাস করুন।Base64.Encoder মেথড রেফারেন্স
java.util.Base64 ক্লাস তিনটি ফ্যাক্টরি মেথড expose করে, প্রতিটি একটি নির্দিষ্ট ভ্যারিয়েন্টের জন্য কনফিগার করা Base64.Encoder ফেরত দেয়। এনকোডার ইনস্ট্যান্সগুলি thread-safe এবং stateless — একবার তৈরি করুন এবং বারবার ব্যবহার করুন।
Base64.getUrlEncoder() — URL-Safe এনকোডিং
URL-safe এনকোডার একটি বিকল্প অ্যালফাবেট ব্যবহার করে যেখানে + হয় - এবং / হয় _, RFC 4648 Section 5-এ সংজ্ঞায়িত। Base64 স্ট্রিং যখন URL কোয়েরি প্যারামিটার, ফাইলনাম, বা কুকি ভ্যালুতে থাকে তখন এটি গুরুত্বপূর্ণ — স্ট্যান্ডার্ড Base64 অক্ষর URL ডিলিমিটার এবং ফাইলসিস্টেম রিজার্ভড অক্ষরের সাথে সংঘর্ষ করে।
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); // স্ট্যান্ডার্ড এনকোডার — + এবং / থাকে যা URL ভাঙে String standard = Base64.getEncoder().encodeToString(data); System.out.println(standard); // aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s/c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw== // URL-safe এনকোডার — কোয়েরি প্যারামিটার এবং ফাইলনামে নিরাপদ String urlSafe = Base64.getUrlEncoder().encodeToString(data); System.out.println(urlSafe); // aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s_c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw== // প্যাডিং ছাড়া URL-safe — JWT এবং কমপ্যাক্ট টোকেনের জন্য String noPadding = Base64.getUrlEncoder().withoutPadding().encodeToString(data); System.out.println(noPadding); // aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s_c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw
withoutPadding() ভ্যারিয়েন্ট শেষের = অক্ষর ছেঁটে দেয়। JWT স্পেসিফিকেশন হেডার এবং পেলোড সেগমেন্টের জন্য প্যাডিং ছাড়া URL-safe Base64 প্রয়োজন করে, তাই JWT টোকেন ম্যানুয়ালি তৈরি বা ম্যানিপুলেট করার সময় getUrlEncoder().withoutPadding() হলো সঠিক call।
withoutPadding() মেথড একটি নতুন এনকোডার ইনস্ট্যান্স ফেরত দেয় — মূল এনকোডার পরিবর্তন করে না। উভয়কেই static final ফিল্ডে assign করে থ্রেড জুড়ে নিরাপদে পুনর্ব্যবহার করা যায়।ফাইল এবং API রেসপন্স থেকে এনকোড
Java-তে Base64 এনকোডিংয়ের দুটি সবচেয়ে সাধারণ বাস্তব পরিস্থিতি: ডিস্ক থেকে বাইনারি ফাইল পড়া (সার্টিফিকেট, ছবি, কনফিগারেশন বান্ডেল) এবং HTTP রেসপন্স থেকে পাওয়া ডেটা এনকোড করা।
একটি ফাইল 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("মূল: %d বাইট%n", fileBytes.length);
System.out.printf("এনকোড করা: %d অক্ষর%n", encoded.length());
// এনকোড করা কন্টেন্ট টেক্সট ফাইলে লিখুন
Files.writeString(
Path.of("certs/server.pem.b64"),
encoded
);
} catch (java.io.IOException e) {
System.err.println("ফাইল পড়তে ব্যর্থ: " + e.getMessage());
}
}
}একটি API রেসপন্স বডি এনকোড করুন
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 বাইট এনকোড → %d অক্ষর%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("রিকোয়েস্ট ব্যর্থ: " + e.getMessage());
}
}
}CLI সেকশনের আগে একটি দ্রুত নোট: যদি আপনি শুধু একটি ফাইল বা API রেসপন্স পেস্ট করে কোড না লিখেই Base64 আউটপুট পেতে চান, তাহলে অনলাইন Base64 Encoder টেক্সট এবং বাইনারি উভয় ইনপুট সামলায়।
কমান্ড-লাইন Base64 এনকোডিং
কখনো কখনো টার্মিনাল থেকে একটি স্ট্রিং বা ফাইল এনকোড করতে হয় — কোনো Java প্রজেক্ট, IDE, বা বিল্ড স্টেপ ছাড়াই। বেশিরভাগ Unix সিস্টেমে একটি base64 কমান্ড থাকে, এবং JDK ইনস্টল করা থাকলে Java-native পদ্ধতির জন্য jshell ব্যবহার করতে পারেন।
# macOS / Linux — একটি স্ট্রিং এনকোড করুন
echo -n "deploy-bot:sk_prod_9f2a7c4e" | base64
# ZGVwbG95LWJvdDpza19wcm9kXzlmMmE3YzRl
# একটি ফাইল এনকোড করুন
base64 < certs/server.pem > certs/server.pem.b64
# jshell ব্যবহার করে (JDK 9+)
echo 'System.out.println(java.util.Base64.getEncoder().encodeToString("deploy-bot:sk_prod_9f2a7c4e".getBytes()))' | jshell -
# java দিয়ে সরাসরি one-liner
java -e 'System.out.println(java.util.Base64.getEncoder().encodeToString(args[0].getBytes()))' "my-secret"
# নোট: java -e JDK 23+ প্রয়োজন করে (JEP 477)jshell পদ্ধতি বিশেষভাবে উপকারী যখন আপনি নিশ্চিত করতে চান যে আপনার Java কোড Unix টুলের মতো একই আউটপুট তৈরি করছে কিনা, অথবা যখন আপনার সার্ভিস কী পাঠাচ্ছে এবং রিসিভার কী আশা করছে তার মধ্যে মিসম্যাচ ডিবাগ করছেন। আমার কাছে এর জন্য একটি shell alias আছে।
base64 কমান্ড ডিকোডিংয়ের জন্য -D ব্যবহার করে। Linux-এ (GNU coreutils) এটি -d ব্যবহার করে। এনকোডিং আচরণ উভয়তেই অভিন্ন। Linux-এ -w 0 ফ্ল্যাগ আউটপুটে লাইন র্যাপিং অক্ষম করে, যা সাধারণত অন্য কমান্ডে পাইপ করার সময় দরকার হয়।Apache Commons Codec — উচ্চ-পারফরম্যান্স বিকল্প
বেশিরভাগ অ্যাপ্লিকেশনের জন্য, java.util.Base64 যথেষ্ট দ্রুত। কিন্তু যদি টাইট লুপে কোটি কোটি এনকোডিং অপারেশন প্রক্রিয়া করতে হয় — যেমন লগ ইনজেশন পাইপলাইন বা হাই-থ্রুপুট মেসেজ ব্রোকার — Apache Commons Codec বেঞ্চমার্ক করার যোগ্য। এটি Java 8-এর অনেক আগে থেকে আছে এবং কিছুটা ভিন্ন 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);
// স্ট্যান্ডার্ড এনকোডিং
String encoded = Base64.encodeBase64String(telemetryPayload);
// URL-safe এনকোডিং
String urlSafe = Base64.encodeBase64URLSafeString(telemetryPayload);
// একটি স্ট্রিং বৈধ Base64 কিনা যাচাই করুন
boolean valid = Base64.isBase64(encoded);
System.out.println(valid); // trueApache Commons Codec স্ট্রিমিং পরিস্থিতির জন্য Base64OutputStream এবং Base64InputStream-ও সরবরাহ করে, এবং JDK এনকোডারে না থাকা একটি validation মেথড অন্তর্ভুক্ত করে। Commons Codec যদি ইতিমধ্যে আপনার dependency tree-তে থাকে (অনেক Apache প্রজেক্টে আসে), তাহলে সেটিই ব্যবহার করুন।
Guava BaseEncoding
Google-এর Guava লাইব্রেরিতে BaseEncoding অন্তর্ভুক্ত, যা কনফিগারযোগ্য লাইন সেপারেটর, প্যাডিং নিয়ন্ত্রণ, এবং স্ট্যান্ডার্ড ও URL-safe উভয় অ্যালফাবেটের জন্য একটি fluent API সরবরাহ করে। API পরিষ্কারভাবে পড়া যায়, কিন্তু শুধু Base64 এনকোডিংয়ের জন্য Guava (প্রায় ৩ MB) যোগ করা অতিরিক্ত। Guava যদি ইতিমধ্যে আপনার প্রজেক্টে collections বা caching utilities-এর জন্য থাকে, তাহলে encoding API একটি চমৎকার বোনাস।
// 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);
// স্ট্যান্ডার্ড Base64
String standard = BaseEncoding.base64().encode(webhookPayload);
// URL-safe
String urlSafe = BaseEncoding.base64Url().encode(webhookPayload);
// প্যাডিং ছাড়া
String noPad = BaseEncoding.base64Url().omitPadding().encode(webhookPayload);
// লাইন সেপারেটর সহ (PEM-স্টাইল)
String wrapped = BaseEncoding.base64()
.withSeparator("\n", 64)
.encode(webhookPayload);Base64.getMimeEncoder() — MIME এবং PEM লাইন-র্যাপড আউটপুট
MIME এনকোডার প্রতি ৭৬ অক্ষরে \r\n লাইন ব্রেক যোগ করে, MIME স্পেসিফিকেশন (RFC 2045) অনুযায়ী। PEM সার্টিফিকেট, S/MIME ইমেইল অ্যাটাচমেন্ট, এবং কিছু লেগ্যাসি API এই ফরম্যাট আশা করে। স্ট্যান্ডার্ড এবং URL-safe এনকোডার একটি একক অবিচ্ছিন্ন লাইন তৈরি করে — যদি সেগুলির আউটপুট লাইন-র্যাপড Base64 প্রত্যাশী কোনো সিস্টেমে পাঠানো হয়, তাহলে এটি নীরবে ব্যর্থ হতে বা ডেটা প্রত্যাখ্যান করতে পারে।
import java.util.Base64;
import java.nio.charset.StandardCharsets;
// একটি PEM সার্টিফিকেট বডি সিমুলেশন
byte[] certData = new byte[256]; // ব্যবহারিক ক্ষেত্রে, একটি .der ফাইল থেকে পড়ুন
new java.security.SecureRandom().nextBytes(certData);
// ডিফল্ট MIME এনকোডার — প্রতি লাইনে ৭৬ অক্ষর, \r\n সেপারেটর
String mimeEncoded = Base64.getMimeEncoder().encodeToString(certData);
System.out.println(mimeEncoded);
// QYx2K3p8Xg7JmN1R+wFkLd... (৭৬ অক্ষর)
// Ht5Bv9CzAq0PnSjYl8WxUe... (৭৬ অক্ষর)
// ...
// কাস্টম MIME এনকোডার — প্রতি লাইনে ৬৪ অক্ষর (PEM স্ট্যান্ডার্ড), \n সেপারেটর
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() ব্যবহার করবেন না। লাইন ব্রেকগুলি সেই প্রসঙ্গে ডেটা নষ্ট করে দেবে। পরিবর্তে getEncoder() বা getUrlEncoder() ব্যবহার করুন।Base64.getEncoder().wrap() দিয়ে বড় ফাইল স্ট্রিমিং
Files.readAllBytes() দিয়ে একটি সম্পূর্ণ ফাইল byte[]-এ লোড করা ছোট ফাইলের জন্য কাজ করে, কিন্তু ৫০-১০০ MB-এর বেশি কিছুর জন্য OutOfMemoryError-এর ঝুঁকি আছে। JDK Base64.getEncoder().wrap(OutputStream)সরবরাহ করে, যা একটি OutputStream ফেরত দেয় যা লেখার সময় ডেটা on-the-fly এনকোড করে। এনকোড করা বাইটগুলি সম্পূর্ণ ইনপুট বাফার না করে আন্ডারলাইং স্ট্রিমে প্রবাহিত হয়।
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("Base64 এনকোডারের মাধ্যমে %d বাইট স্ট্রিম হয়েছে%n", totalBytes);
}
// base64Out বন্ধ করলে স্বয়ংক্রিয়ভাবে চূড়ান্ত প্যাডিং বাইট flush হয়
}
}try-with-resources ব্লক flushing এবং closing সামলায়। একটি বিশদ যা মানুষকে ধরে ফেলে: চূড়ান্ত Base64 প্যাডিং কেবল তখনই লেখা হয় যখন র্যাপিং OutputStream বন্ধ হয়। যদি এটি বন্ধ করতে ভুলে যান (বা শুধু বাইরের স্ট্রিম বন্ধ করেন), তাহলে আপনার এনকোড করা আউটপুটের শেষ কয়েকটি অক্ষর মিস হতে পারে।
নেটওয়ার্ক সকেটে স্ট্রিমিং
wrap() মেথড যেকোনো OutputStream-এর সাথে কাজ করে — ফাইল আউটপুট, সকেট আউটপুট, HTTP রেসপন্স বডি, এমনকি ByteArrayOutputStream। নিচে একটি in-memory বাফারে সরাসরি Base64-encoded ডেটা লেখার উদাহরণ দেওয়া হলো, যা ইউনিট টেস্টিং বা 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)) {
// চাংকে ডেটা লিখুন — স্ট্রিম থেকে পড়ার সিমুলেশন
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=
// 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 ব্যবহার করা ডিফল্ট বাফার সাইজের সাথে মেলে এবং মেমরি ব্যবহার ও সিস্টেম কল ওভারহেডের মধ্যে একটি ভালো ব্যালেন্স। ছোট বাফার read/write call-এর সংখ্যা বাড়ায়; বড় বাফার অর্থবহ থ্রুপুট উন্নতি ছাড়াই মেমরি অপচয় করে।Thread-Safe এনকোডার ইনস্ট্যান্স — সংরক্ষণ এবং পুনর্ব্যবহার
ফ্যাক্টরি মেথড থেকে পাওয়া Base64.Encoder immutable এবং thread-safe। প্রতিটি এনকোডিং অপারেশনে Base64.getEncoder() কল করলে প্রতিবার একটি নতুন অবজেক্ট তৈরি হয়। JVM সম্ভবত এটি অপটিমাইজ করবে, কিন্তু একটি static final ফিল্ডে এনকোডার সংরক্ষণ করলে উদ্দেশ্য স্পষ্ট হয় এবং হট পাথে অপ্রয়োজনীয় allocation এড়ানো যায়।
import java.util.Base64;
import java.nio.charset.StandardCharsets;
public class TokenService {
// একবার তৈরি করুন, সর্বত্র পুনর্ব্যবহার করুন — 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);
}
}এই প্যাটার্ন Spring Boot সার্ভিসে বিশেষভাবে উপকারী যেখানে একটি utility ক্লাস একাধিক controller বা service মেথড জুড়ে এনকোডিং পরিচালনা করে। withoutPadding() কল একটি নতুন এনকোডার ইনস্ট্যান্স ফেরত দেয়, তাই আপনি padded এবং unpadded উভয় ভ্যারিয়েন্ট আলাদা ফিল্ড হিসেবে সংরক্ষণ করতে পারেন। encodeToString() বা encode()-এর প্রতিটি কল stateless — কোনো synchronization দরকার নেই, কোনো shared mutable state নেই।
সাধারণ ভুল
সমস্যা: charset argument ছাড়া String.getBytes() প্ল্যাটফর্মের ডিফল্ট এনকোডিং ব্যবহার করে, যা Windows-এ windows-1252, বেশিরভাগ Linux সিস্টেমে UTF-8, এবং macOS-এ ভিন্ন। একই কোড ভিন্ন মেশিনে ভিন্ন Base64 আউটপুট তৈরি করে।
সমাধান: সবসময় StandardCharsets.UTF_8 স্পষ্টভাবে পাস করুন।
String text = "প্রিয়া ঘোষ: prod-east"; byte[] bytes = text.getBytes(); // প্ল্যাটফর্ম ডিফল্ট — অপ্রত্যাশিত String encoded = Base64.getEncoder().encodeToString(bytes);
String text = "প্রিয়া ঘোষ: prod-east"; byte[] bytes = text.getBytes(StandardCharsets.UTF_8); String encoded = Base64.getEncoder().encodeToString(bytes);
সমস্যা: Base64.getEncoder() আউটপুটে + এবং / অক্ষর থাকে। URL কোয়েরি স্ট্রিংয়ে রাখলে, + একটি স্পেস হিসেবে এবং / পাথ সেপারেটর হিসেবে ব্যাখ্যা করা হয়, রিসিভিং এন্ডে নীরবে ভ্যালু নষ্ট করে।
সমাধান: URL-এ থাকবে এমন যেকোনো ভ্যালুর জন্য Base64.getUrlEncoder() ব্যবহার করুন।
// URL কোয়েরি প্যারামিটারে টোকেন — ভেঙে যাবে
String token = Base64.getEncoder()
.encodeToString(sessionData);
String url = "https://auth.internal/verify?token=" + token;// URL-safe এনকোডিং — + বা / অক্ষর নেই
String token = Base64.getUrlEncoder()
.withoutPadding()
.encodeToString(sessionData);
String url = "https://auth.internal/verify?token=" + token;সমস্যা: getUrlEncoder() দিয়ে এনকোড করে getDecoder() দিয়ে ডিকোড করলে (বা উল্টো) IllegalArgumentException ঘটে কারণ - এবং _ স্ট্যান্ডার্ড Base64 অ্যালফাবেটে বৈধ নয়, এবং + ও / URL-safe অ্যালফাবেটে বৈধ নয়।
সমাধান: সবসময় মিলানো decoder দিয়ে ডিকোড করুন: URL-safe-এর জন্য getUrlDecoder(), স্ট্যান্ডার্ডের জন্য getDecoder()।
String encoded = Base64.getUrlEncoder()
.encodeToString(data);
// পরে...
byte[] decoded = Base64.getDecoder() // ভুল decoder
.decode(encoded);
// encoded-এ - বা _ থাকলে IllegalArgumentExceptionString encoded = Base64.getUrlEncoder()
.encodeToString(data);
// পরে...
byte[] decoded = Base64.getUrlDecoder() // মিলানো decoder
.decode(encoded);সমস্যা: স্ট্রিমিং এনকোডার একটি সম্পূর্ণ ৩-বাইট গ্রুপের জন্য অপেক্ষা করতে সর্বোচ্চ ২টি ইনপুট বাইট বাফার করে। র্যাপিং OutputStream বন্ধ না করলে, চূড়ান্ত ১-৪টি Base64 অক্ষর (প্যাডিং সহ) কখনো লেখা হয় না।
সমাধান: try-with-resources ব্যবহার করুন, অথবা আউটপুট পড়ার আগে wrapped স্ট্রিমে close() স্পষ্টভাবে কল করুন।
ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStream b64os = Base64.getEncoder().wrap(baos); b64os.write(data); // baos.toString() অসম্পূর্ণ — চূড়ান্ত বাইট মিস
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (OutputStream b64os = Base64.getEncoder().wrap(baos)) {
b64os.write(data);
} // close() চূড়ান্ত প্যাডিং flush করে
String encoded = baos.toString(); // সম্পূর্ণBase64 এনকোডিং মেথড — তুলনা
বেশিরভাগ প্রজেক্টের জন্য: java.util.Base64 হলো সঠিক পছন্দ। কোনো dependency নেই, JDK-এ বিল্ট-ইন, thread-safe, এবং RFC 4648-এর সবকটি ভ্যারিয়েন্ট কভার করে। Apache Commons Codec-এর কাছে পৌঁছান কেবল যদি এটি ইতিমধ্যে আপনার classpath-এ থাকে এবং isBase64() validation মেথড বা streaming Base64OutputStream দরকার হয়। Guava-এর BaseEncoding একটি যুক্তিসঙ্গত বিকল্প যদি আপনার প্রজেক্ট ইতিমধ্যে Guava-এর উপর নির্ভর করে, কিন্তু শুধু Base64-এর জন্য ৩ MB dependency যোগ করার কোনো মানে হয় না।
তিনটি পরিস্থিতি, তিনটি পছন্দ: Basic Auth বা JWT এনকোডিং দরকার এমন স্ট্যান্ডার্ড ওয়েব সার্ভিস? JDK-এ থাকুন। Spring বা Apache HTTP Client-এর মাধ্যমে ইতিমধ্যে Commons Codec টানা লেগ্যাসি প্রজেক্ট? এটি ব্যবহার করুন — classpath-এ দুটি Base64 লাইব্রেরি রাখার কোনো কারণ নেই। Guava ব্যবহার করা প্রজেক্ট caching ও collections-এর জন্য? এর পরিষ্কার fluent API-এর জন্য BaseEncoding ব্যবহার করুন। শুধু Base64-এর জন্য আলাদা লাইব্রেরি যোগ করার কোনো মানে নেই — ২০১৪ সাল থেকে JDK-ই যথেষ্ট।
আপনার Java কোড না চালিয়ে দ্রুত একটি এনকোড ফলাফল যাচাই করতে চাইলে, এটি Base64 Encoder-এ পেস্ট করুন, এবং নিশ্চিত করুন আউটপুট আপনার কোডের সাথে মেলে কিনা।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Java-তে একটি String কে base64 encode করব কীভাবে?
প্রথমে getBytes(StandardCharsets.UTF_8) ব্যবহার করে স্ট্রিংটিকে বাইটে রূপান্তর করুন, তারপর বাইট অ্যারেটি Base64.getEncoder().encodeToString()-এ পাস করুন। সবসময় UTF-8 স্পষ্টভাবে উল্লেখ করুন — charset ছাড়া getBytes() কল করলে প্ল্যাটফর্মের ডিফল্ট ব্যবহার হয়, যা অপারেটিং সিস্টেম এবং JVM কনফিগারেশন অনুযায়ী ভিন্ন হতে পারে।
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() এবং Base64.getUrlEncoder()-এর পার্থক্য কী?
উভয়ই Base64-এ এনকোড করে, কিন্তু getUrlEncoder() RFC 4648 Section 5-এ সংজ্ঞায়িত URL-safe অ্যালফাবেট ব্যবহার করে। এটি + কে - দিয়ে এবং / কে _ দিয়ে প্রতিস্থাপন করে, যাতে আউটপুট percent-encoding ছাড়াই URL এবং ফাইলনামে ব্যবহার করা যায়। স্ট্যান্ডার্ড এনকোডার + এবং / ব্যবহার করে, যা URL কোয়েরি প্যারামিটার এবং পাথ সেগমেন্টের সাথে সংঘর্ষ করে।
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 // (একই এখানে, কিন্তু যখন ঐ অক্ষর আসে: + → - এবং / → _)
Java 8 এবং Java 17-তে java.util.Base64 কি একই?
হ্যাঁ। java.util.Base64 API Java 8-এ চালু হওয়ার পর থেকে পরিবর্তিত হয়নি। ক্লাস, এর নেস্টেড Encoder ও Decoder ক্লাস, এবং সমস্ত ফ্যাক্টরি মেথড (getEncoder, getUrlEncoder, getMimeEncoder) Java 8, 11, 17 এবং 21 জুড়ে অভিন্ন। JDK ভার্সন আপগ্রেড করার সময় কোনো মাইগ্রেশন বা কোড পরিবর্তনের প্রয়োজন নেই।
// এই কোড Java 8 থেকে 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==Java-তে একটি ফাইল Base64 এনকোড করব কীভাবে?
Files.readAllBytes(Path) দিয়ে ফাইলটি বাইট অ্যারেতে পড়ুন এবং Base64.getEncoder().encodeToString()-এ পাস করুন। বড় ফাইল যা সম্পূর্ণরূপে মেমরিতে লোড করা উচিত নয়, তার জন্য এনকোড করা আউটপুট স্ট্রিম করতে Base64.getEncoder().wrap(OutputStream) ব্যবহার করুন।
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 কেন deprecated হয়েছে?
sun.misc.BASE64Encoder ছিল একটি JDK-এর আভ্যন্তরীণ ক্লাস যা কখনো public API-এর অংশ ছিল না। এটি sun.misc প্যাকেজে ছিল, যা Oracle স্পষ্টভাবে ব্যবহার না করার পরামর্শ দিয়েছিল। Java 8 সরকারি, public, সমর্থিত বিকল্প হিসেবে java.util.Base64 চালু করে। Java 9 এবং মডিউল সিস্টেমের পর থেকে, sun.misc ক্লাস অ্যাক্সেস করলে JDK কনফিগারেশনের উপর নির্ভর করে সতর্কতা বা ত্রুটি আসে।
// পুরানো পদ্ধতি — ব্যবহার করবেন না, আধুনিক JDK-এ সরানো হয়েছে // import sun.misc.BASE64Encoder; // String encoded = new BASE64Encoder().encode(data); // Java 8 থেকে সঠিক পদ্ধতি import java.util.Base64; String encoded = Base64.getEncoder().encodeToString(data);
Java-তে Base64 encode এবং decode round-trip কীভাবে করব?
Base64.getEncoder().encodeToString(bytes) দিয়ে এনকোড করুন এবং Base64.getDecoder().decode(encodedString) দিয়ে ডিকোড করুন। ডিকোড করা বাইট অ্যারেকে new String(bytes, StandardCharsets.UTF_8) ব্যবহার করে আবার String-এ রূপান্তর করুন। round-trip মূল ডেটা হুবহু সংরক্ষণ করে — যতক্ষণ আপনি getBytes() এবং new String() উভয় ক্ষেত্রে একই charset ব্যবহার করেন।
import java.util.Base64; import java.nio.charset.StandardCharsets; // এনকোড String original = "session_token=eyJhbGciOiJSUzI1NiJ9"; byte[] originalBytes = original.getBytes(StandardCharsets.UTF_8); String encoded = Base64.getEncoder().encodeToString(originalBytes); // ডিকোড byte[] decodedBytes = Base64.getDecoder().decode(encoded); String decoded = new String(decodedBytes, StandardCharsets.UTF_8); System.out.println(original.equals(decoded)); // true
সংশ্লিষ্ট টুল
- Base64 Decoder — Base64 স্ট্রিংকে মূল টেক্সট বা বাইনারি ফর্মে ডিকোড করুন — এনকোডিংয়ের বিপরীত অপারেশন।
- URL Encoder — URL-এ নিরাপদ ব্যবহারের জন্য স্ট্রিং percent-encode করুন — Base64 URL-safe এনকোডিং থেকে আলাদা, তবে প্রায়ই একসাথে ব্যবহৃত হয়।
- JWT Decoder — JWT টোকেন পরীক্ষা করুন যার হেডার ও পেলোড সেগমেন্ট Base64url-encoded JSON — লাইব্রেরি ছাড়াই ডিকোড করুন।
- JSON Formatter — Base64 এনকোডিংয়ের আগে বা পরে JSON পেলোড pretty-print করুন — API ইন্টিগ্রেশন ডিবাগ করার সময় উপকারী।
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.