为了账号安全,请及时绑定邮箱和手机立即绑定

JVM终止后如何删除文件?

JVM终止后如何删除文件?

繁华开满天机 2021-10-13 10:13:38
我正在开发一个媒体播放器应用程序,我想在 JVM 终止后立即删除在运行加密媒体文件后在特定文件夹中创建的解密媒体文件。我尝试使用 deleteOnExit(); 功能,但经过三次尝试后,它不会删除该文件。为什么会发生这种情况?下面是我用来删除文件的代码@FXML  MediaView mv;       MediaPlayer mp;       Media me;@FXML Slider volumeslider;@FXML Slider seekslider;@Overridepublic 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;        }    });
查看完整描述

2 回答

?
达令说

TA贡献1821条经验 获得超6个赞

在 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()在应用程序退出之前调用。


查看完整回答
反对 回复 2021-10-13
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

File.deleteOnExit() 将通过 Runtime.addShutdownHook() 创建一个关闭钩子。

使用 file.deleteOnExit() 没有意义,然后使用 file.delete()... deleteOnExit 将在虚拟机终止时删除文件。使用关闭钩子时也可能出现问题:

1.如果JVM由于某些内部错误而崩溃,那么它可能会崩溃而没有机会执行单个指令。

2.一旦启动,Shutdown Hooks可以在完成前强行停止。如果进程在一段时间内没有终止(有限制),则 O/S 终止。


查看完整回答
反对 回复 2021-10-13
  • 2 回答
  • 0 关注
  • 195 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信