当前位置: 首页 > 知识库问答 >
问题:

由于javaFx MediaPlayer,无法删除. mp3文件

秦才
2023-03-14

我正在研究我的高中顶点。这是一个程序,用户可以从互联网下载歌曲并以有组织的方式存储它们并播放它们。我的程序必须包含一个功能,用户只需按一个按钮即可删除指定的.mp3文件。我已经在媒体播放器上尝试了.dispose()方法,然后尝试删除似乎不起作用的文件。它会产生一个错误,指出.mp3文件仍在使用中。如何阻止 Javafx 访问该文件?我在网上搜索了答案,但没有一个答案适合我的需求。如果有人能为我提供一些代码来解决我的问题,将不胜感激!下面是一个迷你可重现示例!

package mediaplayerjavafx;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Paths;
import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;

public class JavaFxMp3WavPlayer extends Application {

    public static void main(String[] args) throws MalformedURLException, IOException {
        launch(args);

    }

    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("My");
        Button button = new Button("Delete Song File!");
        Scene scene = new Scene(button, 200, 100);
        stage.setScene(scene);
        stage.show();
        File file = new File("C:\\Users\\John Doe\\OneDrive\\Desktop\\YourLieInAprilTest\\Mp3Test.mp3");
        String path = file.toURI().toASCIIString();
        Media media = new Media(path);
        MediaPlayer mediaPlayer = new MediaPlayer(media);
        button.setOnAction(new EventHandler() {
            @Override
            public void handle(Event arg0) {
                deleteMusicFile(mediaPlayer);
            }
        });
        mediaPlayer.play();
    }

    public void deleteMusicFile(MediaPlayer mediaPlayer) {
        mediaPlayer.stop();
        mediaPlayer.dispose();
        try {
            Files.delete(Paths.get("C:\\Users\\John Doe\\OneDrive\\Desktop\\YourLieInAprilTest\\Mp3Test.mp3"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

上面的类本质上创建了一个MediaPlayer对象并运行指定的.mp3文件。然后,当您按下按钮时,它将使用.stop()方法停止MediaPlayer,然后使用.dispose()方法处理MediaPlayer。然后它将尝试删除导致错误的文件。

module MotisHarmony {
    requires javafx.swt;
    requires javafx.base;
    requires javafx.controls;
    requires javafx.fxml;
    requires javafx.graphics;
    requires javafx.media;
    requires javafx.swing;
    requires javafx.web;
    exports mediaplayerjavafx;
    opens mediaplayerjavafx to javafx.graphics;
}

java.nio.file.FileSystemException: C:\Users\John Doe\OneDrive\Desktop\YourLieInAprilTest\Mp3Test.mp3: The process cannot access the file because it is being used by another process.

    at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
    at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:270)
    at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:105)
    at java.base/java.nio.file.Files.delete(Files.java:1141)
    at MotisHarmony/mediaplayerjavafx.JavaFxMp3WavPlayer.deleteMusicFile(JavaFxMp3WavPlayer.java:53)
    at MotisHarmony/mediaplayerjavafx.JavaFxMp3WavPlayer$1.handle(JavaFxMp3WavPlayer.java:43)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
    at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8792)
    at javafx.controls/javafx.scene.control.Button.fire(Button.java:203)
    at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:208)
    at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3897)
    at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1878)
    at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2623)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:411)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:301)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:450)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:424)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:449)
    at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:557)
    at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:943)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
    at java.base/java.lang.Thread.run(Thread.java:834)

< code >链接到我用来测试的Mp3文件。https://drive . Google . com/file/d/1c vaafbmviq 7 nvkyojnem 9 GK 73 ljsd 6 mj/view?usp =共享

我正在使用JDK 11和Javafx 17.0.2

系统类型:64位操作系统,基于x64的处理器

处理器:Intel(R)Core(TM)i7-7700HQ CPU@2.80GHz 2.81 GHz

< code>Windows版本:Windows 10家庭版

共有1个答案

龚俊捷
2023-03-14

感谢@Slaw为我的问题提供了解决方案。为了解决我的问题,我创建了一个deleteQueueArrayList,它将保存我要删除的文件的路径。一旦在MediaPlayer上使用.dispose(),经过一定时间后,这些文件将被自动删除。

 类似资料:
  • 当我在Android studio中重建一个Gradle项目时,它给了我以下错误: Gradle:执行任务“:lib:clean”失败。无法删除目录:/path/to/project/lib/build/explobded-bundles/ComandroidSupportAppCompatv71901.aar 原来文件夹包含一个名为的文件(或其他一些随机文件)。我在谷歌上搜索了一下,它似乎是一个

  • 问题内容: 我必须从指定的路径中删除属性文件。我使用以下代码: 返回false。 但是成功删除了一个文本文件而不是属性文件。 问题答案: 失败的原因有两个: 这是一个目录,不能为空 您没有操作系统权限才能删除文件 该文件仍在某处打开 最后一个可能是您自己的错误,如果您为该文件打开了FileInput / OutputStream却忘记了将其关闭。

  • 问题内容: 只是尝试删除所有文档,并这样做: 然后承诺: 我得到答复: 但是当我搜索时,我仍然会得到结果。 我做错什么了? 问题答案: 不确定是否重要,但是您也可以编码: 要尝试的另一件事是使用POST方法(调用update的首选方法):

  • 我遵循了本教程:http://what-when-how.com/javafx-2/playing-audio-using-the-media-classes-javafx-2-part-1/ 我有相应的资源文件夹在相应的目录中。类文件,但我仍然不能播放音频。mp3文件与教程中的不同,但我也有一个. wav等效文件,发现JavaFX可以开箱播放*. wav文件,但不能播放mp3文件。怎么回事啊?

  • 标记为“good”的文件可以正确播放,而标记为“bad”的文件则不能。两个文件在同一个目录中;两个文件都使用音乐播放器播放;并且这两个文件都可以在Windows7机器上使用Python3.4和pygame。