Создание копии файла в Android: метод без чтения содержимого
Быстрый ответ
Создание копии файла в Android – задача несложная. Для версий API 26 и выше можно использовать возможности java.nio.file.Files
с методом copy
:
Files.copy(Paths.get(srcPath), Paths.get(destPath), StandardCopyOption.REPLACE_EXISTING);
Если же версия вашего API младше 26, файл можно скопировать, читая его содержимое по байтам с помощью классов FileInputStream и FileOutputStream:
try (InputStream in = new FileInputStream(srcFile); OutputStream out = new FileOutputStream(destFile)) {
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
}
Управление ресурсами: избегайте утечек
Автоматическое закрытие потоков
Для предотвращения утечек памяти рекомендуется использовать конструкцию try-with-resources (доступна начиная с версии API 19+), обеспечивающую автоматическое закрытие потоков:
try (FileChannel srcChannel = new FileInputStream(src).getChannel();
FileChannel destChannel = new FileOutputStream(dest).getChannel()) {
srcChannel.transferTo(0, srcChannel.size(), destChannel);
}
Копирование больших файлов: без лишних забот
При копировании больших файлов рекомендуется использовать метод FileChannel.transferTo
. Важно учесть ограничение в 2 ГБ и контролировать процесс копирования, возможно, потребуется циклический вызов метода:
long position = 0;
long size = srcChannel.size();
while (position < size) {
position += srcChannel.transferTo(position, size – position, destChannel);
}
Kotlin для упрощения
Kotlin облегчает процесс копирования файлов благодаря функции расширения copyTo
. Онa предусматривает возможность перезаписи:
val srcFile = File(srcPath)
val destFile = File(destPath)
srcFile.copyTo(destFile, overwrite = true)
Визуализация
Советы и уловки для идеального копирования файлов
Простое клонирование файла для современных версий Android
В Android API 26+ присутствует удобный метод Files.copy()
для клонирования файлов:
Path copied = Files.copy(sourcePath, destPath);
Рекурсивное копирование директорий
Копирование директорий требует более внимательного подхода. Применяйте Files.walkFileTree
для их последовательного просмотра и копирования:
Files.walkFileTree(srcDir.toPath(), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
return copy(file);
}
private FileVisitResult copy(Path file) throws IOException {
Files.copy(file, targetDir.resolve(srcDir.relativize(file)));
return FileVisitResult.CONTINUE;
}
});
Предварительно проверьте наличие файлов
Перед началом операции копирования осуществите проверку наличия исходного и целевого файлов:
if (!srcFile.exists()) {
// "Упс, оказывается, исходного файла не существует!"
}