2015-11-19 3 views
2

Я использую этот кодAndroid - Отключение питания после копирования файлов приводит к повреждению файлов

for (Uri fileUri : files) { 
    File destFile = ... 
    InputStream is = getContentResolver().openInputStream(fileUri); 

    FileUtils.copyInputStreamToFile(is, destFile); 
} 

И если пользователь удалить батарею из телефона после этого for цикла, то некоторые файлы (продолжается) искажены ,

Можно ли предотвратить это?

Я попытался скопировать InputStream в временный каталог, а затем использовать

FileUtils.moveFile(temp, destFile); 

для каждого файла, но там была та же самая проблема.

Можно ли как-то закрыть скопированные файлы? Убедитесь, что они успешно скопированы?

+1

Является ли 'FileUtils' классом, который вы написали? В методе 'copyInputStreamToFile()' используются 'flush' и' sync'? В качестве примера см. Метод 'copyToFile()' в строке 190 [этого файла] (https://android.googlesource.com/platform/frameworks/base/+/cd92588/core/java/android/os/FileUtils. Ява). –

+0

Нет. FileUtils - это Apo Commons IO. Спасибо за вашу информацию. Я попробую использовать copyToFile(), который вы предложили. –

+0

Дополнительная информация находится здесь: http://stackoverflow.com/questions/4072878/i-o-concept-flush-vs-sync –

ответ

1

Я решил эту проблему с помощью этого:

FileOutputStream out = new FileOutputStream(filename); 

[...] 

out.flush(); 
out.getFD().sync(); 

из I/O concept flush vs sync

Посмотрите на https://android.googlesource.com/platform/frameworks/base/+/cd92588/core/java/android/os/FileUtils.java и метод copyToFile(InputStream inputStream, File destFile) Это хороший пример того, как это единственный.

Благодаря qbix!