Which Java library provides base64 encoding/decoding? [duplicate]
Asked Answered
Y

4

87

I am wondering which library to use for base64 encoding/decoding? I need this functionality be stable enough for production use.

Yepez answered 19/1, 2013 at 10:2 Comment(1)
You could do a search before asking. Just google 'java base64'.Pterous
G
295

Java 9

Use the Java 8 solution. Note DatatypeConverter can still be used, but it is now within the java.xml.bind module which will need to be included.

module org.example.foo {
    requires java.xml.bind;
}

Java 8

Java 8 now provides java.util.Base64 for encoding and decoding base64.

Encoding

byte[] message = "hello world".getBytes(StandardCharsets.UTF_8);
String encoded = Base64.getEncoder().encodeToString(message);
System.out.println(encoded);
// => aGVsbG8gd29ybGQ=

Decoding

byte[] decoded = Base64.getDecoder().decode("aGVsbG8gd29ybGQ=");
System.out.println(new String(decoded, StandardCharsets.UTF_8));
// => hello world

Java 6 and 7

Since Java 6 the lesser known class javax.xml.bind.DatatypeConverter can be used. This is part of the JRE, no extra libraries required.

Encoding

byte[] message = "hello world".getBytes("UTF-8");
String encoded = DatatypeConverter.printBase64Binary(message);
System.out.println(encoded);
// => aGVsbG8gd29ybGQ=  

Decoding

byte[] decoded = DatatypeConverter.parseBase64Binary("aGVsbG8gd29ybGQ=");
System.out.println(new String(decoded, "UTF-8"));
// => hello world
Groom answered 19/1, 2013 at 10:19 Comment(4)
I used so far the Base64 class, but now I had to run one application with Java 7. I didn't know the DatatypeConverter class so far. Thanks.Malita
DatatypeConverter won't work out of the box Java 9Calci
thanks for java 7 solution - can't believe i still needed that!!Monserratemonsieur
parseBase64Binary does not work for data larger than 64k ? what to use in that case(being using java 7 only)Flexible
R
16

Within Apache Commons, commons-codec-1.7.jar contains a Base64 class which can be used to encode.

Via Maven:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>20041127.091804</version>
</dependency>

Direct Download

Ratline answered 19/1, 2013 at 10:3 Comment(2)
Apache Commons does indeed provide a viable Base64 decoder one can use. You might especially want to use this for Java versions earlier than 1.8, but there are much, much newer version of the library that can be used. As of this writing you could use 1.11 which is much newer than 20041127.091804 (referenced above).Neoteric
This is what I use since it works in Java 7. Just want to point this out to people looking for a solution that works with a lower version of Java.Determination
A
13

If you're an Android developer you can use android.util.Base64 class for this purpose.

Anastase answered 26/3, 2015 at 18:29 Comment(3)
the problem is that only api 26+ run this... 8% of devices have this version in 2019... so sad.Toombs
@viniciusgati Base64 was added in api level 8, that pretty much means it's supported on 100% of devices in existence.Offutt
@viniciusgati note that Android has 2 Base64 classes: android.util.Base64 (since API 8) and java.util.Base64 (since API 26). Be careful with the package name when importing it.Myrna
K
5

Guava also has Base64 (among other encodings and incredibly useful stuff)

Kozlowski answered 19/1, 2013 at 10:14 Comment(1)
Guava is also 22k methods, which might not be a big deal for you unless you are importing a lot of other libraries as well. I recently hit this lovely wall myself (65k method limit on DEX) and after removing everything I didn't need from google play, I was only 100 methods under the limit. However, after removing guava, I regained roughly 22k methods.Prostrate

© 2022 - 2024 — McMap. All rights reserved.