#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 Спасибо, вы правы.