2011-05-06 20 views
19

This question with regard to JDK 5 dice que no se proporciona ninguna implementación con JDK 5, pero se supone que JDK 6 tiene un sun.misc.Base64Decoder.La decodificación de Base64 con JDK6 solo

Por lo que puedo decir, esta clase no se proporciona con el JDK y no pude encontrar ninguna clase similar en él

Entonces, ¿cómo es la situación con JDK6?

Conozco numerosas implementaciones como las de Commons y JBoss, pero tenemos una política restrictiva de lib de terceros, así que estoy tratando de evitar reinventar la rueda.

+0

debe esperar desde sun.misc, es un poco raro, rara vez cambia, pero cuando lo hace es bastante rápido. – bestsss

Respuesta

10

No, la situación no cambió entre Java y Java 5 6.

Desafortunadamente no hay una aplicación oficial de base 64 en la plataforma Java SE. @bestsss ha demostrado que es, de hecho, una implementación Base64 (bien oculta) en Java SE 6 (ver su respuesta para obtener más detalles).

barcos Sun JDK con esta clase (sun.misc.Base64Decoder), pero no se especifica y should not be used (especialmente ya que no es necesario que exista en otras implementaciones o incluso las versiones).

Si es absolutamente necesario evitar bibliotecas de terceros (Apache Commons Codec sería el proveedor tradicional de a Base64 implementation), entonces puede que desee para copiar un BSD (o de manera similar) con licencia versión en su proyecto. Hay un public domain implementation y eso es tan fácil como se obtiene, cuando se trata de licencias.

+1

Gracias por la respuesta rápida. Decidí probar la distribución fuente de la implementación con licencia de BSD [MiGBase64] (http://migbase64.sourceforge.net/). Afirma ser muy rápido y tener una huella pequeña. – kostja

+2

Hay una impl oficial. en realidad 2 de ellos. – bestsss

+3

Es completamente ridículo que Java no proporcione un codificador/decodificador Base64 incorporado * en una ubicación sensata *. – aroth

49

Hay implementaciones oficiales (no sun.misc) en Java, pero no es donde se supone que debe estar.

es el que tiene los métodos necesarios para hacerlo. Debe sobrescribir el método put.

Y uno más que es mucho más fácil de usar:

javax.xml.bind.DatatypeConverter tiene 2 métodos de interés:


aclaración de la naturaleza base 64 de AbstractPreferences:(. Sun.misc *)java.util.prefs.Preferences

 
    /** 
    * Associates a string representing the specified byte array with the 
    * specified key in this preference node. The associated string is 
    * the Base64 encoding of the byte array, as defined in RFC 2045, Section 6.8, 
    * with one minor change: the string will consist solely of characters 
    * from the Base64 Alphabet; it will not contain any newline 
    * characters. Note that the maximum length of the byte array is limited 
    * to three quarters of MAX_VALUE_LENGTH so that the length 
    * of the Base64 encoded String does not exceed MAX_VALUE_LENGTH. 
    * This method is intended for use in conjunction with 
    * {@link #getByteArray}. 
    */ 
    public abstract void putByteArray(String key, byte[] value); 
+0

¿Cómo usarías 'AbstractPreferences' de una manera que se ajusta a la documentación? Es JavaDoc no menciona Base64 * en ninguna parte *. –

+1

'DatatypeConverter' se ve genial, 'sin embargo! –

+0

@Joachim, sobre el documento, estás equivocado :), editaré la respuesta – bestsss

2

Al igual que dijo Joachim Sauer en un comentario anterior jdk1.6 ya viene incluido con su propia aplicación base 64, aquí está un ejemplo:

String toEncode = "Encoding and Decoding in Base64 Test"; 
//Encoding in b64 
String encoded = new BASE64Encoder().encode(toEncode.getBytes()); 
System.out.println(encoded); 
//Decoding in b64 
byte[] decodeResult = new BASE64Decoder().decodeBuffer(encoded); 
System.out.println(new String(decodeResult));