我有一个Base64编码的图像。Java中最好的解码方法是什么?希望只使用Sun Java 6中包含的库。
当前回答
不需要使用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的回答。
其他回答
Java .util的Java 8实现。Base64不依赖于其他Java 8特定的类。
我不确定这是否适用于Java 6项目,但可以复制并粘贴Base64.java文件到Java 7项目中,并编译它,除了导入Java .util. arrays和Java .util. objects之外,无需任何修改。
注意,Base64.java文件是由GNU GPL2覆盖的
从v6开始,Java SE附带JAXB。datatypeconverter有一些静态方法可以简化这一点。参见parseBase64Binary()和printBase64Binary()。
更新:JAXB不再随Java一起发布(从Java 11开始)。如果项目需要JAXB,则需要通过依赖项管理系统(例如Maven)配置相关库。如果你需要编译器(xjc.exe),你也需要单独下载。
另一个迟来的答案,但我的基准测试表明,Jetty的Base64编码器的实现非常快。不如MiGBase64快,但比iHarder Base64快。
import org.eclipse.jetty.util.B64Code;
final String decoded = B64Code.decode(encoded, "UTF-8");
我还做了一些基准测试:
library | encode | decode
------------------+--------------+-------------
'MiGBase64' | 10146001.00 | 6426446.00
'Jetty B64Code' | 8846191.00 | 3101361.75
'iHarder Base64' | 3259590.50 | 2505280.00
'Commons-Codec' | 241318.04 | 255179.96
这些是每秒跑数,所以越高越好。
希望这对你有所帮助:
import com.sun.org.apache.xml.internal.security.utils.Base64;
String str="Hello World";
String base64_str=Base64.encode(str.getBytes("UTF-8"));
Or:
String str="Hello World";
String base64_str="";
try
{base64_str=(String)Class.forName("java.util.prefs.Base64").getDeclaredMethod("byteArrayToBase64", new Class[]{byte[].class}).invoke(null, new Object[]{str.getBytes("UTF-8")});
}
catch (Exception ee) {}
java.util.prefs。Base64适用于本地rt.jar,
但是它不在JRE类白名单中
GAE/J白名单中没有列出的可用类
真遗憾!
PS.在android中,这很容易,因为android.util。Base64从Android API Level 8开始就被包含了。
番石榴现在内置了Base64解码。
使用BaseEncoding.base64 () .decode ()
至于处理输入使用中可能出现的空白
BaseEncoding.base64 () .decode (CharMatcher.WHITESPACE.removeFrom(…));
有关更多信息,请参阅此讨论
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap