POSIX (и, следовательно, Unix) системам разрешено устанавливать максимальную длину пути (то, что вы получаете от File.getPath()
или компонентов пути (последний из которых вы можете получить с File.getName()
). Вы можете Эта проблема возникает из-за длинного имени файла.
В этом случае системный вызов файла open
завершится с ошибкой ENAMETOOLONG
с кодом ошибки .
Однако сообщение «Файл слишком большой» обычно связано с кодом ошибки «EFBIG». Это более вероятно в результате системного вызова write
:
Была предпринята попытка записать файл, размер которого превышает зависящий от реализации максимальный размер файла или ограничение размера файла процесса.
Возможно, файл открывается для добавления, и подразумеваемое значение lseek в конце файла приводит к ошибке EFBIG
.
В конце концов, вы можете попробовать другие способы копирования, если это связано с вашей оперативной памятью.
Также другой вариант может быть, что диск заполнен.
Для копирования файлов существует в основном четыре способа [и оказывается, что потоки - самый быстрый на базовом уровне]:
Копирование с потоками:
private static void copyFileUsingStream(File source, File dest) throws IOException {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} finally {
is.close();
os.close();
}
}
Копирование с классами Java NIO:
private static void copyFileUsingChannel(File source, File dest) throws IOException {
FileChannel sourceChannel = null;
FileChannel destChannel = null;
try {
sourceChannel = new FileInputStream(source).getChannel();
destChannel = new FileOutputStream(dest).getChannel();
destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
}finally{
sourceChannel.close();
destChannel.close();
}
}
Копирование с помощью Apache Commons IO FileUtils:
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
FileUtils.copyFile(source, dest);
}
и ваш Метод с использованием Java 7 и класса Files:
private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
Редактировать 1 :
как предлагается в комментариях, вот три SO-вопроса, которые охватывают проблему и лучше объясняют четыре различных метода копирования:
Спасибо @jww за указание на это