如何解决Java IOException:负寻求偏移?(Java ID3标签库)



我试图使用Java ID3标签库在MP3文件中操纵ID3标签。然而,当我尝试使用"MP3File"类做任何事情时,我得到IOException:负寻求偏移;

下面是示例代码和堆栈跟踪:
package com.test;
import java.io.File;
import java.io.IOException;
import org.farng.mp3.MP3File;
import org.farng.mp3.TagException;
public class MP3Test {
    public static void main(String[] args) throws IOException, TagException {
        File f = new File("test.mp3");
        MP3File mp = new MP3File(f);
        System.out.println(mp.getFrequency());
    }

    }
--------------------------------------------------------------------------------
Exception in thread "main" java.io.IOException: Negative seek offset
    at java.io.RandomAccessFile.seek(Native Method)
    at org.farng.mp3.id3.ID3v1.seek(Unknown Source)
    at org.farng.mp3.id3.ID3v1.read(Unknown Source)
    at org.farng.mp3.id3.ID3v1.<init>(Unknown Source)
    at org.farng.mp3.MP3File.<init>(Unknown Source)
    at org.farng.mp3.MP3File.<init>(Unknown Source)
    at com.test.MP3Test.main(MP3Test.java:15)

正如你所看到的,即使是一个基本的操作也会给我抛出一个异常,这使得我很难真正开发一些东西……我想读的MP3文件工作得很好。所以,关于为什么会发生这种情况和/或如何解决它,有什么想法吗?

那么,关于为什么会发生这种情况和/或如何解决它,有什么想法吗?

恕我直言,这个问题有两个可能的原因:

  • MP3文件以某种微妙的方式被破坏,这并不妨碍它"工作"…我猜这意味着在一些非java播放器上播放。
  • 库有bug,不能正确处理某些东西。

解决方案?

    试一个不同的MP3文件。
  • 尝试来自不同来源的多个文件,以防它与特定软件生成的MP3文件有关。
  • 使用Java调试器运行库,找出导致异常的实际原因。这可能需要阅读MP3规格,以确定是否有一些不匹配:1)代码,2)规格和3)文件中的字节。

你问的是一个编程问题,所以我假设你是一个程序员,并且能够排除一般的故障,特别是在查找/阅读规范和调试Java方面。


好吧…由于您自己似乎没有取得任何进展,所以我查看了我在这里找到的源代码。(当然,这可能是错误的版本,但你没有说你使用的是哪个版本的库…)

似乎问题发生在seek方法中org.farng.mp3.id3.ID3v1.java的第309行:

// If there's a tag, it's 127 bytes long and we'll find the tag
file.seek(file.length() - 128);

现在可能给出负寻道偏移异常的唯一方法是如果file.length()返回的文件长度小于128。对于一个有效的MP3文件,不应该发生这种情况。

所以我的猜测是,要么你试图读取截断的 MP3文件,或者文件不是MP3文件,或者你试图从一些设备/文件系统读取文件,不正确报告文件大小。

(值得阅读File.length()的javadocs,以了解为什么它可能返回一个奇怪的值;如零。)

最新更新