Java выборочно копирует файлы из zip, чтобы сохранить временную метку файла

Я следовал следующему подходу к распаковке zip с помощью Apache Commons сжимает:

Но поскольку я использую OutputStream и IOUtils.copy(ais, os);(код ниже) для распаковки и копирования файла, метка времени не сохраняется. Есть ли другой способ напрямую скопировать файл из zip, чтобы можно было сохранить временную метку файла.

try (ArchiveInputStream ais =
         asFactory.createArchiveInputStream(
           new BufferedInputStream(
             new FileInputStream(archive)))) {

        System.out.println("Extracting!");
        ArchiveEntry ae;
        while ((ae = ais.getNextEntry()) != null) {
            // check if file needs to be extracted {}
            if (!extract())
                continue;

            if (ae.isDirectory()) {
                File dir = new File(archive.getParentFile(), ae.getName());
                dir.mkdirs();
                continue;
            }

            File f = new File(archive.getParentFile(), ae.getName());
            File parent = f.getParentFile();
            parent.mkdirs();
            try (OutputStream os = new FileOutputStream(f)) {
                IOUtils.copy(ais, os);
                os.close();
            } catch (IOException innerIoe) {
                ...
            }
        }

        ais.close();
        if (!archive.delete()) {
            System.out.printf("Could not remove archive %s%n",
                               archive.getName());
            archive.deleteOnExit();
        }
    } catch (IOException ioe) {
        ...
    }

Обновлено: С помощью приведенного ниже ответа jbx следующие изменения заставят его работать.

IOUtils.copy(ais, os);
os.close();
outFile.setLastModified(entry.getLastModifiedTime().toMillis()); // this line
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете установить атрибут файла lastModifiedTime с помощью NIO. Сделайте это с файлом сразу после того, как вы его запишете (после того, как вы его закроете). Операционная система отметила бы свое время последнего изменения текущим временем в этот момент.

https://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html

Вам нужно будет получить время последнего изменения из zip-файла, поэтому, возможно, с помощью NIO Zip Filesystem Provider` для просмотра и извлечения файлов из архива будет лучше, чем ваш текущий подход (если только используемые вами API-интерфейсы не предоставляют вам ту же информацию).

https://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html

Это сработало. Что я делал неправильно, так это: outFile.setLastModified(entry.getLastModifiedTime().toMillis‌​()); перед строкой: IOUtils.copy(ais, os);. Перемещение его после того, как os.close() сделал свое дело. Ваше утверждение Сделайте это с файлом сразу после того, как вы его запишете (после того, как вы его закроете) было ключевым

tryingToLearn 22.01.2019 10:48

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