Копирование файлов из одного каталога в другой с помощью потоков

#java #apache-commons #java-threads #fileutils

#java #apache-commons #java-потоки #fileutils

Вопрос:

Я пытаюсь скопировать файлы из одного каталога в другой.

Но поскольку мне приходится копировать их одновременно, я подумал, что было бы неплохо использовать потоки, чтобы мое программное обеспечение не зависало при копировании.

Проблема в том, что потоки должны быть закрыты (вручную), и я не знаю, какой обратный вызов, на который я могу подписаться, чтобы знать, когда завершается процесс копирования.

Для выполнения задачи копирования я использую библиотеку Java apache.commons.io.FileUtils , используя в основном функцию copyFileToDirectory

И мой код выглядит как:

 //Thread to copy files from one place to another
    public void CopyFileFromTo(String file, String fromDirectoryName, String destinationDirectoryName) throws IOException
    {
        //TODO: Establish when the thread has ended, no callbacks for CopyFileToDirectory? :(
        //Copy from file to directory
        Thread t = new Thread(new Runnable()
        {
            @Override
            public void run()
            {                   
            Path src = Paths.get(fromDirectoryName "\" file);
            Path dest = Paths.get(destinationDirectoryName);
            try {
                FileUtils.copyFileToDirectory(src.toFile(),dest.toFile());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    t.start();
}
  

Комментарии:

1. Проблема в том, что потоки должны быть закрыты (вручную) : где вы это прочитали? Они не должны. Кстати, в потоке нет никакого метода close ().

2. Это выглядит нормально. Поток завершится, когда завершится выполнение метода run(). Но я не думаю, что вы получите какую-либо выгоду, копируя несколько файлов параллельно (это, вероятно, даже будет иметь неблагоприятный эффект).

3. Также ваш подход здесь неверен. Прежде всего, вы используете не потоки, а отдельный поток для каждого копируемого файла. Это не очень хорошо с точки зрения производительности, так как вы будете создавать новый поток для каждого вызова этого метода. Кроме того, при использовании runnable у вас нет возможности узнать, было ли действие копирования успешным или неудачным. Я предлагаю вам использовать комбинацию Вызываемый / будущий вместе с объединенной службой исполнителя.

4. Если вы хотите, чтобы ваш код работал на всех платформах, используйте Paths.get(fromDirectoryName, file) вместо жесткого кодирования "\" . Кроме того, для этого вам не нужен Apache Commons; просто используйте Files.copy(src, dest.resolve(file)); .

5. Спасибо за все комментарии. Итак, я неправильно понял, как работают потоки JB Nizet, я предполагал, что потоки представляют собой бесконечный цикл, который ДОЛЖЕН завершаться (с условными обозначениями или просто return). Но все еще возникают вопросы: неплатнюдай, почему параллельные задачи будут иметь неблагоприятный эффект? @Aris_Kortex если я использую один поток для каждого вызова, это не использует потоки? почему? Я также попробую комбинации Callable / Future, мне нравится подход (как насчет CompletableFuture?). VGR Спасибо, вы правы.