La migration de soleil.misc.BASE64 pour Java 8 java.util.Base64
Question
Sont le Java 8 java.util.Base64
MIME de l'Encodeur et du Décodeur une baisse-dans le remplacement pour la prise en charge interne de l'API Java sun.misc.BASE64Encoder
et sun.misc.BASE64Decoder
?
Ce que je pense jusqu'à présent et pourquoi
Basé sur mes recherches et de tests rapides (voir code ci-dessous) il devrait être une baisse-dans le remplacement parce que
sun.misc.BASE64Encoder
basé sur sa JavaDoc est BASE64 Caractère codeur tel que spécifié dans RFC1521. Cette RFC est une partie de la MIME spécification...java.util.Base64
basé sur son JavaDoc Utilise L'Alphabet Base64", comme indiqué dans le Tableau 1 de RFC 2045 pour l'encodage et le décodage de l'opération... sous MIME
En supposant qu'aucun changement significatif dans la RFC 1521 et 2045 (je ne pouvais pas trouver tout) et d'après mon test rapide à l'aide de Java 8 MIME Base64 Encodeur/Décodeur doit être fine.
Ce que je suis à la recherche d'
- une source officielle, confirmer ou infirmer l' "remplacement" drop-in" point OU
- un contre-exemple qui montre un cas où java.util.Base64 a des comportements différents que le soleil.misc.BASE64Encoder OpenJDK Java 8 mise en œuvre (8u40-b25) (BASE64Decoder) OU
- ce que vous pensez réponses à la question ci-dessus certainement
De référence
Mon code de test
public class Base64EncodingDecodingRoundTripTest {
public static void main(String[] args) throws IOException {
String test1 = " ~!@#$%^& *()_+=`| }{[]\\;: \"?><,./";
String test2 = test1 + test1;
encodeDecode(test1);
encodeDecode(test2);
}
static void encodeDecode(final String testInputString) throws IOException {
sun.misc.BASE64Encoder unsupportedEncoder = new sun.misc.BASE64Encoder();
sun.misc.BASE64Decoder unsupportedDecoder = new sun.misc.BASE64Decoder();
Base64.Encoder mimeEncoder = java.util.Base64.getMimeEncoder();
Base64.Decoder mimeDecoder = java.util.Base64.getMimeDecoder();
String sunEncoded = unsupportedEncoder.encode(testInputString.getBytes());
System.out.println("sun.misc encoded: " + sunEncoded);
String mimeEncoded = mimeEncoder.encodeToString(testInputString.getBytes());
System.out.println("Java 8 Base64 MIME encoded: " + mimeEncoded);
byte[] mimeDecoded = mimeDecoder.decode(sunEncoded);
String mimeDecodedString = new String(mimeDecoded, Charset.forName("UTF-8"));
byte[] sunDecoded = unsupportedDecoder.decodeBuffer(mimeEncoded); //throws IOException
String sunDecodedString = new String(sunDecoded, Charset.forName("UTF-8"));
System.out.println(String.format("sun.misc decoded: %s | Java 8 Base64 decoded: %s", sunDecodedString, mimeDecodedString));
System.out.println("Decoded results are both equal: " + Objects.equals(sunDecodedString, mimeDecodedString));
System.out.println("Mime decoded result is equal to test input string: " + Objects.equals(testInputString, mimeDecodedString));
System.out.println("\n");
}
}
- Qu'entendez-vous par la baisse-dans le remplacement? Êtes-vous juste de parler à propos de l'encodage/décodage de comportement?
- Je veux dire par la baisse-dans le remplacement que je peux passer de l'héritage de code à l'aide du soleil.misc.BASE64Encoder et du soleil.misc.BASE64Decoder de Java 8 MIME Base64 Encodeur/Décodeur d'un autre code client de manière transparente. Cela semble être le cas, mais j'aime bien avoir une référence, confirmant ce ou une "preuve" que ce n'est pas le cas, sinon.
- Oui, vous pouvez changer le code héritage à la nouvelle Java 8 Base64 Codeur/Décodeur. Ils seront toujours produire le même résultat.
- Pertinentes pour demander qui codeur classe à utiliser?
Vous devez vous connecter pour publier un commentaire.
Voici un petit programme de test qui illustre une différence dans les chaînes codées:
Sa sortie est:
Noter que l'encodage de sortie de
sun.misc.BASE64Encoder
a un saut de ligne à la fin. Il n'a pas toujours ajouter un saut de ligne, mais il arrive à le faire si la chaîne codée a exactement 76 caractères sur sa dernière ligne. (L'auteur dejava.util.Base64
considéré que c'était un petit bug dans lasun.misc.BASE64Encoder
mise en œuvre – voir le examen fil).Cela peut sembler une banalité, mais si vous aviez un programme qui reposaient sur ce comportement spécifique, la commutation des encodeurs peuvent entraîner la malformation de sortie. Par conséquent, je conclus que
java.util.Base64
est pas une baisse-dans le remplacement poursun.misc.BASE64Encoder
.Bien sûr, la intention de
java.util.Base64
c'est qu'il est fonctionnellement équivalent, RFC-conforme, de haute performance, entièrement prise en charge et de remplacement spécifiée qui est destiné à prendre en charge la migration de code desun.misc.BASE64Encoder
. Vous devez être conscient de certaines de bord de cas de ce genre lors de la migration, si.sun.misc
genre de choses en général, c'est qu'il n'a jamais été formellement spécifié, et il n'y a pas de suite de la conformité et les tests de régression comme pour lejava.*
Api. Lesun.misc.BASE64
genre de choses est juste un morceau de code qui "a fait ce qu'il fait", et il est donc tout à fait possible, voire probable, qu'il y a de bizarre bord de cas de comportements ou même des bugs cachaient là.Call requires API level 26 (current min is 21): java.util.Base64#getMimeEncoder more... (Ctrl+F1)
Il n'y a pas de changements à la base64 spécifications entre les rfc1521 et rfc2045.
Tous base64 implémentations pourraient être considérés comme des substituts l'un de l'autre, les seules différences entre base64 implémentations sont:
Le MIME base64 alphabet a est resté constant entre la RFC versions (il a ou des logiciels plus anciens de casser) et est:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/
Comme Wikipédia notes, seuls les 2 derniers caractères peuvent changer entre base64 implémentations.
Comme un exemple de base64 mise en œuvre que ne changer les 2 derniers caractères, la IMAP MUTF-7 spécification de l'alphabet base64:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+,
La raison de ce changement est que la
/
personnage est souvent utilisé comme un délimiteur de chemin et depuis le MUTF-7 encodage est utilisé pour aplatir non-ASCII chemins de répertoire en ASCII, le/
de caractères doivent être évitées dans les segments codés.sun.misc.BASE64
implémentations. Mais bon, peut être que c'est trop évident... de toute façon, ce QA format devient alors un "officiel" de référence.J'ai eu le même problème, quand j'ai déménagé de sun pour java.util.base64, mais org.apache.commons.codec.binaires.Base64 ce problème résolu par
En supposant que les deux codeurs sont exempt de bugs, puis la RFC nécessite distinctes codages pour chaque 0 octet 1 octet 2 octets 3 octets de la séquence. Des séquences plus longues sont décomposés en autant de 3 séquences d'octets nécessaires suivie par une séquence finale. Par conséquent, si les deux implémentations de gérer tous les 16,843,009 (1+256+65536+16777216) séquences possibles correctement, alors les deux implémentations sont également identiques.
Ces tests ne prennent que quelques minutes pour s'exécuter. En modifiant légèrement votre code de test, je l'ai fait et mon Java 8 installation a passé tous les tests. Donc le public de la mise en œuvre peut être utilisé pour remplacer en toute sécurité du soleil.divers mise en œuvre.
Voici mon code de test: