- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详细分析JAVA8新特性 Base64由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
BASE64 编码是一种常用的字符编码,在很多地方都会用到。但base64不是安全领域下的加密解密算法。能起到安全作用的效果很差,而且很容易破解,他核心作用应该是传输数据的正确性,有些网关或系统只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据.
JDK里面实现Base64的API 。
在JDK1.6之前,JDK核心类一直没有Base64的实现类,有人建议用Sun/Oracle JDK里面的sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder,使用它们的优点就是不需要依赖第三方类库,缺点就是可能在未来版本会被删除(用maven编译会发出警告),而且性能不佳,后面会有性能测试.
JDK1.6中添加了另一个Base64的实现,javax.xml.bind.DatatypeConverter两个静态方法parseBase64Binary 和 printBase64Binary,隐藏在javax.xml.bind包下面,不被很多开发者知道.
在Java 8在java.util包下面实现了BASE64编解码API,而且性能不俗,API也简单易懂,下面展示下这个类的使用例子.
java.util.Base64 。
该类提供了一套静态方法获取下面三种BASE64编解码器:
1)Basic编码:是标准的BASE64编码,用于处理常规的需求 。
1
2
3
4
5
6
|
// 编码
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编码:使用下划线替换URL里面的反斜线“/” 。
1
2
3
4
|
String urlEncoded = Base64.getUrlEncoder().encodeToString(
"subjects?abcd"
.getBytes(
"utf-8"
));
System.out.println(
"Using URL Alphabet: "
+ urlEncoded);
// 输出为:
Using URL Alphabet: c3ViamVjdHM_YWJjZA==
|
3)MIME编码:使用基本的字母数字产生BASE64输出,而且对MIME格式友好:每一行输出不超过76个字符,而且每行以“\r\n”符结束.
1
2
3
4
5
6
7
|
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);
|
第三方实现Base64的API 。
首先便是常用的Apache Commons Codec library里面的org.apache.commons.codec.binary.Base64; 。
第二个便是Google Guava库里面的com.google.common.io.BaseEncoding.base64() 这个静态方法; 。
第三个是net.iharder.Base64,这个jar包就一个类; 。
最后一个,号称Base64编码速度最快的MigBase64,而且是10年前的实现,到现在是否能保持这个称号,测一测便知道; 。
Base64编码性能测试 。
上面讲了一共7种实现Base64编码,Jdk里面3种,第三方实现4种,一旦有选择,则有必要将他们进行一次高低对比,性能测试是最直接的方式 。
首先来定义两个接口 。
1
2
3
4
5
6
7
8
9
10
|
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;
}
|
两个接口区别就是其中一个接口方法参数接收byte数组,返回byte数组,因为byte->byte相比String->byte或者byte->String性能上会快一点,所以区分两组来测试 。
1
2
3
4
|
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() };
|
从上面看出,其中支持byte->byte只有4中API; 。
7个Base64的实现类 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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 );
}
}
|
后面代码基本就是各种API实现Base64的代码了,就不详细列出.
主要测试手段是,生成100M的随机数,分成100byte或者1000byte的块,然后将他们分别编码和解码,记录时间,如下方法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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
);
}
|
测试结果 。
jvm参数:-Xms512m -Xmx4G 。
一切都很明显了,从上面看出,sun的表现不是很好,IHarder和MigBase64性能可以接受,传说MigBase64性能第一,那也是过去了,在这次测试结果中,新的java8 base64运行速度最好,javaXml表现次之.
总结 。
如果你需要一个性能好,可靠的Base64编解码器,不要找JDK外面的了,java8里面的java.util.Base64以及java6中隐藏很深的javax.xml.bind.DatatypeConverter,他们两个都是不错的选择.
以上就是详细分析JAVA8新特性 Base64的详细内容,更多关于JAVA8 Base64的资料请关注我其它相关文章! 。
原文链接:https://my.oschina.net/benhaile/blog/267738 。
最后此篇关于详细分析JAVA8新特性 Base64的文章就讲到这里了,如果你想了解更多关于详细分析JAVA8新特性 Base64的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
目录 C#特性 1. 概括 2. 语法 定义特性类 应用特性
是否有关于 Python 语言必须提供哪些功能的文章/论文?为什么应该使用 Python 而不是任何其他语言? Python 的优点和缺点是什么? 最佳答案 Why Python和 Why Pytho
我想弄清楚为什么 .x比*.x具有更高的特异性当后者有望获胜时。 不是*.x应该具有 0-0-1-1 的特异性(1 个类,1 个标签)而 .x只是一个类(class) 0-0-1-0 ? 考虑以下基本
在尝试评估非 instanceof 条件时,我发现了我在 Groovy 2.4.7、1.6.0 JVM 中没有预料到的行为。 总之: class Foo { static Boolean
当使用可变结构和属性时,编译器可以解决一些问题,但不能对其他相当明显的事情做同样的事情,这对我来说似乎很奇怪。 以下面的自动属性为例: Vector2 Vector { get; set; } 而不是
我对 ES3 有一定的了解,但我对 ES5 的特性不是很了解。我 - 或多或少 - 知道: Object.create(), Object.freeze() “使用严格” getter 和 sette
我最近开始将 Django 1.5.4 用于带有 MySQL 后端的 Web 应用程序。就在一开始,我遇到了某些限制,这让我想知道 Django 是否是继续前进的正确方法。 一些明显的缺点是: 缺少复
在函数模板的定义中,模板参数的实例化一般是未知的。类型特征可用于在编译时获取一些信息。例如,这是 is_pointer 的一个简单应用: template void foo(T p) { cout
我正在设计页面的样式,该页面具有除最后一个框外的带底部边框的连续框。我为所有框应用类 .box 并添加 .box_last 以仅隐藏最后一个框的边框。 .box { border-bottom-s
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我有兴趣编制一份不建议在嵌入式系统中使用的 c++ 功能列表(这可能会导致人们推荐使用 c 而不是 c++)。如果您知道,请尝试添加原因,或者将您的原因添加到其他人的答案中。 这是一个开始(我知道的唯
作为一名 Ruby 程序员,您是否曾觉得任何使用起来有点冒险的功能,可能是因为它的奇怪行为?它可能有很好的文档记录,但在调试时很难找到,或者难以记住? 我通常尽量远离 String#gsub!。文档说
我正在开发一个连接到健身 watch 的蓝牙应用程序。这是我第一次使用蓝牙。我设法使用出色的 FlutterBlue 将我的应用程序与设备连接起来图书馆。 但是我无法理解我从阅读中获得的结果。这是我阅
1. 迭代器(Iterator)的介绍 背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间费连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历。 定义:迭代器是一种检
嗨,伙计们,有没有动态更改 Spring 属性文件内容的好例子?如果您能给我一些示例或链接,我将不胜感激。 非常感谢 最佳答案 我想你可以使用 ReloadableResourceBundleMess
SystemVerilog 引入了一些非常有用的结构来改进编码风格。然而,正如我的一位同事经常说的,“你不是在写软件,你是在描述硬件。”考虑到这一点,当最终结果需要合成时,应该避免语言的哪些特征?这个
我定义了这些测试依赖项 / Test Dependencies lazy val wiremock = "com.github.tomakehurst" % "wir
我正在为 Android 手机和 Android watch (wearOS) 编写应用程序。这些应用程序将通过蓝牙相互通信。基本上,Android 手机上的应用程序将与 WearOS 设备绑定(bi
我正在为 Android 手机和 Android watch (wearOS) 编写应用程序。这些应用程序将通过蓝牙相互通信。基本上,Android 手机上的应用程序将与 WearOS 设备绑定(bi
我有兴趣提高我的设计能力(设计具有属性、方法等的类)。即如何决定类、方法和属性应该是什么? 你们能建议我改进这个的好 Material 吗? 最佳答案 请看: Any source of good o
我是一名优秀的程序员,十分优秀!