0

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

 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,则代码运行良好。有什么线索吗?

4

1 回答 1

1

这是一个已知的 bug pre-honeycomb,详见此处

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

至于解决这个错误 - 如果您可以控制正在读取的文件,您可以尝试处理仅低于 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
}
于 2013-08-25T23:44:39.667 回答