Как решить 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()
для подсказок относительно того, почему это могло возвратить странное значение; например ноль.)