Java8实现BASE64编解码
Java 8实现BASE64编解码
Java⼀直缺少BASE64编码 API,以⾄于通常在项⽬开发中会选⽤第三⽅的API实现。但是,Java 8实现了BASE64编解码API,它包含到java.util包。下⾯我会对Java 8的BASE64 API做⼀个介绍。
java.util.Base64⼯具类提供了⼀套静态⽅法获取下⾯三种BASE64编解码器:
1)Basic编码
2)URL编码
3)MIME编码
Basic编码是标准的BASE64编码,⽤于处理常规的需求:输出的内容不添加换⾏符,⽽且输出的内容由字母加数字组成。下⾯是⽤法:
// 编码
String asB64 = Encoder().encodeToString("some string".getBytes("utf-8"));
System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc=
// 解码
byte[] asBytes = Decoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new String(asBytes, "utf-8")); // 输出为: some string
与早期处理BASE64编码需求相⽐,不可能更简单了。因为⽆需外部依赖:commons-codec或sun.misc.BASE64Decoder或JAXB的DatatypeConverter。
URL编码也是我们经常会⾯对的需求,但由于URL对反斜线“/”有特殊的意义,因此URL编码需要替换掉它,使⽤下划线替换。⽐如下⾯的例⼦:
String basicEncoded = Encoder().encodeToString("subjects?abcd".getBytes("utf-8"));
System.out.println("Using Basic Alphabet: " + basicEncoded);
String urlEncoded = UrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));
System.out.println("Using URL Alphabet: " + urlEncoded);
// 输出为:
Using Basic Alphabet: c3ViamVjdHM/YWJjZA==
Using URL Alphabet: c3ViamVjdHM_YWJjZA==
上⾯的例⼦可以看出,如果是使⽤基本的编码器,那么输出可能会包含反斜线“/”字符,但是如果使⽤URL编码器,那么输出的内容对URL来说是安全的。
MIME编码器会使⽤基本的字母数字产⽣BASE64输出,⽽且对MIME格式友好:每⼀⾏输出不超过76个字符,⽽且每⾏以“\r\n”符结束。⽐如下⾯的例⼦:
StringBuilder sb = new StringBuilder();
for (int t = 0; t < 10; ++t) {
sb.append(UUID.randomUUID().toString());
}
byte[] toEncode = sb.toString().getBytes("utf-8");
在线url网址编码解码String mimeEncoded = MimeEncoder().encodeToString(toEncode);
System.out.println(mimeEncoded);
// 输出为:
NDU5ZTFkNDEtMDVlNy00MDFiLTk3YjgtMWRlMmRkMWEzMzc5YTJkZmEzY2YtM2Y2My00Y2Q4LTk5
ZmYtMTU1NzY0MWM5Zjk4ODA5ZjVjOGUtOGMxNi00ZmVjLTgyZjctNmVjYTU5MTAxZWUyNjQ1MjJj
NDMtYzA0MC00MjExLTk0NWMtYmFiZGRlNDk5OTZhMDMxZGE5ZTYtZWVhYS00OGFmLTlhMjgtMDM1
ZjAyY2QxNDUyOWZiMjI3NDctNmI3OC00YjgyLThiZGQtM2MyY2E3ZGNjYmIxOTQ1MDVkOGQtMzIz
Yi00MDg0LWE0ZmItYzkwMGEzNDUxZTIwOTllZTJiYjctMWI3MS00YmQzLTgyYjUtZGRmYmYxNDA4
Mjg3YTMxZjMxZmMtYTdmYy00YzMyLTkyNzktZTc2ZDc5ZWU4N2M5ZDU1NmQ4NWYtMDkwOC00YjIy
LWIwYWItMzJiYmZmM2M0OTBm
java.util.Base64类封装了所有的BASE64编码器和解码器,还⽀持流的封装——这是⼀个⾮常优雅的
构造——包括编码和效率都很⾼(⽆需缓冲Buffer)——即编码器和解码器的输⼊和输出⽆需缓冲Buffer。下⾯我们以⼀个例⼦来说明编码器是怎样封装FileOutputStream,以及解码器是怎样封装FileInputStream的,两者皆不需要缓冲Buffer:
public void wrapping() throws IOException {
String src = "This is the content of any resource read from somewhere" +
" into a stream. This can be text, image, video or any other stream.";
// 编码器封装OutputStream, ⽂件/的内容是BASE64编码的形式
try (OutputStream os = Encoder().wrap(newFileOutputStream("/"))) {
os.Bytes("utf-8"));
}
// 解码器封装InputStream, 以及以流的⽅式解码, ⽆需缓冲
// is being consumed. There is no need to buffer the content of the file just for decoding it.
try (InputStream is = Decoder().wrap(newFileInputStream("/"))) {
int len;
byte[] bytes = new byte[100];
while ((len = is.read(bytes)) != -1) {
System.out.print(new String(bytes, 0, len, "utf-8"));
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论