Decodificar datos Base64 en Java
Tengo una imagen codificada en Base64. ¿Cuál es la mejor manera de decodificar eso en Java? Con suerte, usar solo las bibliotecas incluidas con Sun Java 6.
A partir de Java 8 , existe una API oficialmente compatible para la codificación y decodificación Base64. Con el tiempo, esta probablemente se convertirá en la opción predeterminada.
La API incluye la clase java.util.Base64
y sus clases anidadas. Admite tres versiones diferentes: básico, seguro para URL y MIME.
Código de muestra usando la codificación "básica":
import java.util.Base64;
byte[] bytes = "Hello, World!".getBytes("UTF-8");
String encoded = Base64.getEncoder().encodeToString(bytes);
byte[] decoded = Base64.getDecoder().decode(encoded);
String decodedStr = new String(decoded, StandardCharsets.UTF_8);
La documentaciónjava.util.Base64
incluye varios métodos más para configurar codificadores y decodificadores, y para usar diferentes clases como entradas y salidas (matrices de bytes, cadenas, ByteBuffers, secuencias java.io).
A partir de la versión 6, Java SE se entrega con JAXB. javax.xml.bind.DatatypeConverter
tiene métodos estáticos que facilitan esto. Ver parseBase64Binary()
y printBase64Binary()
.
ACTUALIZACIÓN : JAXB ya no se incluye con Java (desde Java 11). Si se requiere JAXB para su proyecto, deberá configurar las bibliotecas relevantes a través de su sistema de gestión de dependencias, por ejemplo Maven. Si necesita el compilador ( xjc.exe
), también deberá descargarlo por separado.
No es necesario utilizar commons: Sun incluye un codificador base64 con Java. Puedes importarlo como tal:
import sun.misc.BASE64Decoder;
Y luego úsalo así:
BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(encodedBytes);
¿ Dónde encodedBytes
está a java.lang.String
o a java.io.InputStream
? Sólo tenga en cuenta que las sun.*
clases no cuentan con el "apoyo oficial" de Sun.
EDITAR: ¿Quién hubiera imaginado que esta sería la respuesta más controvertida que jamás publicaría? Sé que los paquetes sun.* no son compatibles ni se garantiza que sigan existiendo, y conozco Commons y lo uso todo el tiempo. Sin embargo, el cartel pedía una clase que estuviera "incluida con Sun Java 6", y eso es lo que estaba tratando de responder. Estoy de acuerdo en que la Cámara de los Comunes es el mejor camino a seguir en general.
EDITAR 2: Como señala amir75 a continuación, Java 6+ se entrega con JAXB, que contiene código compatible para codificar/decodificar Base64. Consulte la respuesta de Jeremy Ross a continuación.