因此,我进行了相当多的搜索,但没有找到任何可以解决此问题的方法。 (发现有人在 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);