base64 인코딩 처리 대용량 파일

5400 단어 base64
프로젝트를 할 때 파일을base64 인코딩으로 변환해서 파일에 저장해야 하는 경우를 만났습니다.
파일을 base64 인코딩으로 바꾸는 것은 파일을 메모리에 읽고 base64 인코딩을 해서 파일로 출력합니다.코드 입력:
1
2
3
4
5
6
7
8
9
10 FileInputStream stream =  new   FileInputStream( "D:\\ \\ - 4 .pdf" );       ByteArrayOutputStream  out   new   ByteArrayOutputStream(1024);       byte [] b =  new   byte [1024];       int   n;       while   ((n = stream.read(b)) != -1) {           out .write(b, 0, n);       }       stream.close();       out .close();       System. out .println( new   String(Base64.encodeBase64( out .toByteArray())));   
그러나 큰 파일은 base64 인코딩을 할 때 OOM(OOM은 out of memory의 약칭으로 메모리 넘침)을 만나게 된다.
OOM이 생기는 이유:
  • 파일이 너무 커서 메모리
  • 를 초과했습니다.
  • 파일은 메모리에 정상적으로 읽을 수 있다.base64 인코딩된 파일은 원래의 파일보다 1/3 크기 때문에 인코딩하는 과정에서 메모리를 초과한다
  • 3개의 일반 문자를 4개의base64 인코딩 문자로 변환할 수 있기 때문에 3의 공배수를 버퍼 크기로 사용합니다.
    따라서 큰 파일을base64 인코딩할 때 세그먼트 인코딩을 사용하여 출력할 수 있다.코드 입력:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18 // base64   www.1b23.com          ByteArrayOutputStream os1 =  new   ByteArrayOutputStream();          InputStream file1 =  new   FileInputStream( "D:\\ \\ - 4 .pdf" );          byte [] byteBuf =  new   byte [3 * 1024 * 1024];          byte [] base64ByteBuf;          int   count1;  //          while   ((count1 = file1.read(byteBuf)) != -1) {              if   (count1 != byteBuf.length) { // 3*1000, , byteBuf                  byte [] copy = Arrays.copyOf(byteBuf, count1);  // byteBuf                  base64ByteBuf = Base64.encodeBase64(copy);  //              else   {                  base64ByteBuf = Base64.encodeBase64(byteBuf);              }              os1.write(base64ByteBuf, 0, base64ByteBuf.length);              os1.flush();          }          file1.close();          System. out .println(os1.toString());
    상기 코드는 인코딩된 데이터를 컨트롤러에 출력합니다.사실 가장 좋은 것은 파일을 세그먼트로 인코딩하고 세그먼트로 출력하는 것이다. 이렇게 하면 파일이 아무리 크더라도 인코딩할 수 있고 OOM이 되지 않는다.다음은 txt 문서로 파일을 출력하는 것입니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17 ByteArrayOutputStream os1 =  new   ByteArrayOutputStream();         InputStream file1 =  new   FileInputStream( "D:\\ \\ - 4 .pdf" );         byte [] byteBuf =  new   byte [3 * 1024 * 1024];         byte [] base64ByteBuf;         int   count1;  //         File file =  new   File( "D:\\1.txt" );         while   ((count1 = file1.read(byteBuf)) != -1) {             if   (count1 != byteBuf.length) { // 3*1000, , byteBuf                 byte [] copy = Arrays.copyOf(byteBuf, count1);  // byteBuf                 base64ByteBuf = Base64.encodeBase64(copy);  //             else   {                 base64ByteBuf = Base64.encodeBase64(byteBuf);             }             FileUtils.writeByteArrayToFile(file, base64ByteBuf,  true );  // ,             os1.flush();         }         file1.close();

    좋은 웹페이지 즐겨찾기