我用WAV文件编写带有音频部分的内容,经过2天的搜索错误后,我真的不知道问题出在哪里。我猜我的帖子没有停止,这阻止我删除文件,但是当我调试一切顺利时,我没有例外或错误。
这是我的界面:
因此,当我想通过点击删除按钮删除文件时,会启动' DeleteTrack '方法,它的工作原理,但当我第一次听到它时,感谢听音按钮,它会启动' PlaySound '方法,我无法删除它,如果没有发生就好了。
此外,当我使用' PlaySound '然后我尝试从Windows中删除我的文件:
感谢您的阅读,如果您能帮助我,我将非常感激,如果我的英语不完美,我将感到抱歉。
GatherFiles 方法只返回我的wave列表我已经验证它不为空
如果我添加或删除歌曲,MajListAudio 方法会刷新我的列表
public void DeleteTrack() {
String song_name = audioList.getSelectedValue();
File[] listeOfFiles = GatherFiles(null);
// Loop to find the file to delete and then delete it.
for(int i=0;i<listeOfFiles.length;i++){
if(song_name.equals(listeOfFiles[i].getName())){
listeOfFiles[i].delete();
}
}
// Refresh the list
MajListAudio();
}
}
所以这是我觉得有问题时的功能。
public void PlaySound(File sound){
thread = new Thread(){
@Override public void run(){
try {
// Initialize a clip with our sound file
AudioInputStream audioStream = AudioSystem.getAudioInputStream(sound);
Clip clip = AudioSystem.getClip();
clip.open(audioStream);
// Variable that will updated to fix the percentage of the progressBar
int progressContains =0;
// Size in Seconds of our music
int sizeAudio = (int) (clip.getMicrosecondLength()/1000000);
clip.start();
do{
// indice allow us to know how much the progress bar has to grow every second. We divide with 100 because it's the maximum
//of the bar
int indice = 100/sizeAudio;
// Refresh the value of the bar and prepare her next value
progressBar.setValue(progressContains);
progressContains+= indice;
// The main thread is sleeping for 1s
Thread.sleep(1000);
}while(clip.isActive());
//Reset the bar after a play
clip.stop();
clip.close();
audioStream.close();
progressBar.setValue(0);
} catch (UnsupportedAudioFileException ex) {
ex.printStackTrace();
} catch (LineUnavailableException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
};
thread.start();
}
其他功能
public File[] GatherFiles(DefaultListModel myModel){
// If you want to get the list without implementing the model
if(myModel == null){
File[] both = Concatenate(getListOfFiles("\\cryptedAudio"), getListOfFiles("\\audio"));
return both;
// Same with a model
}else{
audioList.setModel(myModel);
File[] both = Concatenate(getListOfFiles("\\cryptedAudio"), getListOfFiles("\\audio"));
return both;
}
}
public File[] getListOfFiles(String endPath){
String folderPath = new File(".").getAbsolutePath();
folderPath= folderPath.substring(0, folderPath.length()-1);
File folder = new File(folderPath+endPath);
File[] listeOfFiles = folder.listFiles();
return listeOfFiles;
}
/*
*Return a new Array that contains borh arrays in parameters
*/
public <T> T[] Concatenate (T[] a, T[] b) {
int aLen = a.length;
int bLen = b.length;
@SuppressWarnings("unchecked")
T[] c = (T[]) Array.newInstance(a.getClass().getComponentType(), aLen+bLen);
System.arraycopy(a, 0, c, 0, aLen);
System.arraycopy(b, 0, c, aLen, bLen);
return c;
}
答案 0 :(得分:1)
你有没有试过像
这样的东西AudioInputStream audioStream = AudioSystem.getAudioInputStream(sound);
Clip clip = AudioSystem.getClip();
clip.open(audioStream);
// play the audio...
clip.close();
audioStream.close();
这只是确保AudioInputStream
正在关闭,因为我不确定clip.close()
是否正在关闭它(尽管人们会认为它应该......)
答案 1 :(得分:1)
我真的怀疑你的线程是一个问题。你在声音结束后等待一秒,至少。所以也许你的删除太快了。解决这个问题的一种方法是从文件中读取所有内容,然后发出声音。这样文件应该总是关闭。
byte[] bytes = Files.readAllBytes(sound.toPath());
AudioInputStream audioStream = AudioSystem.getAudioInputStream(
new ByteArrayInputStream(bytes)
);
Clip clip = AudioSystem.getClip();
clip.open(audioStream);
由于您的问题似乎是您的文件未被释放到系统,我们使用File.readAllbytes
读取整个文件,然后在您播放声音之前将其释放回操作系统。
原始设置背后的概念应该,但在尝试删除文件之前,您的循环似乎没有完成。也可能是您启动了多个线程来访问该文件。
答案 2 :(得分:0)
此方法API AudioSystem.getAudioInputStream(sound)
会返回您应该关闭的AudioInputStream
。
如果您首先将返回值分配给局部变量,那就更好了:
AudioInputStream inputAudioStream = AudioSystem.getAudioInputStream(sound);
然后您可以使用clip
实例打开它:
Clip clip = AudioSystem.getClip();
clip.open(inputAudioStream);
最后不要忘记关闭inputAudioStream
变量:
clip.close();
inputAudioStream.close();
我强烈建议您使用the try-with-resources Statement
try(AudioInputStream inputAudioStream = AudioSystem.getAudioInputStream(sound)) {
// Initialize a clip with our sound file
Clip clip = AudioSystem.getClip();
clip.open(inputAudioStream);
[.... ] your code
clip.close();
progressBar.setValue(0);
}
[.... ] your catch code