자바(Java)로 프로그램을 작성하다 보면 Base64인코딩/디코딩 코드를 작성할 필요가 있습니다. 이 경우 자바는 다른 언어와는 다르게 표준API상에 관련 API가 없는 것을 알게 됩니다. 그러나 JVM내부적으로 필요한 경우도 있어서 각 JDK별로 별도의 구현체가 존재하는 경우도 있습니다. 예를 들어 썬마이크로시스템(Sun/Oracle)의 JDK의 경우에는 패키지 sun.misc에 BASE64Encoder/BASE64Decoder 구현체가 존재합니다. 이러한 JDK별로 존재하는 구현체를 사용하는 것은 지양해야 하므로 일반적으로 Apache재단의 commons-codec라이브러리를 이용하게 됩니다. 이번 포스팅에서는 해당 라이브러리의 사용법에 대해서 간단하게 알아보도록 하겠습니다.
먼저 관련해서 필요한 라이브러리를 아래와 같이 MAVEN이용해서 추가하거나 다운로드해서 빌드패스에 추가하도록 합니다.
commons-codec
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
commons-io
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
※사실 인코딩 자체는 commons-codec라이브러리만 있으면 수행 할 수 있습니다. 구현상의 편의를 위해 유틸리티 라이브러리로 commons-io을 추가하였습니다.
파일을 Base64 문자열로 변환
public static String fileToBase64String(final File target) throws IOException { BufferedInputStream bis = null; try { bis = new BufferedInputStream(new FileInputStream(target)); return Base64.encodeBase64String(IOUtils.toByteArray(bis)); } finally { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } }
Base64 문자열을 파일로 변환
public static void base64StringToFile(final String encoded, final File output) throws IOException { BufferedOutputStream bos = null; try { output.createNewFile(); bos = new BufferedOutputStream(new FileOutputStream(output)); bos.write(Base64.decodeBase64(encoded)); } finally { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } }
위의 소스코드는 특정 파일을 Base64인코딩하여 문자열로 바꾸고 이를 다시 디코딩하여 파일로 변환하는 코드입니다. 위처럼 단순히 문자열로 바꾸는 것 이외에 URL Safe인코딩(URL이나 파일명등을 인코딩할 경우)타입이나 메일 관련한 MIME인코딩(76문자마다 개행)의 경우 아래의 메소드를 이용해서 인코딩/디코딩을 할 수 있다.
Base64#encodeBase64(final byte[] binaryData, final boolean isChunked, final boolean urlSafe)
위의 메소드에 isChunked의 인자로 true를 지정할 경우 MIME인코딩, urlSafe의 인자로 true를 지정할 경우 URL Safe타입의 인코딩을 수행할 수 있습니다. 필요에 따라서 지정해서 호출하도록 합시다.
Base64구현 관련하여 commons-codec라이브러리에 대해서 소개했습니다만 사실 자바8(Java8)부터 드디어(이제서야) 표준API에 Base64관련 API가 제공되기 시작했습니다. 어쩌면 위의 코드는 어느 사이에 사용되지 않을지도 모르겠습니다.
'Java' 카테고리의 다른 글
apache httpclient 요청 디버깅 (0) | 2014.11.27 |
---|---|
Java8 Base64 Encoder/Decoder (0) | 2014.11.19 |
apache httpclient applcation/json, multipart/mixed 요청 (2) | 2014.10.26 |
Eclipse java Access restriction rt.jar (0) | 2013.12.04 |
Java7 zip 파일 압축 (0) | 2013.11.26 |