在java 8学习系列中,我们已经学习了使用流逐行读取文件的新方法。Java 8引入了一个与IO操作相关的更好的附加功能,即Base64支持。我这篇文章,我们将了解它。
什么是Base 64编码?
当您想要通过网络发送某些二进制数据时,通常不会通过原始格式将数据转换为网络上的位和字节流来实现。为什么?因为某些媒体仅用于流媒体文本。这些协议可能会将您的二进制数据解释为它们不是的控制字符。
Base 64
编码将二进制数据转换为64个可打印ASCII
字符。通常,它用于电子邮件消息和"basic"
HTTP身份验证中的二进制数据。这64个可打印的字符是:
- 26个大写字母[A ... Z]
- 26个小写字母[a ... z]
- 10位[0 ... 9]
- 2个符号[ 阅读更多 ]
具有上述字符的编码字符串可以安全地通过网络支持文本数据传输,而不用担心在控制字符混淆时丢失数据。
Java 8之前的Base64支持
多年来,java通过非公共类(因此不可用)java.util.prefs.Base64
为未记录的类提供对base 64的支持sun.misc.BASE64Encoder
。该课程在公共领域的信息也非常有限。
Java 8支持Base64
Java 8为Base 64编码和解码目的添加了一个类,即java.util.Base64。我们将使用下面的代码示例来使用它。
1)将字符串编码到base 64
这就像获取编码器的实例一样简单,并将字符串作为字节输入以对其进行编码。
Base64.Encoder encoder = Base64.getEncoder(); String normalString = "username:password"; String encodedString = encoder.encodeToString( normalString.getBytes(StandardCharsets.UTF_8) ); Output: dXNlcm5hbWU6cGFzc3dvcmQ=
2)解码基数为64的编码字符串
这也很简单。只需获取Base64.Decoder的实例并使用它来解码基本64位编码的字符串。
String encodedString = "dXNlcm5hbWU6cGFzc3dvcmQ="; Base64.Decoder decoder = Base64.getDecoder(); byte[] decodedByteArray = decoder.decode(encodedString); //Verify the decoded string System.out.println(new String(decodedByteArray)); Output: username:password
3)换行到基本64编码的输出流
如果您不想直接使用数据而宁愿使用流,则可以包装输出流,以便写入此输出流的所有数据将自动进行64位编码。
Path originalPath = Paths.get("c:/temp", "mail.txt"); Path targetPath = Paths.get("c:/temp", "encoded.txt"); Base64.Encoder mimeEncoder = Base64.getMimeEncoder(); try(OutputStream output = Files.newOutputStream(targetPath)){ //Copy the encoded file content to target file Files.copy(originalPath, mimeEncoder.wrap(output)); //Or simply use the encoded output stream OutputStream encodedStrem = mimeEncoder.wrap(output); }