Спасение временного zip-файла с помощью Java FileSystem - PullRequest
0 голосов
/ 27 сентября 2018

Я столкнулся с неожиданным случаем при создании zip-файла с использованием Java FileSystem API, где на диске не хватило места в процессе создания файла.

Из-за ошибки кодирования исходные файлыгде удален, хотя zip-файл не удалось создать.Я сохранил tmp-файл с сервера, и мне интересно, могу ли я использовать FileSystem API для спасения данных путем загрузки временного файла и завершения записи.

Код, используемый для записи zipфайл выглядит так:

    final Map<String, String> env = new HashMap<>();
    env.put("create", "true");
    final String zipArchiveFilename = System.currentTimeMillis() + ".zip";
    final URI uri = URI.create("jar:file:" + zipDir.getAbsolutePath() + "/" + zipArchiveFilename);
    final List<Path> files = ...;

    try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
        for (Path file : files) {
            Files.copy(file, zipfs.getPath(file.toFile().getAbsolutePath().replace(dir.getAbsolutePath(), "")), StandardCopyOption.REPLACE_EXISTING);
        }
    } catch (IOException e) {
        Logger.error("Failed to create zip file:", e);
    }

1 Ответ

0 голосов
/ 27 сентября 2018

Это можно попробовать следующим образом:

    Path path = Paths.get("C:\\Users\\... .zip");
    final URI uri = URI.create("jar:" + path.toUri().toString());

    Map<String, Object> env = new HashMap<>();
    try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
        Path root = zipfs.getPath("/");
        final Path targetDir = Paths.get("C:/Users/Joop/limbo");
        Files.createDirectories(targetDir);
        final AtomicInteger fno = new AtomicInteger();
        Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                System.out.println("Failed: " + file);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                String name = fno.incrementAndGet() + "-"
                        + file.getFileName().toString().replaceAll("[^-.\\w]+", "");
                Path targetFile = targetDir.resolve(name);
                System.out.println("+ " + file + " - " + targetFile);
                Files.copy(file, targetFile, StandardCopyOption.REPLACE_EXISTING);
                return FileVisitResult.CONTINUE;
            }

        });
    }

URI, который я взял не из файла, а из File.toURI, чтобы избавиться от обратной косой черты в Windows.

имя файла может быть повреждено или иметь неправильную кодировку, следовательно, преобразование имени файла.

Я не уверен, подойдет ли файловая система zip.

...