java如何在JVM终止后删除文件?
我正在开发一个媒体播放器应用程序,我想在JVM终止后立即删除解密的媒体文件,该文件是在运行加密的媒体文件后在特定文件夹中创建的。 我尝试使用deleteOnExit();函数,但三次尝试后,它不会删除该文件。为什么会这样? 下面是我用来删除文件的代码
@FXML MediaView mv;
MediaPlayer mp;
Media me;
@FXML Slider volumeslider;
@FXML Slider seekslider;
@Override
public void initialize(URL location, ResourceBundle resources) {
try {
String key = "Mary has one cat";
File inputFile = new File("C:\\Users\\Administrator\\Downloads\\video\\ec.mp4");
String path=new File("C:\\Users\\Administrator\\Downloads\\video\\dc.mp4").getAbsolutePath();
try {
CryptoUtils.decrypt(key, inputFile, path);
} catch (CryptoException ex) {
ex.printStackTrace();
}
me=new Media(new File(path).toURI().toString());
mp=new MediaPlayer(me);
mv.setMediaPlayer(mp);
mp.setAutoPlay(true);
DoubleProperty width= mv.fitWidthProperty();
DoubleProperty height= mv.fitHeightProperty();
width.bind(Bindings.selectDouble(mv.sceneProperty(), "width"));
height.bind(Bindings.selectDouble(mv.sceneProperty(), "height"));
volumeslider.setValue(mp.getVolume() * 100);
volumeslider.valueProperty().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
mp.setVolume(volumeslider.getValue() / 100);
}
});
mp.currentTimeProperty().addListener(new ChangeListener<Duration>() {
@Override
public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
seekslider.setValue(newValue.toSeconds());
seekslider.maxProperty().bind(Bindings.createDoubleBinding(
() -> mp.getTotalDuration().toSeconds(),
mp.totalDurationProperty()));
File file = new File(path);
file.deleteOnExit();
file.delete();
file = null;
}
});
seekslider.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
mp.seek(Duration.seconds(seekslider.getValue()));
mp.setOnEndOfMedia(new Runnable() {
public void run() {
mp.seek(Duration.minutes(1));
}
});
}
});
}catch(Exception e) {
}
mv.setOnMouseClicked(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
mp.play();
mp.pause();
}
});
}
public void play(ActionEvent event) {
mp.play();
//mp.setRate(1);
mp.pause();
}
# 1 楼答案
在Linux上,此测试程序正在可靠地删除当前目录中的文件“test”。(对我来说。在我的机器上。Fedora Linux.Java8。)
在Linux上,我能想到的唯一能阻止它工作的事情是:
请注意,如果无法删除文件,
deleteOnExit
不会引发异常,而且File.delete()
也不会引发异常。但是,如果由于某种原因删除失败,java.nio.file.Files.delete(Path)
将抛出一个很好的热异常。这可能会给你一些关于实际上发生了什么的线索如果这没有帮助,你需要提供一个合适的独立MCVE,其他人可以在他们的(Windows)机器上试用
根据更新的代码,问题似乎是
MediaPlayer
类打开了媒体文件。在应用程序退出之前,尝试调用mp.dispose()