Android RandomAccessFile java.io.IOException:对于搜索时定义的数据类型,值太大

时间:2013-08-25 23:05:29

标签: android nio

我可以经常看到这个问题,但我的情况有所不同。我在一个通道的简单搜索操作中观察到异常,这是我的代码:

 private RandomAccessFile channel;
   .....
 try {
        channel.seek(pos);
    } catch (IOException ioe) {
        System.err.printf("Seek file size %d  seek to %d%n", originalSize, pos);
        throw ioe;
    }

我添加了try只是为了捕获异常发生的值。所以我在日志中看到类似的东西:

08-25 22:50:11.662: W/System.err(18839): Seek file size 2198818800  seek to 2196985856
08-25 22:50:11.682: E/wavpack(18839): Value too large for defined data type
08-25 22:50:11.682: E/wavpack(18839): java.io.IOException: Value too large for defined data type
08-25 22:50:11.682: E/wavpack(18839):   at org.apache.harmony.luni.platform.OSFileSystem.seek(Native Method)
08-25 22:50:11.682: E/wavpack(18839):   at dalvik.system.BlockGuard$WrappedFileSystem.seek(BlockGuard.java:210)

我没有Android源方便地找出实际触发异常的内容。如果我在Windows或Linux下使用具有相同源数据的Oracle Java,那么代码工作正常。任何线索?

1 个答案:

答案 0 :(得分:1)

这是一个已知的蜂窝前蜂窝,详见here

从您的评论中我看到您正在测试较旧的操作系统,这可能就是您看到错误的原因。如果您可以在较新的操作系统上进行测试,则应该能够确认这一点。

至于解决此错误 - 如果您可以控制正在读取的文件,则可以尝试仅处理2GB以下的文件。否则,您可能需要查看解析文件的其他方法,或者编写自己的文件I / O类。

如果您不关心旧设备,可以通过将<uses-sdk android:minSdkVersion="13" />添加到AndroidManifest.xml文件来限制您的应用。

要检查您的程序是否在需要解决方法的版本上运行,请使用

if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only version older than gingerbread
}