#java #apache #nio #apache-commons
#java #apache #nio #apache-commons
Вопрос:
Надеюсь, кто-нибудь видел это раньше. Я пытаюсь скопировать все содержимое каталога из исходного кода в другой каталог, и для этого я начал использовать метод Commons FileUtils.copyDirectorytoDirectory (File src, File dest). Код довольно прост:
public static void copyDirtoDir(String src, String dest) {
File s = new File(src);
File d = new File(dest);
try {
FileUtils.copyDirectoryToDirectory(s, d);
} catch (IOException e) {
e.printStackTrace();
}
}
Чтобы запустить этот тест в Linux, я запускаю приложение как JAR и передаю строки src и dest из командной строки. Проблема в том, что когда я проверяю результирующий размер каталога после выполнения, обнаруживается огромная разница в размере (при этом скопированный каталог примерно в два раза больше исходного — проверяется с помощью ‘du -sh’).
Затем я просто попробовал с nio.Файловые каналы следующим образом:
public static void copyFile(File in, File out) throws IOException {
FileChannel source = new FileInputStream(in).getChannel();
FileChannel destination = new FileOutputStream(out).getChannel();
source.transferTo(0, source.size(), destination);
source.close();
destination.close();
}
Вызов этого метода для каждого файла внутри каталога. Результирующий размер этого варианта также примерно в два раза превышает размер оригинала. Если я сделаю список содержимого каталогов, они будут одинаковыми.
Есть ли какой-либо отсутствующий параметр или что-то, что могло вызвать эту разницу в размере?
Комментарии:
1. вы уверены, что вы просто не запускали тест дважды, создавая дубликаты (каким-то образом) в dest dir?
2. Может быть, в каталоге есть программная или жесткая ссылка, по которой выполняется операция копирования, а не просто копирование ссылки?
3. @matt b — Я уверен :), @Sven — это звучит возможно, сейчас проверяю…
4. Не связано с программной или жесткой ссылкой. Пропуск их возвращает тот же результат
5. Являются ли файлы правильного размера?
Ответ №1:
Не уверен, что происходит, но вы можете использовать diff для разделения каталогов. Я уверен, что это легко выявит различия.
Комментарии:
1. эта команда не сообщает о различиях. Если я перечислю файлы из обоих, они будут одинаковыми: (
Ответ №2:
Javadoc сообщает, что copyDirectoryToDirectory
копирует исходный каталог и все его содержимое в каталог с тем же именем в указанном каталоге назначения.
Я предполагаю, что, не видя вашей структуры каталогов, это может привести к двойному отображению данных. Есть ли причина, по которой вы не используете простые FileUtils.copyDirectory()?