Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFXMediaPlayer没有';释放文件句柄_Java_Javafx_Media Player - Fatal编程技术网

JavaFXMediaPlayer没有';释放文件句柄

JavaFXMediaPlayer没有';释放文件句柄,java,javafx,media-player,Java,Javafx,Media Player,我知道这可能是重复的。我以前检查过其他问题,但没有成功地解决我的问题。我正在尝试用javafx构建某种即时按钮应用程序。在某些情况下,我使用以下代码播放文件: if(mediaPlayer != null){ mediaPlayer.stop(); } File soundFile = new File(Config.getInstantSoundsDirectory() + File.separator + fileName); Media mediaFile = new Media(

我知道这可能是重复的。我以前检查过其他问题,但没有成功地解决我的问题。我正在尝试用javafx构建某种即时按钮应用程序。在某些情况下,我使用以下代码播放文件:

if(mediaPlayer != null){
    mediaPlayer.stop();
}
File soundFile = new File(Config.getInstantSoundsDirectory() + File.separator + fileName);
Media mediaFile = new Media(soundFile.toURI().toString());
mediaPlayer = new MediaPlayer(mediaFile);        
mediaPlayer.setOnEndOfMedia(() -> mediaPlayer.dispose());
mediaPlayer.play();
try {
    Files.deleteIfExists(Paths.get(Config.getInstantSoundsDirectory(), fileName));
} catch (IOException e1) {      
    e1.printStackTrace();
} 
如果要删除该文件,请使用以下代码:

if(mediaPlayer != null){
    mediaPlayer.stop();
}
File soundFile = new File(Config.getInstantSoundsDirectory() + File.separator + fileName);
Media mediaFile = new Media(soundFile.toURI().toString());
mediaPlayer = new MediaPlayer(mediaFile);        
mediaPlayer.setOnEndOfMedia(() -> mediaPlayer.dispose());
mediaPlayer.play();
try {
    Files.deleteIfExists(Paths.get(Config.getInstantSoundsDirectory(), fileName));
} catch (IOException e1) {      
    e1.printStackTrace();
} 
如果我以前从未播放过该文件,它就会起作用。如果我这样做了,我会得到一个异常,说我不能删除它,因为其他进程正在使用它。根据其他帖子,从文件中删除文件句柄的解决方案是在我的mediaPlayer上调用dispose(),正如我在播放文件时所做的那样。不幸的是,错误仍然存在。我是不是错过了什么

谢谢你的帮助

问候爱奥尼亚

编辑->这是我的示例测试代码:

String filePath = Paths.get(".", "test.mp3").toString();
File soundFile = new File(filePath);
Media hit = new Media(soundFile.toURI().toString());
player = new MediaPlayer(hit);
player.setOnEndOfMedia(() -> {
    player.dispose();
    try {
        Files.deleteIfExists(Paths.get(".", "test.mp3"));
    } catch (IOException e) {       
        e.printStackTrace();
    }
});
player.play();

您何时尝试删除该文件?顺便说一下,您不需要File.separator。您只需编写
path.get(Config.getInstantSoundsDirectory(),fileName)
。我添加了一个ContextMenu,其中有一个触发删除的MenuItem。谢谢你对分隔符的提示。媒体将一直播放到最后。如果我右键单击某个按钮并单击我的上下文菜单中的删除项,则执行删除代码。您是在到达媒体结束之前激活该菜单项,还是在到达媒体结束之后激活该菜单项?始终在到达媒体结束之后激活该菜单项。我编写了一个简单的测试,在调用MediaPlayer.dispose()后删除文件时没有遇到任何问题在Windows7中。是否可能是另一个进程或程序的另一部分打开了该文件?何时尝试删除该文件?顺便说一下,您不需要File.separator。您只需编写
path.get(Config.getInstantSoundsDirectory(),fileName)
。我添加了一个ContextMenu,其中有一个触发删除的MenuItem。谢谢你对分隔符的提示。媒体将一直播放到最后。如果我右键单击某个按钮并单击我的上下文菜单中的删除项,则执行删除代码。您是在到达媒体结束之前激活该菜单项,还是在到达媒体结束之后激活该菜单项?始终在到达媒体结束之后激活该菜单项。我编写了一个简单的测试,在调用MediaPlayer.dispose()后删除文件时没有遇到任何问题在Windows7中。是否可能是另一个进程或程序的另一部分打开了该文件?