我对学习Java中的音频文件操作感兴趣,所以,在研究了.wav文件格式的一些背景之后,我写了一个简单的程序来读取.wav文件,把它放到一个字节数组中,然后将该数组写入新的.wav文件。但是,输出文件不是输入文件的副本。例如,当我在文本编辑器(Notepad ++)中打开两个.wav文件时,原始文件将开始说" RIFF"应该如此,但副本开始时带有一系列空字符。任何人都可以告诉我我做错了什么吗?
这是我的代码:
package funwithwavs2;
import javax.sound.sampled.*;
import java.io.*;
public class FunWithWavs2 {
public static void main(String[] args) {
int x;
byte[] wavBytes=new byte[100000000];
try {
AudioInputStream ais=AudioSystem.getAudioInputStream(new File("Centerfold.wav"));
while((x=ais.read(wavBytes))>0) {
System.out.println("X: "+x);
}
writeToFile(wavBytes);
}
catch (Exception ex) {
System.err.println("Error reading WAV file.");
ex.printStackTrace();
}
}
public static void writeToFile(byte[] b) {
File file=new File ("centerfold3.wav");
try {
if(!file.exists()) {
file.createNewFile();
}
FileWriter fw=new FileWriter(file.getAbsoluteFile());
BufferedWriter bw=new BufferedWriter(fw);
for(int i=0;i<b.length;i++) {
bw.write(b[i]);
}
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
谢谢!
编辑以反映下面的评论:我将输入声明切换到下面的代码段,但它为我提供了标记/重置不支持的异常。
InputStream input=new FileInputStream("Centerfold.wav");
AudioInputStream ais=AudioSystem.getAudioInputStream(input);
我的问题的关键是没有写入输出.wav文件。我从输入文件中读取的字节并不是我所期望的。
while((x2=ais.read(wavBytes))>0) {
System.out.println("X2: "+x2);
}
for(int i=0;i<36;i++) {
System.out.println(i+": "+wavBytes[i]);
}
看一下这段代码,我希望打印出来的前四个字符是ASCII值:R I F F,符合.wav文件格式。然而,我得到的是一系列0,即NULL的ASCII值。为什么会出现这种差异?我是否从根本上误解了.wav文件格式或javax.sound.sampled类的功能?