Base64编码图像的最快Java库是什么?

Base64编码图像的最快Java库是什么?,java,base64,encode,Java,Base64,Encode,我目前正在使用ByteArrayOutputStream将BuffereImage转换为byte[],然后使用开源类Base64编码器将byte[]转换为char[],然后追加到字符串。这是编码视频帧集并将其转换为XML友好格式的多步骤过程的一部分。不要问我为什么要这样做,那正是我需要做的 我看到Base64编码占用了整个过程约75%的CPU时间,而且我刚刚从google搜索中抓取了这个随机类,我确信有更有效的方法来编码图像。伙计们,我的选择是什么?试试commons codec库 一定要让我们

我目前正在使用ByteArrayOutputStream将BuffereImage转换为byte[],然后使用开源类Base64编码器将byte[]转换为char[],然后追加到字符串。这是编码视频帧集并将其转换为XML友好格式的多步骤过程的一部分。不要问我为什么要这样做,那正是我需要做的


我看到Base64编码占用了整个过程约75%的CPU时间,而且我刚刚从google搜索中抓取了这个随机类,我确信有更有效的方法来编码图像。伙计们,我的选择是什么?

试试
commons codec
库 一定要让我们知道结果。这是一个标准和广泛使用的图书馆

您要查找的类是
org.apache.commons.codec.binary.Base64

这是一个相当古老的问题,但它仍然作为热门搜索之一出现在谷歌上

这在这里得到了全面的回答:

下面是总结:

让我们在一个表中总结一下编解码器属性。此表按所有这些编解码器的相对性能排序(最快)

Name Max encoding Max decoding我们可以支持多少字节[]->byte[] len len使用-Xmx8G编码 Java 8 1.62 G 2 G 1.16 G是 javax.xml 1.62 G 2 G 1.07 G编号 MiGBase64 1.62克0.36克1.07克是 IHarder 1.62克0.72克1.23克是 Apache 0.81 G 0.72 G 0.8 G是 番石榴1.62克2克1.07克编号 Sun.misc 0.79克1.05克0.78克编号 如果您正在寻找一种快速可靠的Base64编解码器,请不要在JDK之外寻找。在Java8中有一个新的编解码器:还有一个是隐藏的(来自Java6):。两者都是快速、可靠的,并且不会出现整数溢出

这里描述的四分之二的第三方编解码器速度非常快:MiGBase64和IHarder。不幸的是,如果您一次需要处理数百兆字节的数据,那么只有Google Guava允许您一次解码2G的数据(如果是MiGBase64,则为360MB;如果是IHarder和Apache Commons,则为720M)。不幸的是,Guava不支持byte[]->byte[]编码


如果您的字符集是多字节的,请不要尝试在大字符串上调用String.getBytes(字符集)-您可能会得到整数溢出相关异常的全部gamma。

@PaulWagland解决方案的问题是,几乎所有编码器都会为您分配编码字节数组(或变体)。也就是说,它们不是没有垃圾的

除非你知道自己在做什么,否则我不推荐以下内容

理想情况下,您要做的是将大量的
字节[]
设置为您期望的最大大小,然后使用threadlocal或某种池重用此
字节[]

不幸的是,
Base64.java
隐藏了您想要隐藏的方法:

private int decode0(byte[] src, int sp, int sl, byte[] dst) {
...
}
(我不打算粘贴来自JDK的代码,但我相信您可以很容易地找到它)

因此,如果您真的想快速运行,您可以在缓存的
byte[]
数组上使用该方法

理想情况下,尽管您希望将其重写为使用ByteBuffers

或者,作为权宜之计,您可以使用
Base64.Decode#wrap
,但该方法的问题是,它将创建一个wrapping
InputStream
,这可能比分配新数组更好,但仍然不是无垃圾的。您还需要将
ByteBuffer/byte[]
数组包装到它自己的输入流中

我发现Base64编码器/解码器没有CharsetEncoder的缺陷,即:


CharsetEncoder.encode(CharBuffer-in、ByteBuffer-out、boolean endOfInput)

比什么更有效?给出算法,或者我们不能告诉你你能改进什么。看看这里:有点相似……我已经告诉你的班级,Base64编码器,这是在谷歌搜索中的第一个结果……我发现所有我测试过的类在速度方面都是一致的。Apache commons Base64类、Base64Coder类和MiGBase64类都在慢速虚拟机上运行,它们都将捕获的300~15kb jpeg帧转换为Base64字符串,并在69秒内将其输出为XML。我想这是最好的了。谢谢大家!与我已经使用的处理时间相同,但commons库的功能肯定更多。我想那是最好的了,哦,好吧。
private int decode0(byte[] src, int sp, int sl, byte[] dst) {
...
}