Java 파일을 바이너리 스트링으로, 바이너리 스트링을 파일로 변환 / 파일 전송

2017. 9. 28. 10:22language/java


Java 파일을 바이너리 스트링으로, 바이너리 스트링을 파일로 변환

 

 

File to Binary String, Binary String to File

 

 

 

파일을 다른 곳으로 전송해 주어야 할 경우가 생겼다.

 

파일을 전송하는 방법에는 여러가지가 있다.

 

소켓을 사용하거나 http 통신을 사용하거나 ftp를 사용하거나 등등...

 

파일을 바이너리 형태로 만들어 보내고 사용자는 전달받은 바이너리 문자열을 다시 파일로 변환해야 한다.

 

필자는 http 통신을 사용하여 호출한 클라이언트에게 바이너리 문자열을 제공하고(Restful 방식으로 json 또는 text 방식으로 제공하였다. Spring messageConverters 를 사용함) 클라이언트는 전달받은 바이너리 문자열을 다시 파일로 만들어 사용할 수 있도록 제공했다.

 



 


Http 통신에 관련한 내용은 다음 포스팅을 참고하면 된다.

Java HttpUrlConnection 으로 통신하기 링크

본 포스팅과 위 링크의 포스팅을 같이 본다면 Http 통신을 활용하여 파일을 주고 받을 수 있다.


 

 

 

여러 라이브러리를 사용하여 더 편하게 만들 수 있지만 최소한의 라이브러리를 사용하여 기본에 충실하여 작업해 보았다.

 

이 포스팅은 실제로 전송하는 부분을 제외한 file을 binary 문자열로 변환하고 또 그 반대로 변환하는 방법에 대해 기술하였다.

 

 

 

필요한 라이브러리 : commons-codec-1.9.jar

 

 

 

파일객체를 바이너리 스트링으로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * 파일을 바이너리 스트링으로 변경
 *
 * @param file
 * @return
 */
public static String fileToBinary(File file) {
    String out = new String();
    FileInputStream fis = null;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
 
    try {
        fis = new FileInputStream(file);
    } catch (FileNotFoundException e) {
        System.out.println("Exception position : FileUtil - fileToString(File file)");
    }
 
    int len = 0;
    byte[] buf = new byte[1024];
    try {
        while ((len = fis.read(buf)) != -1) {
            baos.write(buf, 0, len);
        }
 
        byte[] fileArray = baos.toByteArray();
        out = new String(base64Enc(fileArray));
 
        fis.close();
        baos.close();
    } catch (IOException e) {
        System.out.println("Exception position : FileUtil - fileToString(File file)");
    }
 
    return out;
}
 
public static byte[] base64Enc(byte[] buffer) {
    return Base64.encodeBase64(buffer);
}
cs

7# : 파일을 바이너리 스트링으로 변환하는 함수이다.

13# : 파일객체를 FileInputStream으로 생성한다.

21# ~ 23# : FileInputStream을 ByteArrayOutputStream에 쓴다.

25# : ByteArrayOutputStream 를 ByteArray 로 캐스팅한다.

26# : 캐스팅 된 ByteArray를 Base64 로 인코딩한 후 String 로 캐스팅한다.

 



 

바이너리 스트링을 파일로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
 * 바이너리 스트링을 파일로 변환
 *
 * @param binaryFile
 * @param filePath
 * @param fileName 
 * @return
 */
public static File binaryToFile(String binaryFile, String filePath, String fileName) {
    if ((binaryFile == null || "".equals(binaryFile)) || (filePath == null || "".equals(filePath))
            || (fileName == null || "".equals(fileName))) { return null; }
 
    FileOutputStream fos = null;
 
    File fileDir = new File(filePath);
    if (!fileDir.exists()) {
        fileDir.mkdirs();
    }
 
    File destFile = new File(filePath + fileName);
 
    byte[] buff = binaryFile.getBytes();
    String toStr = new String(buff);
    byte[] b64dec = base64Dec(toStr);
 
    try {
        fos = new FileOutputStream(destFile);
        fos.write(b64dec);
        fos.close();
    } catch (IOException e) {
        System.out.println("Exception position : FileUtil - binaryToFile(String binaryFile, String filePath, String fileName)");
    }
 
    return destFile;
}
cs

8# : 바이너리 스트링을 파일로 변환하는 함수이다.

15# ~ 18# : 파일을 저장할 경로가 없으면 만들어 준다.

20# : 파일경로와 파일명을 합치고 파일 객체를 만든다.

22# ~ 24# : Base64로 인코딩된 바이너리 스트링을 Base64로 디코딩한 후 String 로 캐스팅한다.

26# ~ 32# : 바이너리 스트링을 생성한 파일객체에 써서 파일로 만든다.