Распакуйте zip и конвертируйте в базу 64 каждого файла - PullRequest
1 голос
/ 04 мая 2020

Я читаю список вложений от системы, которая возвращает вложенный документ в виде строки в кодировке Base 64 в виде почтового индекса, и моя цель - получить строку в кодировке Base 64 для каждого вложенного документа. Примечание: - Я пытаюсь описать код ниже, где я распаковываю zip и пишу в моей локальной файловой системе. , Но в действительности я хотел получить формат base 64 для каждого файла без записи файла в локальной файловой системе.

public class UnzipUtility {
      private static final int BUFFER_SIZE = 4096;

         private static void extractFile(ZipInputStream zipIn, ZipEntry entry) throws IOException {


            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/Project/"+File.separator+entry.getName()));
            byte[] bytesIn = new byte[BUFFER_SIZE];
            System.out.println("File Name  "+entry.getName());
            int read = 0;
            while ((read = zipIn.read(bytesIn)) != -1) {
                //Hear I dont not want to write the output stream insted I want to get the base64 data for each file.
              bos.write(bytesIn);
            }
            bos.close();
        }
     public static void main(String[] args) throws IOException {
     String attachmentVariable="zip base 64 data"
          byte[] bytedata = attachmentVariable.getBytes("UTF-8");
         byte[] valueDecoded = Base64.decodeBase64(bytedata);
         ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(valueDecoded));
         ZipEntry entry = zipIn.getNextEntry();

            // iterates over entries in the zip file
             while (entry != null) {                    extractFile(zipIn,entry);
                    zipIn.closeEntry();
                    entry = zipIn.getNextEntry();


          }       

        }
}

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Итак, у вас есть строка в кодировке Base64 с zip-файлом, и вы хотите Map<String, String>, где ключ - это имя записи в формате zip, а значение - кодированный код Base64.

In Java 9+ , это легко сделать так:

String base64ZipFile = "zip base 64 data";
Map<String, String> base64Entries = new LinkedHashMap<>();
try (ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(base64ZipFile)))) {
    Encoder encoder = Base64.getEncoder();
    for (ZipEntry entry; (entry = zipIn.getNextEntry()) != null; ) {
        base64Entries.put(entry.getName(), encoder.encodeToString(zipIn.readAllBytes()));
    }
}
0 голосов
/ 04 мая 2020

Для кодирования Base64 данных во время их записи в OutputStream используйте метод Encoder.wrap(OutputStream os).

По умолчанию BufferedOutputStream будет используйте 8192-байтовый буфер, поэтому если вы увеличите BUFFER_SIZE до 8192, то вам не понадобятся BufferedOutputStream.

. Вам следует использовать try-with-resources , и более новый API NIO.2.

Это означает, что ваш код должен быть:

private static final int BUFFER_SIZE = 8192;

private static void extractFile(ZipInputStream zipIn, ZipEntry entry) throws IOException {
    try ( OutputStream fos = Files.newOutputStream(Paths.get("D:/Project", entry.getName()));
          OutputStream b64os = Base64.getEncoder().wrap(fos); ) {
        System.out.println("File Name  " + entry.getName());
        byte[] buf = new byte[BUFFER_SIZE];
        for (int len = 0; (len = zipIn.read(buf)) != -1; ) {
            b64os.write(buf, 0, len);
        }
    }
}
...