在java中重写文件的二进制值
我参与了一个项目,我们通过修改指定位置的字节来隐藏mp3文件中的信息。我在网上找到了允许我写和读字节的代码,我正在玩它来读取mp3文件中的前10个字节 但是有一个问题,它一直上升到第4个字节,然后程序结束。或者换句话说,在我的for循环中,它只持续到i=4 这是我得到的输出在java中重写文件的二进制值,java,file,binary,Java,File,Binary,我参与了一个项目,我们通过修改指定位置的字节来隐藏mp3文件中的信息。我在网上找到了允许我写和读字节的代码,我正在玩它来读取mp3文件中的前10个字节 但是有一个问题,它一直上升到第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
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文件,结果都是一样的
有什么问题吗?为什么我的程序结束时甚至没有给我一条错误消息
导入java.io.File;
导入java.io.RandomAccessFile;
导入java.io.IOException
公共类编辑{
private static void doAccess(){
试一试{
//读取名为a.mp3的mp3文件
File File=新文件(“a.mp3”);
RandomAccessFile raf=新的RandomAccessFile(文件“rw”);
//在这一部分中,我尝试读取文件中的前10个字节
字节ch;
用于(长i=0;i<10;i++){
寻找(i);//把我们自己定位在位置i
ch=raf.readByte();//读取位置i处的字节
System.out.println(“读取”+i+“文件的第个字符:”+(char)ch);//在该位置打印字节
//重复到位置10
}
System.out.println(“程序结束”);
raf.close();
}捕获(IOE异常){
System.out.println(“IOException:”);
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
doAccess();
}
}
提前谢谢 我看不出代码有什么问题,也不明白它怎么可能产生您报告的输出 我怀疑您运行的类文件与您向我们展示的源代码不匹配
实际上,这个程序有两个问题:
字节
转换为字符
是不可靠的。显然,有些字节与可打印字符不对应。我猜其中一个可能是JCreator解释为文件结尾字符的某个字符李>
我看不出代码有任何错误,我也不明白它怎么可能产生您报告的输出 我怀疑您运行的类文件与您向我们展示的源代码不匹配
实际上,这个程序有两个问题:
字节
转换为字符
是不可靠的。显然,有些字节与可打印字符不对应。我猜其中一个可能是JCreator解释为文件结尾字符的某个字符李>
我已经运行了你的程序,效果很好。如果您不确定自己在做什么,我建议不要使用IDE作为初学者。而是使用命令行 将
Edit.java
和a.mp3
放在同一文件夹中。然后,键入以下内容:
javac Edit.java
java Edit
这应该会产生正确的输出。我已经运行了您的程序,它工作正常。如果您不确定自己在做什么,我建议不要使用IDE作为初学者。而是使用命令行 将
Edit.java
和a.mp3
放在同一文件夹中。然后,键入以下内容:
javac Edit.java
java Edit
这应该会产生正确的输出。我刚刚尝试了你的代码,它对我很有效。问题在于IDE处理
'\0'
字符的方式(第4个字节是'\0'
)。要查看实际输出,请将打印语句(在循环内)更改为:
(即:省略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
除此之外,我建议如下:
javac Edit.java
java Edit
- 考虑使用预先制作的库来检索/写入MP3元数据。这比从头开始实现这个逻辑要好得多
- 您不需要在循环中查找()。打开文件时,您处于位置0,每个readByte()都将该位置提前1
- 如果将ch变量的定义移动到循环中,代码的可读性将更高。如果只在循环内部使用它,那么没有理由在外部定义它
'\0'
字符的方式(第4个字节是'\0'
)。要查看实际输出,请将打印语句(在循环内)更改为:
(即:省略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
除此之外,我建议如下:
javac Edit.java
java Edit
- 考虑使用预先制作的库来检索/写入MP3元数据。这比从头开始实现这个逻辑要好得多
- 您不需要在循环中查找()。打开文件时,您处于位置0,每个readByte()都将该位置提前1
- 如果将ch变量的定义移动到循环中,代码的可读性将更高。如果只在循环内部使用它,那么没有理由在外部定义它
过程已完成。
?JCreator执行此操作,它始终位于输出的末尾。抱歉,为了避免混淆,我应该删除那个部分:pAh,好的。嗯,你的代码行得通,我能读懂10个字节的mp3,并得到程序的结尾。代码看起来不错。你的节目一定有别的东西要结束了。什么打印过程已完成。
?JCreator执行此操作,它始终位于输出的末尾。抱歉,为了避免混淆,我应该删除那个部分:pAh,好的。嗯,你的代码行得通,我能读10字节的mp3