2013-07-04 5 views
2

Для моего приложения я копирую файлы из папки «Источник в папку назначения» для дальнейшей обработки изображений. Я Попытка скопировать файл jpg из src в папку dst. Функция , похоже, работает, но я все еще получаю эту ошибку IOException. Может ли кто-нибудь пролить свет на то, почему close() будет терпеть неудачу?IOException: closed failed on FileOutputStream

public static void copyPicture(String src, String dst) { 

    File pic = null; 
    File newPic = null; 

pic = new File(src); 
newPic = new File(dst); 

FileChannel srcChannel = null; 
FileChannel dstChannel = null; 

try { 
srcChannel = new FileInputStream(pic).getChannel(); 
dstChannel = new FileOutputStream(newPic).getChannel(); 

dstChannel.transferFrom(srcChannel, 0, srcChannel.size()); 



} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 

    try { 

    if(dstChannel != null) { 
     dstChannel.close(); 
    } 
     srcChannel.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    srcChannel = null; 
    dstChannel = null; 

    src = null; 
    dst = null; 
} 

} 

Catlog:

07-04 21:43:15.330: E/System(28070): Uncaught exception thrown by finalizer 
07-04 21:43:15.330: E/System(28070): java.io.IOException: close failed: EIO (I/O error) 
07-04 21:43:15.330: E/System(28070): at libcore.io.IoUtils.close(IoUtils.java:41) 
07-04 21:43:15.330: E/System(28070): at  java.io.FileOutputStream.close(FileOutputStream.java:139) 
07-04 21:43:15.330: E/System(28070): at java.io.FileOutputStream.finalize(FileOutputStream.java:153) 
07-04 21:43:15.330: E/System(28070): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:186) 
07-04 21:43:15.330: E/System(28070): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169) 
07-04 21:43:15.330: E/System(28070): at java.lang.Thread.run(Thread.java:856) 
07-04 21:43:15.330: E/System(28070): Caused by: libcore.io.ErrnoException: close failed: EIO (I/O error) 
07-04 21:43:15.330: E/System(28070): at libcore.io.Posix.close(Native Method) 
07-04 21:43:15.330: E/System(28070): at libcore.io.BlockGuardOs.close(BlockGuardOs.java:75) 
07-04 21:43:15.330: E/System(28070): at libcore.io.IoUtils.close(IoUtils.java:38) 
+0

Каково название вашего класса? Я никогда не использовал FileChannel, но, возможно, вам нужно закрыть потоки. – user573215

+0

Я уже закрываю его? dstChannel.close(); – ole

ответ

0

Поскольку данные о FileChannel кэша Я думаю, вам нужно позвонить force() перед вами close()FileChannel.

+0

Я не понимаю, почему это сработает, но я протестировал его, конечно, безрезультатно :) – ole

+0

Я решил, что если он будет пуст, вы сможете закрыть его, но это был длинный выстрел, так как я сам его не тестировал. На самом деле я не могу воспроизвести проблему. Я должен сказать, что я тестировал его только как обычное Java-приложение, так как у меня нет доступа к моей ATM-среде Android. – Qben

+0

По-прежнему получайте то же исключение, действительно расстраивающее :) спасибо за помощь – ole

Смежные вопросы