gpt4 book ai didi

java - JVM终止后如何删除文件?

转载 作者:行者123 更新时间:2023-12-01 19:47:44 26 4
gpt4 key购买 nike

我正在开发一个媒体播放器应用程序,我想在 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();

}

最佳答案

在 Linux 上,此测试程序可靠地删除当前目录中的文件“test”。 (对我来说。在我的机器上。Fedora Linux。Java 8。)

import java.io.File;
public class Test {
public static void main(String[] args) {
File file = new File("test");
file.deleteOnExit();
}
}

在 Linux 上,我能想到的唯一能阻止它工作的事情是:

  • 如果当前用户无权删除该文件,
  • 如果当前目录位于只读文件系统上,或者
  • 如果 JVM 崩溃,则会阻止“退出时删除”机制发挥作用。

在 Windows 上,您还必须考虑“测试”文件已被其他应用程序打开/锁定的可能性。 (或者可能通过此应用程序,但不是在本例中。)

请注意,如果无法删除文件,deleteOnExit 不会抛出异常,File.delete() 也不会。但是,如果由于某种原因删除失败,java.nio.file.Files.delete(Path) 将抛出一个很好的异常。这可能会给您一些关于实际发生的事情的线索。

如果这没有帮助,您需要提供一个适当的独立 MCVE,其他人可以在他们的 (Windows) 计算机上试用。

<小时/>

根据您更新的代码,问题似乎是 MediaPlayer 类打开了媒体文件。尝试在应用程序退出之前调用 mp.dispose()

关于java - JVM终止后如何删除文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52514553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com