Наконец, Java 8 вышла. Наконец, есть стандартный способ кодирования Base64. Слишком долго мы полагались на кодек Apache Commons (который в любом случае хорош). Сознательные кодеры будут отчаянно использовать sun.misc.BASE64Encoder и sun.misc.BASE64Decoder только для того, чтобы избежать добавления дополнительных JAR-файлов в свои программы, если они уверены, что используют только Sun / Oracle JDK. Эти классы все еще скрываются в Java 8.
Чтобы проверить это, я представил тест JUnit, чтобы показать, как использовать следующие API для кодирования:
- Кодек Commons: org.apache.commons.codec.binary.Base64
- Java 8 новый java.util.Base64
- Сорт вечнозеленого внутреннего кода JDK от Sun / Oracle: sun.misc.BASE64Encoder
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package org.gizmo.util;import java.util.Random;import org.apache.commons.codec.binary.Base64;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;import static org.junit.Assert.assertArrayEquals;import sun.misc.BASE64Encoder;public class Base64Tests { private static byte[] randomBinaryData = new byte[5000000]; private static long durationCommons = 0; private static long durationJava8 = 0; private static long durationSun = 0; private static byte[] encodedCommons; private static byte[] encodedJava8; private static String encodedSun; @BeforeClass public static void setUp() throws Exception { //We want to test the APIs against the same data new Random().nextBytes(randomBinaryData); } @Test public void testSunBase64Encode() throws Exception { BASE64Encoder encoder = new BASE64Encoder(); long before = System.currentTimeMillis(); encodedSun = encoder.encode(randomBinaryData); long after = System.currentTimeMillis(); durationSun = after-before; System.out.println("Sun: " + durationSun); } @Test public void testJava8Base64Encode() throws Exception { long before = System.currentTimeMillis(); java.util.Base64.Encoder encoder = java.util.Base64.getEncoder(); encodedJava8 = encoder.encode(randomBinaryData); long after = System.currentTimeMillis(); durationJava8 = after-before; System.out.println("Java8: " + durationJava8); } @Test public void testCommonsBase64Encode() throws Exception { long before = System.currentTimeMillis(); encodedCommons = Base64.encodeBase64(randomBinaryData); long after = System.currentTimeMillis(); durationCommons = after-before; System.out.println("Commons: " + durationCommons); } @AfterClass public static void report() throws Exception { //Sanity check assertArrayEquals(encodedCommons, encodedJava8); System.out.println(durationCommons*1.0/durationJava8); }} |
Как насчет производительности этих 3 способов? Base64, кажется, достаточно маленький метод, поэтому есть меньше способов испортить его, но вы никогда не узнаете, что лежит под поверхностью. Судя по общему времени (в тестах JUnit), кажется, что 3 метода можно расположить так, от самого быстрого до самого медленного: Java 8, Commons, Sun. Пример синхронизации (кодирование байтового массива размером 5 000 000):
Солнце: 521
Commons: 160
Java8: 37
Метод Java 8 работал в 4 раза быстрее, чем Commons, и в 14 раз быстрее, чем Sun. Но этот образец просто упрощенный. Постарайтесь сделать для себя эталон, чтобы прийти к своим собственным выводам.
Итак, какие API использовать? Как вам скажет любой специалист … это зависит. Если у вас достаточно мощности, чтобы диктовать, что ваш код должен работать только на Java 8 и выше, тогда непременно используйте новый java.util.Base64. Если вам просто нужно поддерживать несколько версий JDK и поставщиков, вы можете использовать Commons Codec или какой-либо другой сторонний API. Или подождите, пока старые Javas не будут израсходованы или использованы, и перепишите свою драгоценную кодовую базу. Или перейти на другой язык программирования.
Примечание: я даже не упомянул об использовании sun.misc.BASE64Encoder. Избегайте этого, когда это возможно. Возможно, однажды этот класс будет удален в другой (alos) версии JDK… его нет в других (гетеро) JDK других поставщиков.
Ресурсы
- http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html
- http://stackoverflow.com/questions/13109588/base64-encoding-in-java/22704819#22704819
- http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html
| Ссылка: | Base64 в Java 8 — еще не поздно присоединиться к веселью от нашего партнера по JCG Аллена Чи в блоге YK’s Workshop . |