base
学习使用Java 8和使用Java 8 api进行base64编码和解码功能的不同方法,以及使用apache commons编解码器的示例。
1.概述
在本文中,您将学习Java 8和其他替代库(例如apache common API Utility)中执行base 64编码和解码技术的不同方法。
2. Java 8 – Base64 API
长时间之后,Java 8作为JDK 8的一部分添加了内置的base64编码和解码功能。
这简化了编码和解码过程,而无需使用其他第三方库。
在Java 8中,我们主要可以使用3种类型的编码和解码功能作为标准。 与之相关的所有类均在java.util.base64包中。
2.1基本或简单类型
2.2 URL编码/解码
2.3 MIME编码/解码
让我们探索所有这些。
3. Java 8 Base64方法
Base64是用于编码和解码的基类。 它有两个静态内部类,分别是Base64.Encoder,Base64.Decoder。
使用以下方法为每种类型获取正确的编码器和解码器。
返回使用基本类型base64编码方案进行解码的Base64.Decoder。
3.2静态Base64.Encoder getEncoder()
返回使用基本类型base64编码方案进行编码的Base64.Encoder。
3.3静态Base64.Decoder getMimeDecoder()
返回使用MIME类型base64解码方案解码的Base64.Decoder。
3.4静态Base64.Encoder getMimeEncoder()
返回使用MIME类型base64编码方案进行编码的Base64.Encoder。
3.5静态Base64.Encoder getMimeEncoder(int lineLength,byte [] lineSeparator)
返回一个Base64.Encoder,该编码使用具有指定行长和行分隔符的MIME类型base64编码方案进行编码。
3.6静态Base64.Decoder getUrlDecoder()
返回一个Base64.Decoder,该解码器使用URL和Filename安全类型base64编码方案进行解码。
3.7静态Base64.Encoder getUrlEncoder()
返回一个Base64.Encoder,它使用URL和Filename安全类型base64编码方案进行编码。
4. Java 8 Base 64简单编码和解码
这是Base64中的一种简单编码技术。
编码的字符串将仅包含这些字符集“ A-Za-z0-9 + /”,并在解码时将换行符视为换行符。 让我们看一下您将清楚理解的示例。
package com.javaprogramto.java8.base64;
import java.util.Base64;
public class SImpleBase64Example {
public static void main(String[] args) {
String originalString = "Welcome to javaprogramto.com \n good day" ;
// create base simple encoder object
Base64.Encoder simpleEncoder = Base64.getEncoder();
// Encoding string using simple encode
String encodedString = simpleEncoder.encodeToString(originalString.getBytes());
System.out.println( "Encoded string : " +encodedString);
// Create base simple decoder object
Base64.Decoder simpleDecoder = Base64.getDecoder();
// Deconding the encoded string using decoder
String decodedString = new String(simpleDecoder.decode(encodedString.getBytes()));
System.out.println( "Decoded String : " +decodedString);
}
}
输出:
Encoded string : V2VsY29tZSB0byBqYXZhcHJvZ3JhbXRvLmNvbSAKIGdvb2QgZGF5
Decoded String : Welcome to javaprogramto.com
good day
如您在输出中看到的,实际的输入字符串具有一个行分隔符。 用于编码。 encodeToString()方法,它具有来自简单编码字符集的字符。
但是,当使用返回字节[]而不是字符串的decode()方法进行解码时。 您需要显式转换为String对象。
最后,遇到行分隔符时,解码的字符串将在下一行显示内容。
5. Java 8 Base64带填充的编码和解码
默认情况下,如果编码的字符串长度不符合所需的长度,则使用'='双等号运算符对填充进行编码。
通常,编码后的字符串应为3的倍数,否则将与= character一起添加。
另一方面,在解码时,所有多余的填充字符都将被丢弃。
如果确实要解码,则可以使用withPadding()进行编码,而无需填充。
withoutPadding ()方法有助于跳过输出的填充。
许多开发人员认为没有填充编码的字符串不能被解码回原始字符串。
但是,这是错误的, Base64.Decode api提供了灵活的回解码功能。
请看下面的示例,以了解有无填充的情况,以及如何将其编码为原始格式。
package com.javaprogramto.java8.base64;
import java.util.Base64;
public class SImpleBase64WithoutPaddingExample {
public static void main(String[] args) {
String originalString = "Welcome to javaprogramto.com" ;
System.out.println( "Original String : " +originalString);
// create base simple encoder object
Base64.Encoder simpleEncoder = Base64.getEncoder();
// Encoding string using simple encode
String encodedString = simpleEncoder.encodeToString(originalString.getBytes());
System.out.println( "Encoded string with padding : " +encodedString);
// encode without padding
Base64.Encoder withoutPaddingEncoder = Base64.getEncoder().withoutPadding();
String encodeWithoutPadding = withoutPaddingEncoder.encodeToString(originalString.getBytes());
System.out.println( "Encoded string without padding : " +encodeWithoutPadding);
// Create base simple decoder object
Base64.Decoder simpleDecoder = Base64.getDecoder();
// Deconding the encoded string using decoder
String decodedString = new String(simpleDecoder.decode(encodeWithoutPadding.getBytes()));
System.out.println( "Decoded String : " +decodedString);
}
}
输出:
Original String : Welcome to javaprogramto.com
Encoded string with padding : V2VsY29tZSB0byBqYXZhcHJvZ3JhbXRvLmNvbQ==
Encoded string without padding : V2VsY29tZSB0byBqYXZhcHJvZ3JhbXRvLmNvbQ
Decoded String : Welcome to javaprogramto.com
6. Java 8 Base64 URL编码和解码
Base64 URL编码器与简单编码器非常相似。 所有字符集都与一个简单的字符集相同,但区别在于是'_'而不是'\' 。
这是允许的完整URL字符'A-Za-z0-9 + _' 。
并且也不会在解码器中添加任何行间距。
使用getUrlEncoder()进行编码,并使用getUrlDecoder()解码来自Base64的URL。
Base64 URL示例:
package com.javaprogramto.java8.base64;
import java.util.Base64;
public class SImpleBase64URLExample {
public static void main(String[] args) {
String originalStringURL = " https://www.google.co.in/imghp?hl=en&tab=wi&authuser=0&ogbl " ;
System.out.println( "Original String : " +originalStringURL);
// create url encoder object
Base64.Encoder simpleEncoder = Base64.getUrlEncoder();
// Encoding string using url encode
String encodedString = simpleEncoder.encodeToString(originalStringURL.getBytes());
System.out.println( "Encoded URL string with padding : " +encodedString);
// encode without padding
Base64.Encoder withoutPaddingEncoder = Base64.getEncoder().withoutPadding();
String encodeWithoutPadding = withoutPaddingEncoder.encodeToString(originalStringURL.getBytes());
System.out.println( "Encoded URL string without padding : " +encodeWithoutPadding);
// Create base simple decoder object
Base64.Decoder simpleDecoder = Base64.getDecoder();
// Deconding the encoded string using decoder
String decodedString = new String(simpleDecoder.decode(encodeWithoutPadding.getBytes()));
System.out.println( "Decoded URL String : " +decodedString);
}
}
输出:
Original String : https: //www.google.co.in/imghp?hl=en&tab=wi&authuser=0&ogbl Original String : https: //www.google.co.in/imghp?hl=en&tab=wi&authuser=0&ogbl Original String : https: //www.google.co.in/imghp?hl=en&tab=wi&authuser=0&ogbl
Encoded URL string with padding : aHR0cHM6Ly93d3cuZ29vZ2xlLmNvLmluL2ltZ2hwP2hsPWVuJnRhYj13aSZhdXRodXNlcj0wJm9nYmw=
Encoded URL string without padding : aHR0cHM6Ly93d3cuZ29vZ2xlLmNvLmluL2ltZ2hwP2hsPWVuJnRhYj13aSZhdXRodXNlcj0wJm9nYmw
Decoded URL String : https: //www.google.co.in/imghp?hl=en&tab=wi&authuser=0&ogbl Decoded URL String : https: //www.google.co.in/imghp?hl=en&tab=wi&authuser=0&ogbl
7. Java 8 Base64 MIME编码和解码
MIME编码是Base64编码和解码的另一种类型。 MIME技术主要用于更多数据,例如ASCII,电子邮件内容附件,音频,视频和需要编码和解码的图像。
使用Base64.getMimeEncoder()进行MIME数据编码,使用Base64.getMimeDecoder()进行MIME数据解码。
按MIME类型编码的内容将分为多行,每行长度不超过76个字符。 每行以回车符结尾,例如\ n或\ r。
package com.javaprogramto.java8.base64;
import java.util.Base64;
import java.util.UUID;
public class SImpleBase64MIMEExample {
public static void main(String[] args) {
// adding random 10 UUID values.
String mimeContent = generateMimeBuffer().toString();
System.out.println( "Original mime buffer length: " + mimeContent.length());
// Base64 MIME Encode
Base64.Encoder mimeEncode = Base64.getMimeEncoder();
String mimeEncodedStr = mimeEncode.encodeToString(mimeContent.getBytes());
System.out.println( "MIME encoded string : " + mimeEncodedStr);
// Base64 MIME Decode
Base64.Decoder mimeDecode = Base64.getMimeDecoder();
String mimeDecodedStr = new String(mimeDecode.decode(mimeEncodedStr.getBytes()));
System.out.println( "MIME decoded string length: " + mimeDecodedStr.length());
}
/**
* Genreates random 10 UUID numbers and adds to the StringBuffer.
*
* @return
*/
private static StringBuffer generateMimeBuffer() {
StringBuffer buffer = new StringBuffer();
for ( int i = 0 ; i < 10 ; i++) {
buffer.append(UUID.randomUUID());
}
return buffer;
}
}
输出:
package com.javaprogramto.java8.base64;
Original mime buffer length: 360
MIME encoded string : N2Y1Njk5MjEtMjg1OC00YTBhLWFlMDgtYTJhMTIzMDkxOTY5OWNjNWM3OWYtZGQ5My00OTE4LWIz
N2MtYmNlM2I1MzA2MDk0ODdhZTUwNDgtODBlMi00YTUxLThjMGEtZDY4M2Y1YWZmMjc1OWI2YWU4
ZDMtZTE0Ni00ZTQzLWE4MWItMTllYTZiYzE0MDEwYzQ1YjE3MzQtZTM1Ni00NmU5LThhOWMtNDlk
ODA2NGQ4YTU1YzgwYzIxZTUtZDI1Zi00YzMyLTliMzEtY2ViNmU3OGIyNWU3ZDcxOWI4OGYtNzY2
OC00ZGExLThiZGYtMDlmOGM4MTk2MzkxMjI3MTllZjQtMTVkZC00YTY1LTgxZmQtYWUyYzAxYjI1
MjAyYjM2ZDY4ZmItODkxMS00ZGY1LWJiZmEtM2YwMDhiYmZkMzQ5NGIwZmUyOTUtNzMyOC00Nzgz
LThmOTEtYTI5ZWMwM2E4NWFk
MIME decoded string length: 360
8.使用Apache Commons API进行编码和解码
首先,您需要如下所示将依赖项添加到pom.xml文件或将commons-codec.jar文件添加到项目。
package com.javaprogramto.java8.base64;
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version> 1.10 </version>
</dependency>
由于安全性是高优先级,因此建议始终使用最新版本的commons编解码器。
使用org.apache.commons.codec.binary.Base64类方法可进行编码和解码,并且它具有带有不同参数的各种构造函数。 其中大多数看起来非常有用。
Base64():创建用于解码(所有模式)和以URL不安全模式编码的Base64编解码器。
Base64(boolean urlSafe):创建用于在给定URL安全模式下解码(所有模式)和编码的Base64编解码器。
Base64(int lineLength):创建用于解码(所有模式)和URL不安全模式下编码的Base64编解码器。
Base64(int lineLength,byte [] lineSeparator):创建一个Base64编解码器,用于在URL不安全模式下进行解码(所有模式)和编码。
Base64(int lineLength,byte [] lineSeparator,boolean urlSafe):创建一个Base64编解码器,用于解码(所有模式)和URL不安全模式下的编码。
Apache Commons Codec Bas64示例:
package com.javaprogramto.java8.base64;
package com.javaprogramto.java8.base64.apache;
import org.apache.commons.codec.binary.Base64;
public class ApacheCommonsCodecBase64 {
public static void main(String[] args) {
String originalInput = "test input for apache commons codec" ;
Base64 base64 = new Base64();
// Commons codec encoding
String encodedString = new String(base64.encode(originalInput.getBytes()));
System.out.println( "Encoded string : " +encodedString);
// Commons codec decoding
String decodedString = new String(base64.decode(encodedString.getBytes()));
System.out.println( "Decoded string : " +decodedString);
}
}
输出:
package com.javaprogramto.java8.base64;
Encoded string : dGVzdCBpbnB1dCBmb3IgYXBhY2hlIGNvbW1vbnMgY29kZWM=
Decoded string : test input for apache commons codec
并且apache commons编解码器api提供了用于解码和编码的静态方法。
Base64.encodeBase64()和Base64.decodeBase64()示例:
package com.javaprogramto.java8.base64;
package com.javaprogramto.java8.base64.apache;
import org.apache.commons.codec.binary.Base64;
public class ApacheCommonsCodecBase64Static {
public static void main(String[] args) {
String originalInput = "Test commons codec with static methods" ;
// Commons codec encoding with Base64.encodeBase64()
String encodedString = new String(Base64.encodeBase64(originalInput.getBytes()));
System.out.println( "Encoded string : " +encodedString);
// Commons codec decoding with Base64.decodeBase64()
String decodedString = new String(Base64.decodeBase64(encodedString.getBytes()));
System.out.println( "Decoded string : " +decodedString);
}
}
输出:
package com.javaprogramto.java8.base64;
Encoded string : VGVzdCBjb21tb25zIGNvZGVjIHdpdGggc3RhdGljIG1ldGhvZHM=
Decoded string : Test commons codec with static methods Decoded string : Test commons codec with
使用isChunked参数并将其传递为true,然后它将编码的字符串分成多行,每行包含76个字符。
9.结论
在本文中,您已深入了解Java 8 Base64和有关如何编码和解码的apache commons编解码器api 。
和往常一样,所有示例都在GitHub上进行。
翻译自: https://www.javacodegeeks.com/2020/09/java-8-base64-encoding-and-decoding-with-examples.html
base