87

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

Adam
  • 35,919
  • 9
  • 100
  • 137
Adam Lee
  • 24,710
  • 51
  • 156
  • 236

4 Answers4

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
Adam
  • 35,919
  • 9
  • 100
  • 137
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

Kevin Bowersox
  • 93,289
  • 19
  • 159
  • 189
  • 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). – jwj Apr 23 '18 at 20:07
  • 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. –  Apr 25 '22 at 17:57
13

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

Pawan
  • 1,183
  • 16
  • 29
  • the problem is that only api 26+ run this... 8% of devices have this version in 2019... so sad. – vinicius gati Oct 03 '19 at 17:58
  • 1
    @viniciusgati `Base64` was added in api level 8, that pretty much means it's supported on 100% of devices in existence. – nitzanj Jan 02 '20 at 12:12
  • 1
    @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. – Andrew T. Jun 03 '20 at 03:56
5

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

Community
  • 1
  • 1
JB Nizet
  • 678,734
  • 91
  • 1,224
  • 1,255
  • 7
    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)](https://medium.com/@rotxed/dex-skys-the-limit-no-65k-methods-is-28e6cb40cf71) 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. – alphanumeric character Nov 10 '14 at 22:36