Как извлечь информацию из XML-файла в zip-архиве в строку Java

Прямо сейчас я борюсь с файлами, потоками, буферами чтения и записи.

Итак, у меня есть zipFile, содержащий XML-файл. Моя цель — восстановить информацию XML в строку.

Прямо сейчас мой код выглядит так:

 byte[] buffer = new byte[2048];
        String outpath = "";

        // open the zip file stream
        try(InputStream theFile = new FileInputStream(TEST_ZIP);
        ZipInputStream stream = new ZipInputStream(theFile)){

            ZipEntry entry;
            while((entry = stream.getNextEntry())!=null) {

                // Once we get the entry from the stream, the stream is
                // positioned read to read the raw data, and we keep
                // reading until read returns 0 or less.
                outpath = DOSSIER + "/" + entry.getName();

                try (FileOutputStream output = new FileOutputStream(outpath)) {
                    int len = 0;
                    while ((len = stream.read(buffer)) > 0) {
                        output.write(buffer, 0, len);
                    }
                }
            }
        }

        var file = new File(outpath);
        String content = getContentFromFile(file);
        file.delete();

Метод getCONtentFromFile следующий:

 private static String getContentFromFile(File file) {
        String content = new String();
        if (file.exists()) {
            try (FileReader fileReader = new FileReader(file);
                 BufferedReader bufferedReader = new BufferedReader(fileReader)) {
                String linea;
                while ((linea = bufferedReader.readLine()) != null) {
                    content = content + linea;
                }

            } catch (IOException e) {
                System.out.println("Erreur lors de la lecture du fichier." + e.getMessage());
            }
        } else {
            System.out.println("Le fichier n'existe pas.");
        }
        return content;
    }

Код работает, но мне интересно, есть ли более простой/лучший способ сделать это извлечение.

Обратите внимание, что нет смысла копировать запись ZIP в файл, а затем читать его. Вы можете просто прочитать строку из записи ZIP напрямую. Кроме того, если вы знаете имя записи XML, рассмотрите возможность использования ZipFile , чтобы вы могли просто получить ZipEntry напрямую. Альтернативой ZipFile является Поставщик файловой системы ZIP (который позволит вам использовать Files.readString(...)).

Slaw 25.03.2024 11:42

Кроме того, входной поток указывает, что он достиг EOF, возвращая -1 из read, а не 0.

Slaw 25.03.2024 11:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, это много дополнительной работы. Ваш вопрос подразумевает, что в zip-файле есть только одна запись, поэтому вы можете просто прочитать эту запись напрямую:

byte[] bytes;
try (ZipFile zipFile = new ZipFile(TEST_ZIP);
     InputStream stream = zipFile.getInputStream(
        zipFile.stream().findFirst().orElseThrow())) {

    bytes = stream.readAllBytes();
}

String content = new String(bytes, StandardCharsets.UTF_8);

Не нужно записывать байты в отдельный файл.

Другие вопросы по теме