Java,Javafx MediaPlayer,即使使用 .dispose() 方法,似乎也不会释放 mp3 文件

2024-03-26

因此,我进行了相当多的搜索,但没有找到任何可以解决此问题的方法。 (发现有人在 2016 年问过,没有答案,而且做得有点不同,我还发现有些人不关心文件是否在退出时删除,或者在下次启动时删除,我确实这样做)

我有一个应用程序,其中有一个按钮可以让用户在计算机上选择一个 mp3 文件,还有一个按钮可以让用户播放该声音,当用户完成后,他/她可以单击一个保存按钮删除存储在用户文件夹中的 mp3 文件,然后将其替换为用户选择的新文件,他们应该连续执行此操作,因此在退出时删除以前的文件不是很好,因为它可能会导致一大堆临时文件需要在退出时删除,并在启动时检查。

所以,据我所知,这似乎是一个以 Windows 为中心的问题,其中在媒体播放器中打开的文件未正确发布(或类似的东西,有点难以理解..),所以我想知道是否有一种强制 MediaPlayer 对象释放媒体对象/文件的方法,或者可能是一种查找并监听 dispose() 方法何时完成的方法,以便我可以在 java 程序运行时删除文件之后继续运行吗?

这是一个代码片段来说明问题。

import javafx.application.Application;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main extends Application {
    public static void main(String[] args){launch(args);}
    @Override
    public void start(Stage primaryStage) throws Exception {

        Path path = Paths.get("some/file/path.mp3"); //making a path for the Media object and for deleting later
        Media media = new Media(path.toUri().toString()); //Making a Media object for the Mediaplayer
        MediaPlayer mediaPlayer = new MediaPlayer(media); //Making a MediaPlayer

        mediaPlayer.play(); //playing just to make sure it has been used
        mediaPlayer.stop(); //stopping the player
        mediaPlayer.dispose(); //disposing of the MediaPlayer

        //checking to see that the MediaPlayer has been disposed of at least
        try {
            if (mediaPlayer.getStatus().equals(MediaPlayer.Status.DISPOSED)) {
                Files.delete(path); //trying to delete, and subsequently crashing..
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.exit(0); //terminating program
    }
}

编辑(添加了抛出的异常(用虚拟路径替换我的实际路径)):

java.nio.file.FileSystemException: some/file/path.mp3: The process cannot access the file because it is being used by another process.

我目前对解决方案的想法是拥有一个文件,在程序下次启动时将文件标记为删除,并跟踪然后应将哪些文件复制到用户文件夹。

或者甚至可能实际上没有将文件保存在用户文件夹中,而是在文本文件或其他文件中保留对用户文件的引用,而我只有一个可以从中获取内容的通用“声音文件夹”。

或类似的事情,但我想我至少会问你们是否有任何关于如何解决它的想法,就像我最初想做的那样。

真的很抱歉,如果这最终会成为重复,我还没有真正找到任何在搜索时有帮助的答案,但如果你这样做了,那么请送我去任何地方:)

感谢您提出的任何想法,并希望英语是可以理解的,另外,如果您想要更多信息或任何内容,请告诉我:)

Edit 2:

所以,我找到了一个“糟糕”的解决方法,我使用 AudioInputStream 通过剪辑播放声音,因为在这里我可以控制流,并在删除文件之前关闭它,这似乎工作得很好,唯一的问题与此相关的是,我现在仅限于 wav 文件(afaik),但我至少现在可以使用它,但不会将其作为答案,因为在我看来,MediaPlayer 解决方案会更好。

编辑3(忘记添加代码)(从这里获取音频部分:https://stackoverflow.com/a/11025384/10044355 https://stackoverflow.com/a/11025384/10044355):

Path path = Paths.get("some/file/path.wav");
File yourFile = new File(path.toString());
AudioInputStream stream = null;
AudioFormat format;
DataLine.Info info;
Clip clip;
try {
        stream = AudioSystem.getAudioInputStream(yourFile);
}catch (Exception e){
    e.printStackTrace();
}
format = stream.getFormat();
info = new DataLine.Info(Clip.class, format);
clip = (Clip) AudioSystem.getLine(info);
clip.open(stream);
clip.start();
clip.stop();
stream.close();
Files.delete(path);

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java,Javafx MediaPlayer,即使使用 .dispose() 方法,似乎也不会释放 mp3 文件 的相关文章

  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 如何使用 Java Apache POI 隐藏 Excel 工作表中以下未使用的行?

    我正在使用数据库中的数据填充模板 Excel 工作表 for Map
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • Windows平台下C语言控制串口DTR和RTS引脚

    如何在windows平台上控制串口的DTR和RTS引脚 我希望通过升高或降低电压来对其进行位敲击或操作 您需要使用EscapeComm 函数 https learn microsoft com en us windows desktop a
  • 如何更改 Swagger-ui URL 前缀?

    我正在使用 Springfox Swagger2 和 Spring boot 1 5 9 我可以通过此链接访问 swagger UI http localhost 8090 swagger ui html http localhost 80
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • 使用 Windows 任务计划程序安排 [Virtualenv 相关] Python 脚本

    I want to schedule a python script to start at 3AM and break at 5PM every weekday However the problem arises when I need
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ

随机推荐