Base64 în Java

Transformă octeți în text sigur (litere, cifre, +, /) și înapoi; getEncoder codează, getDecoder decodează.

Sintaxă
import java.util.Base64;

static Base64.Encoder getEncoder()
static Base64.Decoder getDecoder()
static Base64.Encoder getUrlEncoder()
String encodeToString(byte[] octeti)
byte[] decode(String text)

Ce face Base64

Base64 scrie orice octeți (o imagine, un text cu diacritice, o cheie) folosind doar 64 de caractere sigure: A-Z, a-z, 0-9, + și /, plus = la final pentru completare. Așa datele binare pot fi puse în JSON, e-mail sau URL-uri. Rezultatul este cu aproximativ o treime mai lung.

Base64.getEncoder().encodeToString(octeti) codează, iar Base64.getDecoder().decode(text) decodează. getUrlEncoder() folosește - și _ în loc de + și /, ca rezultatul să poată sta într-o adresă web; withoutPadding() elimină semnele =.

Base64 nu este criptare: oricine poate decoda textul. Nu-l folosi ca să ascunzi parole.

Ce returnează

getEncoder/getDecoder: obiecte Base64.Encoder/Base64.Decoder. encodeToString: un String. decode: un byte[].

Exemple

Exemplul 1: Codare și decodare

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

public class Main {
    public static void main(String[] args) {
        String mesaj = "Bună ziua din Iași!";
        String codat = Base64.getEncoder().encodeToString(mesaj.getBytes(StandardCharsets.UTF_8));
        System.out.println("Codat: " + codat);

        byte[] octeti = Base64.getDecoder().decode(codat);
        System.out.println("Decodat: " + new String(octeti, StandardCharsets.UTF_8));
    }
}

Rezultat

Codat: QnVuxIMgeml1YSBkaW4gSWHImWkh
Decodat: Bună ziua din Iași!

Exemplul 2: Varianta pentru URL-uri și completarea cu =

Aceiași octeți dau + și / cu encoder-ul obișnuit, dar - și _ cu cel pentru URL. Un text decodat greșit aruncă IllegalArgumentException.

import java.util.Base64;

public class Main {
    public static void main(String[] args) {
        byte[] date = {(byte) 0xFB, (byte) 0xFF, (byte) 0xBF, 65};
        System.out.println("Standard: " + Base64.getEncoder().encodeToString(date));
        System.out.println("URL:      " + Base64.getUrlEncoder().encodeToString(date));
        System.out.println("Fără =:   " + Base64.getUrlEncoder().withoutPadding().encodeToString(date));

        try {
            Base64.getDecoder().decode("nu e base64!");
        } catch (IllegalArgumentException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
    }
}

Rezultat

Standard: +/+/QQ==
URL:      -_-_QQ==
Fără =:   -_-_QQ
Eroare: Illegal base64 character 20

Greșeli frecvente

  • Crezi că Base64 protejează datele. Este doar o altă scriere, reversibilă de oricine.
  • Decodezi cu getDecoder() un text făcut cu getUrlEncoder() care conține - sau _: primești IllegalArgumentException. Folosește perechea potrivită (getUrlDecoder()).
  • Transformi rezultatul lui decode în text fără codare: folosește new String(octeti, StandardCharsets.UTF_8).

Comenzi înrudite

  • HexFormat: Transformă octeți în text hexazecimal (00–ff) și înapoi; of creează formatatorul, formatHex face conversia.
  • StandardCharsets: Constante pentru codările de text garantate în orice Java; UTF_8 este codarea potrivită pentru diacriticele românești.
  • InputStream: Clasa de bază pentru citirea de octeți (fișiere, rețea, System.in); readAllBytes citește tot conținutul într-un byte[].