我在Android 4.0 / 4.1上有用户上传崩溃日志,但我无法重现它。日志是这样的:
java.io.IOException: close failed: EIO (I/O error)
libcore.io.IoUtils.close(IoUtils.java:41)
java.io.FileInputStream.close(FileInputStream.java:121)
android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:113)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137)
android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:949)
java.lang.Thread.run(Thread.java:856)
cause by:
libcore.io.ErrnoException: close failed: EIO (I/O error)
libcore.io.Posix.close(Native Method)
libcore.io.BlockGuardOs.close(BlockGuardOs.java:75)
libcore.io.IoUtils.close(IoUtils.java:38)
java.io.FileInputStream.close(FileInputStream.java:121)
android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:113)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137)
android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:949)
java.lang.Thread.run(Thread.java:856)
有谁知道它是如何发生的?或者如何解决它?
答案 0 :(得分:5)
由于只读文件,会发生这种情况。
我认为这是因为EIO来自您文件中的bad_file_flush
。 当内核访问文件时出现任何故障时,它会将打开的文件描述转换为带有bad_inode_ops的伪打开文件作为其文件操作。我找不到为基于FAT的文件系统执行此操作的代码,但也许有一些通用代码。
由于FileChannel缓存数据我认为您需要在force(
之前调用close() the FileChannel
有关更多信息,请浏览此链接 Link1
答案 1 :(得分:-1)
EIO来自bad_file_flush
中的bad_inode.c
。看来内核在访问inode时遇到了一些问题。
原因可能是安装 - 卸载SD卡或存储介质,在手机上连接USB。
尝试在force()
close()