Heim  >  Artikel  >  Java  >  Interpretation neuer Funktionen von Java8 – Base64

Interpretation neuer Funktionen von Java8 – Base64

零下一度
零下一度Original
2017-06-17 14:10:201827Durchsuche

Dieser Artikel stellt hauptsächlich die relevanten Informationen von Base64, einer neuen Funktion von Java8, im Detail vor. Interessierte Freunde können sich darauf beziehen.

BASE64-Kodierung ist ein häufig verwendetes Zeichen an vielen Orten verwendet. Base64 ist jedoch kein Verschlüsselungs- und Entschlüsselungsalgorithmus im Sicherheitsbereich. Der Sicherheitseffekt ist sehr gering und seine Kernfunktion sollte die Richtigkeit der übertragenen Daten sein. Einige Gateways oder Systeme können nur ASCII-Zeichen verwenden. Base64 ist eine Methode zur Konvertierung von Nicht-ASCII-Zeichendaten in ASCII-Zeichen. Base64 eignet sich besonders für die schnelle Datenübertragung unter http- und Mime-Protokollen.

API zur Implementierung von Base64 im JDK

Vor JDK1.6 gab es keine Base64-Implementierungsklasse für JDK-Kernklassen. Einige Leute schlugen die Verwendung vor Sun /Sun.misc.BASE64Encoder und sun.misc.BASE64Decoder im Oracle JDK Der Vorteil ihrer Verwendung besteht darin, dass sie nicht auf Klassenbibliotheken von Drittanbietern angewiesen sind Wird in zukünftigen Versionen gelöscht (beim Kompilieren mit Maven wird eine Warnung ausgegeben) und die Leistung ist nicht gut. Später werden Leistungstests durchgeführt.

JDK1.6 hat eine weitere Base64-Implementierung hinzugefügt, javax.xml.bind.DatatypeConverter mit zwei statischen Methoden parseBase64Binary und printBase64Binary, versteckt im javax.xml.bind-Paket. Unten nicht vielen Entwicklern bekannt.

In Java 8 ist die BASE64-Codierungs- und Decodierungs-API im Paket java.util implementiert. Die Leistung ist gut und die API ist einfach und leicht zu verstehen. Nachfolgend finden Sie ein Verwendungsbeispiel diese Klasse.

java.util.Base64

Diese Klasse stellt eine Reihe statischer Methoden bereit, um die folgenden drei BASE64-Codecs zu erhalten:

1) Grundlegende Kodierung: Es handelt sich um eine Standard-BASE64-Kodierung, die für normale Anforderungen verwendet wird


// 编码
String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc=
// 解码
byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new String(asBytes, "utf-8")); // 输出为: some string

2) URL-Kodierung: Verwenden Sie Unterstriche. Ersetzen der Backslash „/“ in der URL


String urlEncoded = Base64.getUrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));
System.out.println("Using URL Alphabet: " + urlEncoded);
// 输出为:
Using URL Alphabet: c3ViamVjdHM_YWJjZA==

3) MIME-Kodierung: Verwenden Sie einfache alphanumerische Zeichen, um eine BASE64-Ausgabe zu erzeugen, und sind freundlich zum MIME-Format: Jeder Die Ausgabezeile sollte 76 Zeichen nicht überschreiten und jede Zeile sollte mit dem Zeichen „rn“ enden.


StringBuilder sb = new StringBuilder();
for (int t = 0; t < 10; ++t) {
 sb.append(UUID.randomUUID().toString());
}
byte[] toEncode = sb.toString().getBytes("utf-8");
String mimeEncoded = Base64.getMimeEncoder().encodeToString(toEncode);
System.out.println(mimeEncoded);

Drittanbieter-Implementierung der Base64-API

Der erste ist der häufig verwendete Apache Commons Codec org.apache.commons.codec.binary.Base64 in der Bibliothek
Die zweite ist die statische Methode com.google.common.io.BaseEncoding.base64() in der Google Guava-Bibliothek; Das erste ist net.iharder.Base64, dieses JAR-Paket ist nur eine Klasse; das letzte ist MigBase64, das als die schnellste Base64-Codierungsgeschwindigkeit bekannt ist und vor 10 Jahren implementiert wurde Behalten Sie diesen Titel jetzt bei. Wissen Sie; Jdk und 4 bei Drittanbietern. Sobald Sie die Wahl haben, ist es notwendig, sie zu vergleichen.


Definieren Sie zunächst zwei

Schnittstellen



Der Unterschied zwischen den beiden Schnittstellen besteht darin, dass einer der Schnittstellenmethodenparameter ein Byte-Array empfängt und ein Byte-Array zurückgibt, da Byte->Byte verglichen wird zu String->Byte oder Byte-> String-Leistung wird schneller sein, also trennen Sie zwei Gruppen zum Testen



Wie aus dem ersichtlich ist Oben gibt es nur 4 APIs, die Byte->Byte unterstützen;

private static interface Base64Codec
  {
    public String encode(final byte[] data);
    public byte[] decode(final String base64) throws IOException;
  }
  private static interface Base64ByteCodec
  {
    public byte[] encodeBytes(final byte[] data);
    public byte[] decodeBytes(final byte[] base64) throws IOException;
  }


7 Base64-Implementierungsklassen


private static final Base64Codec[] m_codecs = { new GuavaImpl(), new JavaXmlImpl(),
    new Java8Impl(), new SunImpl(), new ApacheImpl(),new MiGBase64Impl(),new IHarderImpl() };
private static final Base64ByteCodec[] m_byteCodecs = {
    new ApacheImpl(), new Java8Impl(),new MiGBase64Impl(),new IHarderImpl() };


Bei den folgenden Codes handelt es sich grundsätzlich um verschiedene APIs. Der Code zur Implementierung von Base64 wird nicht im Detail aufgeführt.


Die Haupttestmethode besteht darin, 100 Millionen Zufallszahlen zu generieren, sie in 100-Byte- oder 1000-Byte-Blöcke zu unterteilen und sie dann jeweils zu kodieren und zu dekodieren und die Zeit wie folgt aufzuzeichnen


private static class Java8Impl implements Base64Codec, Base64ByteCodec
  {
    private final Base64.Decoder m_decoder = Base64.getDecoder();
    private final Base64.Encoder m_encoder = Base64.getEncoder();
    @Override
    public String encode(byte[] data) {
      return m_encoder.encodeToString(data);
    }
    @Override
    public byte[] decode(String base64) throws IOException {
      return m_decoder.decode(base64);
    }
    public byte[] encodeBytes(byte[] data) {
      return m_encoder.encode( data );
    }
    public byte[] decodeBytes(byte[] base64) throws IOException {
      return m_decoder.decode( base64 );
    }
  }
  private static class JavaXmlImpl implements Base64Codec //no byte[] implementation
  {
    public String encode(byte[] data) {
      return DatatypeConverter.printBase64Binary( data );
    }
    public byte[] decode(String base64) throws IOException {
      return DatatypeConverter.parseBase64Binary( base64 );
    }
  }
..............


Testergebnisse


JVM-Parameter: -Xms512m -Xmx4G


private static TestResult testByteCodec( final Base64ByteCodec codec, final List<byte[]> buffers ) throws IOException {
    final List<byte[]> encoded = new ArrayList<byte[]>( buffers.size() );
    final long start = System.currentTimeMillis();
    for ( final byte[] buf : buffers )
      encoded.add( codec.encodeBytes(buf) );
    final long encodeTime = System.currentTimeMillis() - start;
    final List<byte[]> result = new ArrayList<byte[]>( buffers.size() );
    final long start2 = System.currentTimeMillis();
    for ( final byte[] ar : encoded )
      result.add( codec.decodeBytes(ar) );
    final long decodeTime = System.currentTimeMillis() - start2;
    for ( int i = 0; i < buffers.size(); ++i )
    {
      if ( !Arrays.equals( buffers.get( i ), result.get( i ) ) )
        System.out.println( "Diff at pos = " + i );
    }
    return new TestResult( encodeTime / 1000.0, decodeTime / 1000.0 );
  }

Aus dem oben Gesagten ist ersichtlich, dass die Leistung von IHarder und MigBase64 die beste ist Dieses Testergebnis zeigt, dass das neue Java8 Base64 am schnellsten läuft. Nun, JavaXml schneidet am zweitbesten ab.

Zusammenfassung

Wenn Sie eine gute Leistung und einen zuverlässigen Base64-Codec benötigen, suchen Sie nicht nach einem außerhalb des JDK, sondern verwenden Sie Java in Java8 .util.Base64 und javax.xml.bind.DatatypeConverter, die tief in Java6 versteckt sind, sind beide eine gute Wahl.

Das obige ist der detaillierte Inhalt vonInterpretation neuer Funktionen von Java8 – Base64. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn