我无法删除文件,因为它似乎已打开

时间:2017-05-17 14:15:18

标签: java multithreading wav

我用WAV文件编写带有音频部分的内容,经过2天的搜索错误后,我真的不知道问题出在哪里。我猜我的帖子没有停止,这阻止我删除文件,但是当我调试一切顺利时,我没有例外或错误。

这是我的界面:

Picture of my interface

因此,当我想通过点击删除按钮删除文件时,会启动' DeleteTrack '方法,它的工作原理,但当我第一次听到它时,感谢听音按钮,它会启动' PlaySound '方法,我无法删除它,如果没有发生就好了。

此外,当我使用' PlaySound '然后我尝试从Windows中删除我的文件:

Windows error

感谢您的阅读,如果您能帮助我,我将非常感激,如果我的英语不完美,我将感到抱歉。

  

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;
    }

3 个答案:

答案 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