如何用JavaFX Media和MediaPlayer播放Zip内音频?临时文件方案遇报错
解决Zip中MP3播放的FileAlreadyExists错误
错误原因
File.createTempFile()会自动创建一个空的临时文件,而Files.copy()默认策略是目标文件已存在时抛出FileAlreadyExistsException,这就是问题的核心。
方案一:修改Files.copy的覆盖策略
在Files.copy中添加StandardCopyOption.REPLACE_EXISTING选项,直接覆盖已创建的空临时文件,同时建议用URI格式传入Media构造函数(部分Media实现对纯路径支持不佳):
import java.nio.file.StandardCopyOption; // ... File songfile = File.createTempFile("audio", ".mp3"); // 添加REPLACE_EXISTING选项覆盖已存在的临时文件 Files.copy(zipFile.getInputStream(zipEntries.get(i)), songfile.toPath(), StandardCopyOption.REPLACE_EXISTING); // 转换为URI字符串传入Media构造函数 song = new Media(songfile.toURI().toString()); songPlayer = new MediaPlayer(song); songPlayer.play(); // 播放结束后删除临时文件 songPlayer.setOnEndOfMedia(() -> { try { Files.deleteIfExists(songfile.toPath()); } catch (IOException e) { e.printStackTrace(); } });
方案二:跳过提前创建临时文件,直接生成路径复制
不使用File.createTempFile,直接在临时目录生成唯一文件名,让Files.copy自动创建文件,避免文件已存在的问题:
import java.util.UUID; // ... // 获取系统临时目录路径 Path tempDir = Paths.get(System.getProperty("java.io.tmpdir")); // 生成唯一文件名避免冲突 Path songPath = tempDir.resolve(UUID.randomUUID() + ".mp3"); Files.copy(zipFile.getInputStream(zipEntries.get(i)), songPath); // 用URI字符串初始化Media song = new Media(songPath.toUri().toString()); songPlayer = new MediaPlayer(song); songPlayer.play(); // 播放完成后清理临时文件 songPlayer.setOnEndOfMedia(() -> { try { Files.deleteIfExists(songPath); } catch (IOException e) { e.printStackTrace(); } });
额外注意
两种方案都建议在播放结束后删除临时文件,避免长期占用磁盘空间。如果是JavaFX的MediaPlayer,通过setOnEndOfMedia回调可以在播放完成后自动执行清理操作。
内容的提问来源于stack exchange,提问作者unhelpfullamp
相关产品推荐
相关产品推荐

