我正在开发媒体播放器应用程序,我想在 JVM 终止后立即运行加密媒体文件后删除在特定文件夹中创建的解密媒体文件。 我尝试使用删除退出((;函数,但经过三次尝试后,它不会删除该文件。为什么会这样? 以下是我用来删除文件的代码
@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.爪哇 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()
。
File.deleteOnExit(( 将通过 Runtime.addShutdownHook(( 创建一个关闭钩子。
使用 file.deleteOnExit(( 和之后的 file.delete((...deleteOnExit 将在虚拟机终止时删除该文件。使用关机挂钩时也可能存在问题:
1.如果JVM由于某些内部错误而崩溃,那么它可能会崩溃而没有机会执行单个指令。
2.一旦启动,关机钩可以在完成之前强制停止。如果进程在一段时间内未终止(有限制(,则 O/S 终止。