Как решить Java IOException: отрицательное смещение поиска? (Библиотека тегов Java ID3)

Я пытаюсь манипулировать ID3-тегами в MP3-файлах с помощью Java ID3 Tag Library. Однако, когда я пытаюсь сделать НИЧЕГО, используя класс "MP3File", я получаю IOException: Negative Seek Offset;

Вот пример кода и трассировка стека:

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, который я пытаюсь прочитать, работает отлично. Итак, есть идеи, почему это происходит и / или как это решить?

1 ответ

Итак, есть идеи, почему это происходит и / или как это решить?

С риском констатировать очевидное, есть 2 возможные причины проблемы:

  • Файл MP3 поврежден каким-то тонким способом, который не мешает ему "работать"... что, я полагаю, означает проигрывание в каком-то не Java-плеере.
  • Библиотека глючит и не обрабатывает что-то правильно.

Решения?

  • Попробуйте другой файл MP3.
  • Попробуйте несколько файлов из разных источников, если это связано с файлами MP3, созданными определенным программным обеспечением.
  • Запустите библиотеку, используя отладчик Java, чтобы выяснить, что на самом деле вызывает исключение. Это, вероятно, повлечет за собой чтение спецификаций MP3, чтобы решить, есть ли какое-то несоответствие между 1) кодом, 2) спецификацией и 3) байтами в файле.

Вы задали это как вопрос программирования, так что я предполагаю, что вы программист и способны устранять неполадки в целом, в частности, в поиске / чтении спецификаций и отладке Java.


Хорошо... так как вы, кажется, не достигли прогресса в этом самостоятельно, я взглянул на исходный код, который нашел здесь. (Конечно, это может быть неправильная версия, но вы не сказали, какую версию библиотеки вы использовали...)

Похоже, что проблема возникает в строке 309 org.farng.mp3.id3.ID3v1.java в seek метод:

// 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, либо вы пытаетесь прочитать файлы с какого-либо устройства / файловой системы, которая не сообщает должным образом размеры файлов.

(Стоит прочитать Javadocs для File.length() для подсказок относительно того, почему это могло возвратить странное значение; например ноль.)

Другие вопросы по тегам