Создание копии файла в Android: метод без чтения содержимого

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Создание копии файла в Android – задача несложная. Для версий API 26 и выше можно использовать возможности java.nio.file.Files с методом copy:

Java
Скопировать код
Files.copy(Paths.get(srcPath), Paths.get(destPath), StandardCopyOption.REPLACE_EXISTING);

Если же версия вашего API младше 26, файл можно скопировать, читая его содержимое по байтам с помощью классов FileInputStream и FileOutputStream:

Java
Скопировать код
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);
    }
}
Кинга Идем в IT: пошаговый план для смены профессии

Управление ресурсами: избегайте утечек

Автоматическое закрытие потоков

Для предотвращения утечек памяти рекомендуется использовать конструкцию try-with-resources (доступна начиная с версии API 19+), обеспечивающую автоматическое закрытие потоков:

Java
Скопировать код
try (FileChannel srcChannel = new FileInputStream(src).getChannel();
     FileChannel destChannel = new FileOutputStream(dest).getChannel()) {
    srcChannel.transferTo(0, srcChannel.size(), destChannel);
}

Копирование больших файлов: без лишних забот

При копировании больших файлов рекомендуется использовать метод FileChannel.transferTo. Важно учесть ограничение в 2 ГБ и контролировать процесс копирования, возможно, потребуется циклический вызов метода:

Java
Скопировать код
long position = 0;
long size = srcChannel.size();
while (position < size) {
    position += srcChannel.transferTo(position, size – position, destChannel);
}

Kotlin для упрощения

Kotlin облегчает процесс копирования файлов благодаря функции расширения copyTo. Онa предусматривает возможность перезаписи:

kotlin
Скопировать код
val srcFile = File(srcPath)
val destFile = File(destPath)
srcFile.copyTo(destFile, overwrite = true)

Визуализация

Советы и уловки для идеального копирования файлов

Простое клонирование файла для современных версий Android

В Android API 26+ присутствует удобный метод Files.copy() для клонирования файлов:

Java
Скопировать код
Path copied = Files.copy(sourcePath, destPath);

Рекурсивное копирование директорий

Копирование директорий требует более внимательного подхода. Применяйте Files.walkFileTree для их последовательного просмотра и копирования:

Java
Скопировать код
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;
    }
});

Предварительно проверьте наличие файлов

Перед началом операции копирования осуществите проверку наличия исходного и целевого файлов:

Java
Скопировать код
if (!srcFile.exists()) {
    // "Упс, оказывается, исходного файла не существует!"
}

Полезные материалы