IOException: сбой закрытия в FileOutputStream

В моем приложении я копирую файлы из источника в папку назначения для дальнейшей обработки изображений. Я пытаюсь скопировать файл jpg из папки src в папку dst. Кажется, что функция работает, но я все еще получаю эту ошибку IOException. Может ли кто-нибудь пролить свет на то, почему close() не работает?

 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;
 }

 }

Каталог:

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)

person olealgo    schedule 04.07.2013    source источник
comment
Как называется твой класс? Я никогда не использовал FileChannel, но, возможно, вам также нужно закрыть потоки.   -  person user573215    schedule 04.07.2013
comment
Я уже закрываю его? dstChannel.close();   -  person olealgo    schedule 05.07.2013


Ответы (1)


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

person Qben    schedule 04.07.2013
comment
Я не понимаю, почему это сработает, но я проверял, конечно, безрезультатно :) - person olealgo; 05.07.2013
comment
Я подумал, что если он пуст, вы сможете закрыть его, но это был долгий путь, так как я не проверял его сам. На самом деле я не могу воспроизвести проблему. Должен сказать, что я тестировал его только как обычное Java-приложение, поскольку у меня нет доступа к банкомату среды Android. - person Qben; 05.07.2013
comment
Все еще получаю то же исключение, очень расстраивает :) спасибо за помощь - person olealgo; 05.07.2013