Перезапись двоичного значения файла в Java - PullRequest
1 голос
/ 22 апреля 2011

Я участвую в проекте, где мы скрываем информацию в mp3-файле, изменяя байты в указанной позиции. Я нашел в сети код, который позволяет мне писать и читать байты, и я играл с ним, чтобы прочитать первые 10 байтов в mp3-файле.

Однако есть проблема, она поднимается до 4-го байта, после чего программа заканчивается. Или, другими словами, в моем цикле for это продолжается только до i = 4.

Это вывод, который я получаю.

Read 0th character of file: I
Read 1th character of file: D
Read 2th character of file: 3
Read 3th character of file: 
Read 4th character of file: 
Process completed.

Цикл каким-то образом заканчивается там, если вы заметили, что программа должна заканчиваться сообщением system.out, которое идет «конец программы», но даже не выходит. Код ниже. Я пробовал с несколькими файлами mp3 и результаты одинаковы.

В чем может быть проблема? почему моя программа заканчивается, даже не выдавая мне сообщение об ошибке?

import java.io.File;
import java.io.RandomAccessFile;
import java.io.IOException;</p>

<p>public class Edit {</p>

<code>private static void doAccess() {

    try {
        //Reads mp3 file named a.mp3
        File file = new File("a.mp3");
        RandomAccessFile raf = new RandomAccessFile(file, "rw");

        //In this part I try to read the first 10 bytes in the file
        byte ch;
        for (long i = 0; i < 10 ; i++) {
            raf.seek(i); //position ourselves at position i
            ch = raf.readByte(); //read the byte at position i
            System.out.println("Read "+ i + "th character of file: " + (char)ch); //print the byte at that position
            //repeat till position 10               
        }

        System.out.println("End of program");

        raf.close();

    } catch (IOException e) {
        System.out.println("IOException:");
        e.printStackTrace();
    }
}

public static void main(String[] args) {
        doAccess();
    }

}
</code>

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 22 апреля 2011

Я только что попробовал ваш код, и он работает для меня.Проблема заключается в том, как ваша IDE обрабатывает '\0' символов (4-й байт '\0').Чтобы увидеть реальный результат, измените оператор print (внутри цикла) на:

System.out.println("Read " + i + "th character of file: " + ch);

(то есть: пропустите char (char) casting).Затем вы получите следующий вывод:

Read 0th character of file: 73
Read 1th character of file: 68
Read 2th character of file: 51
Read 3th character of file: 3
Read 4th character of file: 0
Read 5th character of file: 0
Read 6th character of file: 0
Read 7th character of file: 0
Read 8th character of file: 15
Read 9th character of file: 118
End of program

Кроме этого, я предлагаю следующее:

  • Подумайте об использовании готовой библиотеки для извлечения / записи метаданных MP3.Это намного лучше, чем реализовать эту логику с нуля.
  • Вам не нужно искать () внутри цикла.когда вы открываете файл, вы находитесь в позиции 0, и каждый readByte () продвигает позицию на 1.
  • Код будет более читабельным, если вы переместите определение переменной ch внутри цикла.Если вы используете его только внутри цикла, нет смысла определять его снаружи.
1 голос
/ 22 апреля 2011

Я запустил вашу программу, и она отлично работает. Я бы посоветовал не использовать IDE для начинающих, если вы не совсем уверены, что делаете. Скорее используйте командную строку.

Поместите Edit.java и a.mp3 в одну папку. Затем введите следующее:

javac Edit.java
java Edit

Это должно привести к правильному выводу.

1 голос
/ 22 апреля 2011

Я не вижу ничего плохого в коде, и я не понимаю, как он может привести к выводу, о котором вы сообщаете.

Я подозреваю, что вы используете файл класса, который не соответствует исходному коду, который вы нам показали.


На самом деле в программе есть несколько проблем:

  1. Вы должны закрыть RAF в последнем предложении.
  2. Приведение byte к char является хитрым.Очевидно, что некоторые байты не соответствуют печатным символам.Полагаю, возможно, что один из них - это какой-то символ, который JCreator интерпретирует как символ конца файла ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...