违规代码:
public JWave(String s){
this.f = new File(s);
try{
/**if(!this.f.exists()){
this.f.createNewFile();
}*/
this.datafis = new FileInputStream(f);
this.datafos = new FileOutputStream(f);
//datafis.skip(44);
}catch(IOException e){
System.out.println(e.toString());
}
//generateAttributes();
}
和测试文件:
public class testFile{
public static void main(String[] args){
JWave j = new JWave("harm.wav");
//System.out.println(j.getAttributes());
j.close();
}
}
还有github仓库:https://github.com/Donald-Tho/JWave harm.wav是可运行的wav文件,之前600 KB,之后0 KB。
为了清楚起见,当我调用构造函数,然后关闭流之后,即使我没有明确告诉它,它也会删除文件。所需的行为是使其保持文件完整。
我在github存储库中都有测试文件,wav文件和JWave文件,以便于访问。
答案 0 :(得分:6)
打开文件进行输出时,它告诉操作系统立即将文件截断为零字节长。
为了让不知道它们之间差异的人清楚... 这与删除文件不同。
不截断文件的唯一方法是在“附加”模式下打开文件。但这意味着新数据将被写入文件的末尾,这可能与处理“ .wav”文件不正确。
如果您不希望文件被立即截断并且追加模式错误,请仅在准备好开始向其写入数据时才打开文件。
如果要用另一个完整文件替换一个完整文件,则需要1)将新数据作为一个临时文件写入同一目录中,然后2)重命名新文件以代替旧文件。