Apache Commons Codec (TM) software provides implementations of common encoders and decoders
such as Base64, Hex, Phonetic and URLs.
Impetus
Codec was formed as an attempt to focus development effort on one
definitive implementation of the Base64 encoder. At the time of
Codec's proposal, there were approximately 34 different Java
classes that dealt with Base64 encoding spread over the
Foundation's CVS repository. Developers in the Jakarta Tomcat
project had implemented an original version of the Base64 codec
which had been copied by the Commons HttpClient and Apache XML
project's XML-RPC subproject. After almost one year, the two
forked versions of Base64 had significantly diverged from one
another. XML-RPC had applied numerous fixes and patches which
were not applied to the Commons HttpClient Base64. Different
subprojects had differing implementations at various levels
of compliance with the
RFC 2045.Out of that confusing duplication of effort sprang this simple
attempt to encourage code reuse among various projects. While
this package contains a abstract framework for the creation of
encoders and decoders, Codec itself is primarily focused on
providing functional utilities for working with common encodings.
Chunking Base64 binary data in Java
Chunking Base64 binary data in Java
I’m not an expert but it seems to me that the different methods to encode as Base64 a *binary* stream exposed by Apache Commons don’t chunk for binary inputs or don’t chunk at all, in spite of what their documentation states.
So let me write here a little snippet, which uses guava-libraries, for an alreadygetBytes()
-ed string.private static String b64eChunk(String mstring) { String encodedText = Base64.encodeBase64String(mstring.getBytes()); String myOutput = ""; for (String substring : Splitter.fixedLength(76).split(encodedText)) { myOutput += substring + "\n"; } return myOutput.substring(0, myOutput.length() - 1); }
Credits for the guava part: Cowan.
2 responses to “Chunking Base64 binary data in Java”
String building using concatenation is not efficient. You should a StringBuilder instead. But even better, in this example you’re joining strings together, so you can use Guava’s Joiner:
return Joiner.on(‘\n’).join(Splitter.fixedLength(76).split(encodedText));
Also, calling getBytes() on String is usually wrong as it uses the platform default character encoding, which means you get different results on different platforms. You usually want getBytes(Charsets.UTF_8)).
Thanks. Perhaps deleting this post won’t be a bad idea because after publishing it I’ve learned a few things about Apache Commons.