Как удалить файл после завершения JVM? - PullRequest
0 голосов
/ 26 сентября 2018

Я работаю над приложением медиаплеера и хочу удалить дешифрованный медиафайл, созданный в определенной папке, после запуска зашифрованного медиафайла, как только 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();

}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

File.deleteOnExit () просто создаст ловушку отключения через Runtime.addShutdownHook ().

Нет смысла использовать file.deleteOnExit (), и после этого file.delete () ... deleteOnExit удалит файл после завершения работы виртуальных машин.Также возможны проблемы при использовании ловушки отключения:

1. Если JVM падает из-за какой-то внутренней ошибки, то он может аварийно завершить работу без возможности выполнить одну инструкцию.

2. После запуска крюки выключения могут быть принудительно остановлены до завершения.Если процесс не завершается в течение некоторого времени (есть предел), то операция завершается.

0 голосов
/ 26 сентября 2018

В 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() до выхода из приложения.

...