我有一个Base64编码的图像。Java中最好的解码方法是什么?希望只使用Sun Java 6中包含的库。


当前回答

我知道现在回答有点晚了,但对于JDK 8及以上版本。

Base64.getEncoder().encodeToString("anyStringData".getBytes());
Base64.getDecoder().decode("encodedData");

进口

import java.util.Base64;

请参考此OracleDocs !

其他回答

给出一个javax.xml.bind.DatatypeConverter的测试编码/解码示例,使用方法parseBase64Binary()和printBase64Binary()引用@jeremy-ross和@nightfirecat answer。

@Test
public void EncodeDecode() {
    //ENCODE
    String hello = "Hello World";
    byte[] helloBytes = hello.getBytes(StandardCharsets.UTF_8);
    String encodedHello = DatatypeConverter.printBase64Binary(helloBytes);
    LOGGER.info(hello + " encoded=> " + encodedHello);

    //DECODE
    byte[] encodedHelloBytes = DatatypeConverter.parseBase64Binary(encodedHello);
    String helloAgain = new String(encodedHelloBytes, StandardCharsets.UTF_8) ;
    LOGGER.info(encodedHello + " decoded=> " + helloAgain);

    Assert.assertEquals(hello, helloAgain);
}

结果:

INFO - Hello World encoded=> SGVsbG8gV29ybGQ=
INFO - SGVsbG8gV29ybGQ= decoded=> Hello World

Java .util的Java 8实现。Base64不依赖于其他Java 8特定的类。

我不确定这是否适用于Java 6项目,但可以复制并粘贴Base64.java文件到Java 7项目中,并编译它,除了导入Java .util. arrays和Java .util. objects之外,无需任何修改。

注意,Base64.java文件是由GNU GPL2覆盖的

从Java 8开始,就有了官方支持的用于Base64编码和解码的API。 随着时间的推移,这可能会成为默认的选择。

该API包括java.util类。Base64及其嵌套类。它支持三种不同的风格:基本的、URL安全的和MIME。

使用“基本”编码的示例代码:

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);

java.util的文档。Base64还包括一些配置编码器和解码器的方法,以及使用不同的类作为输入和输出(字节数组,字符串,ByteBuffers, java。io流)。

特别是在通用Codec:类Base64解码(byte[]数组)或编码(byte[]数组)

不需要使用commons——Sun在Java中附带了base64编码器。你可以这样导入它:

import sun.misc.BASE64Decoder;

然后像这样使用它:

BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(encodedBytes);

其中encodedBytes是java.lang.String或java.io.InputStream。只是要当心太阳。*类不是Sun的“官方支持”。

编辑:谁能想到这将是我发表过的最具争议的答案呢?我知道太阳。*不支持或保证软件包继续存在,我确实了解Commons并一直在使用它。然而,发帖者要求一个“包含在Sun Java 6中”的类,这就是我试图回答的问题。总的来说,我同意Commons是最好的方式。

编辑2:正如amir75在下面指出的那样,Java 6+附带了JAXB,其中包含支持的编码/解码Base64的代码。请看下面Jeremy Ross的回答。