В Java, используя PKZIP, как сжимать и распаковывать XML файл без создания файла / временного файла? - PullRequest
0 голосов
/ 05 мая 2020

Я написал следующий код. Из MQ мы получили файл XML в сжатом формате PKZIP. Мы распаковываем этот файл, и после завершения обработки обновленный XML файл будет снова сжат с помощью PKZIP, а затем опубликован sh в MQ. Но мы не хотим создавать здесь какой-либо файл или временный файл. Как мы можем этого добиться? Я написал следующий код, но он использует временный файл.

public static String decompress(byte[] data) {
        String decompressedData = null;
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
        ZipInputStream zipInputStream = new ZipInputStream(byteArrayInputStream);

        try {
            ZipEntry zipEntry = zipInputStream.getNextEntry();

            if (zipEntry != null) {

                if (zipEntry.isDirectory()) {
                    log.error("Error its zipped folder not file {} ", zipEntry.getName());
                } else {
                    File temp = File.createTempFile(File.separator + "tempFile", "");

                    if (temp != null) {
                        temp.deleteOnExit();
                        FileOutputStream fileOutputStream = new FileOutputStream(temp);

                        byte[] buffer = new byte[BUFFER_SIZE];
                        int len;
                        while ((len = zipInputStream.read(buffer)) > 0) {
                            fileOutputStream.write(buffer, 0, len);
                        }

                        BufferedReader bufferedReader = new BufferedReader(new FileReader(temp));
                        decompressedData = bufferedReader.lines().collect(Collectors.joining());

                        if (bufferedReader != null) {
                            bufferedReader.close();
                        }

                        if (fileOutputStream != null) {
                            fileOutputStream.close();
                        }
                    }
                }

                zipInputStream.closeEntry();
            }

            return decompressedData;
        } catch (Exception e) {
            log.error("Failed to close zipInputStream {} ", e.getMessage());
            return null;
        } finally {
            try {
                if (zipInputStream != null) {
                    zipInputStream.close();
                }

                if (byteArrayInputStream != null) {
                    byteArrayInputStream.close();
                }
            } catch (IOException e) {
                log.error("Failed to close zipOutputStream {}", e.getMessage());
            }
        }
    }

publi c stati c byte [] compress (String messageId, String sr c) {ZipOutputStream zipOutputStream = null;

    try {
        File temp = File.createTempFile(File.separator + messageId, ".xml");

        if (temp != null) {
            temp.deleteOnExit();
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(temp));

            if (bufferedWriter != null) {
                bufferedWriter.write(src);
                bufferedWriter.close();
            }

            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            FileInputStream fileInputStream = new FileInputStream(temp);
            zipOutputStream = new ZipOutputStream(byteArrayOutputStream);

            byte[] buf = new byte[BUFFER_SIZE];
            int len;
            zipOutputStream.putNextEntry(new ZipEntry(messageId + ".xml"));

            while ((len = fileInputStream.read(buf)) > 0) {
                zipOutputStream.write(buf, 0, len);
            }

            zipOutputStream.closeEntry();
            zipOutputStream.finish();
            return byteArrayOutputStream.toByteArray();
        }
    } catch (Exception e) {
        log.error("Failed to compress data with an error {} ", e.getMessage());
        return null;
    } finally {
        try {
            if (zipOutputStream != null) {
                zipOutputStream.close();
            }
        } catch (IOException e) {
            log.error("Failed to close zipOutputStream {}", e.getMessage());
        }
    }

    return null;
}
...