首页 > 编程语言 >Java 8实现BASE64编解码

Java 8实现BASE64编解码

时间:2023-03-28 11:00:57浏览次数:39  
标签:编解码 编码器 Base64 Java String 编码 URL BASE64


Java 8实现BASE64编解码

作者:chszs,转载需注明。

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 = 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


与早期处理BASE64编码需求相比,不可能更简单了。因为无需外部依赖:commons-codec或sun.misc.BASE64Decoder或JAXB的DatatypeConverter。


URL编码也是我们经常会面对的需求,但由于URL对反斜线“/”有特殊的意义,因此URL编码需要替换掉它,使用下划线替换。比如下面的例子:

String basicEncoded = Base64.getEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));
System.out.println("Using Basic Alphabet: " + basicEncoded);
 
String urlEncoded = Base64.getUrlEncoder().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");
String mimeEncoded = Base64.getMimeEncoder().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, 文件/tmp/buff-base64.txt的内容是BASE64编码的形式
  try (OutputStream os = Base64.getEncoder().wrap(newFileOutputStream("/tmp/buff-base64.txt"))) {
    os.write(src.getBytes("utf-8"));
  }

  // 解码器封装InputStream, 以及以流的方式解码, 无需缓冲
  // is being consumed. There is no need to buffer the content of the file just for decoding it.
  try (InputStream is = Base64.getDecoder().wrap(newFileInputStream("/tmp/buff-base64.txt"))) {
    int len;
    byte[] bytes = new byte[100];
    while ((len = is.read(bytes)) != -1) {
      System.out.print(new String(bytes, 0, len, "utf-8"));
    }
  }
}






标签:编解码,编码器,Base64,Java,String,编码,URL,BASE64
From: https://blog.51cto.com/prettycms/6154238

相关文章

  • JavaScript基础
    1.引入jshttps://www.w3cschool.cn/javascript/用script标签,在其中写js代码<scriptsrc="JS/style.js"></script>Numberjs不区分小数和整数NaN表示不是一......
  • ]Java中HashMap遍历的两种方式
    笔试的时候,两次都要用到工具类hashmap,这个东西用起来果然爽啊,但是在我遍历这个map的时候,迭代器写不出来了,真是悲催了,于是还是找下吧,下面的可是要记住用处啊Java中HashM......
  • Java学习日记3
    2023.3.27学习Java打卡Java方法#方法是解决一类问题的步骤的有序组合#方法包含于类或对象中#方法在程序中被创建,在其他地方被引用例:publicclassdemo1{publi......
  • Java学习----稀疏数组
    稀疏数组当数组中大部分元素为0,或为同一值时,可用稀疏数组来保存。处理方式:记录数组一共有几行几列,有多少不同值。把具有不同值的元素和行列和值记录在小规模数组中......
  • Java学习---计算器(简易)
    小练习:写一个计算器,要求实现加减乘除功能,并且能循环接受新的数据。以下是我的代码:importjava.util.Scanner;publicclassDemo1{publicstaticvoidmain(Strin......
  • Java学习----冒泡排序
    冒泡排序importjava.util.Arrays;publicclassMaoPaoPaiXu{publicstaticvoidmain(String[]args){int[]a={1,2,3,5,7,9,22,44,63,75};......
  • Java泛型详解
    注:本文转自:https://blog.csdn.net/qq_41701956/article/details/123473592泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它。毫不夸张的说,泛型是通用设......
  • MyBatis中Java类型与别名的对应关系表
    常见Java类型有许多内置的类型别名。注意,它们都是不区分大小写的,由于重载名称而对原语进行特殊处理。下面给出对应关系表:别名Java类型_bytebyte_longlong_......
  • 第一篇 javascript 数据类型
    1、数据类型基础数据类型(7种)1、String2、Number3、Boolean4、null5、undefined6、Symbol7、bigInit引用数据类型(Object)1、Object2、Array3、Fun......
  • 第二篇 javascript 标示符、变量、语句、操作符
    bycaixin深圳1、标识符及变量标识符1、所谓标识符,就是变量、函数、属性的名字,或者函数的参数。标识符申明规则:1、第一个字符必须是一个字母、下划线_、或者......