Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Java - soubor nelze smazat

Dobrý den,

Potřeboval bych smazat soubory, co jsem si sám vytvořil. Ovšem nejde to. Dělám to pomocí tohohle kódu.

public void play() {
        number += 1;
        if (number < LIST_FILES.size()) {
            hit = new Media(new File(LIST_FILES.get(number).toString()).toURI().toString());
            setText(LIST_FILES.get(number).getName().substring(0, LIST_FILES.get(number).getName().lastIndexOf(".")));
            media_player = new MediaPlayer(hit);
            media_player.setOnEndOfMedia(() -> play());
            media_player.play();
        } else {
            for (File file: LIST_FILES)
               if (file.getName().endsWith("wav")) {
                    System.out.println(file.delete());
                }
            LIST_FILES.clear();
            choose_song();
        }
    }

Metoda file.delete() funguje čistě náhodně, někdy se nesmaže nic a nebo se smaže pouze pár souborů.

Když jsem však použil metodu Files.delete(file.toPath()), tak to vyhodilo hlášku, že soubor nelze smazat, protože je využíván jiným procesem.

Jenže vůbec nevím který.

Prosím o radu

Předem děkuji.

Předmět Autor Datum
skús po vytvorení súboru zatvoriť output stream
fihsafdliuashfo 17.08.2017 19:26
fihsafdliuashfo
Ale v té metodě se to vždy zavře. public boolean decode(String inFileName, String outFileName) thro…
MichalDM 17.08.2017 19:41
MichalDM
Pravdepodobne je ten súbor používaný tvojím vlastným procesom. Myslím, že MediaPlayer mal taký bug,… poslední
moose 20.08.2017 03:48
moose

Ale v té metodě se to vždy zavře.

public boolean decode(String inFileName, String outFileName) throws IOException {
        FileInputStream is = null;
        FileOutputStream os = null;
        try {
            is = new FileInputStream(inFileName);
            os = new FileOutputStream(outFileName);
            wav = new WavWriter(os);
            FLACDecoder decoder = new FLACDecoder(is);
            decoder.addPCMProcessor(this);
            decoder.decode();
        } catch (IOException e) {
             return false;
        } finally {
            if (is != null) {
                is.close();
            }
            if (os != null) {
                os.close();
            }
        }
        return true;
    }

Pravdepodobne je ten súbor používaný tvojím vlastným procesom. Myslím, že MediaPlayer mal taký bug, že neuvoľnil handle na súbor, neviem či s tým niečo spravili. Kto drží otvorený handle môžeš zistiť použitím programu handle.exe.

MediaPlayer má metódu dispose, ktorá zaručene zatvorí všetky prostriedky, ktoré používa. Nevýhodou je, že ho už potom nemôžeš použiť, takže si v prípade potreby musíš vytvoriť novú inštanciu. Ale vidím, že novú inštanciu vytváraš vždy, takže ti to asi môže byť jedno.

Ešte pár menej podstatných až nepodstatných pripomienok ku kódu:
- skús viac používať premenné, LIST_FILES.get(number).getName() tam máš 2x v jednom riadku, ktorý je potom zbytočne dlhý
- používaj try-with-resources, ak môžeš (a keďže si skúšal Files.delete, tak môžeš, lebo máš k dispozícii minimálne Javu 7) - výrazne tým zjednodušíš kód
- na tvojom mieste by som uprednostnil Files.deleteIfExists pred file.delete - file.delete v prípade zlyhania len vráti false a ak to explicitne neskontroluješ, tak sa nedozvieš, že vznikol problém
- pomenúvaj premenné podľa javovej konvencie, t.j. žiadne podčiarniky v názvoch premenných, ale camelCase

Zpět do poradny Odpovědět na původní otázku Nahoru