java8 делает асинхронный ввод / вывод - PullRequest
0 голосов
/ 05 июля 2018

Может кто-нибудь мне помочь. Я новичок в Java и хочу скопировать файл из одного каталога в другой с помощью CompletableFuture или ListenableFuture, но я не знаю, как это сделать.

   public void trackFiles(File source) {
        if (source.exists()) {
            File[] files = source.listFiles();
            for (File file : files) {
                if (file.isDirectory()) {
                    trackFiles(file);
                } else {
                    allFile.add(file);
                }
            }
        } else {
            System.out.println("No such files!");
        }
    }

    public void copyAllFilesRecursive(File source, File destination, CopyOption... options) {
        if (source.isDirectory()) {
            if (!destination.exists()) {
                destination.mkdirs();

            }
        }
        File[] contents = source.listFiles();

        if (contents != null) {
            ArrayList<File> listContents = new ArrayList<>(Arrays.asList(contents));
            listContents.forEach(file -> {
                File newFile = new File(destination.getAbsolutePath() + File.separator + file.getName());
                if (file.isDirectory() && file.exists()) {
                    copyAllFilesRecursive(file, newFile, options);
                } else {
                    try {
                        copyFiles(file, newFile, options);
                    } catch (IOException e) {
                        System.out.println(file + " exists");
                    }
                }
            });
        }
    }

1 Ответ

0 голосов
/ 05 июля 2018

Нет смысла пытаться сделать эту операцию асинхронной.

Если вы хотите более читаемый код, вы должны использовать NIO, например,

public static void copyTree(Path from, Path to, CopyOption... options) throws IOException {
    if(!Files.exists(to)) Files.createDirectories(to);

    Files.walkFileTree(from, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
                                                                       throws IOException {
            return !dir.equals(from)? copy(dir): FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                                                                       throws IOException {
            return copy(file);
        }

        private FileVisitResult copy(Path file) throws IOException {
            Files.copy(file, to.resolve(from.relativize(file)), options);
            return FileVisitResult.CONTINUE;
        }
    });
}

Это скопирует содержимое from в to, например при копировании с foo/bar на baz копируется все в пределах от foo\bar до baz. Если вместо этого вы хотите скопировать каталог from, например, baz\bar создано и все в foo\bar скопировано в baz\bar, используйте

public static void copyTree(Path from, Path to, CopyOption... options) throws IOException {
    from = from.toAbsolutePath();
    Path base = from.getParent();
    if(!Files.exists(to)) Files.createDirectories(to);

    Files.walkFileTree(from, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
                                                                       throws IOException {
            return copy(dir);
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                                                                       throws IOException {
            return copy(file);
        }

        private FileVisitResult copy(Path file) throws IOException {
            Files.copy(file, to.resolve(base.relativize(file)), options);
            return FileVisitResult.CONTINUE;
        }
    });
}

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

public static void copyAllFilesRecursive(File source, File destination,
                                         CopyOption... options)        throws IOException {
    copyTree(source.toPath(), destination.toPath());
}

хотя очень странно объединять тип NIO CopyOption с устаревшим типом IO File одним способом ...

...