我可以经常看到这个问题,但我的情况有所不同。我在一个通道的简单搜索操作中观察到异常,这是我的代码:
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,那么代码工作正常。任何线索?
答案 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
}