java - 在JAVA中有效播放.wav文件

标签 java

我正在编写一个程序,只需单击一个按钮即可播放 .wav 文件。目前,我一直在这样做:

  1. 加载/打开文件。
  2. 播放文件。
  3. 关闭文件。

这发生在单独的线程中。

这工作得很好,我这样做没有任何问题,但我在某处读到,每次需要文件时加载文件可能会减慢程序速度,并可能导致各种麻烦。他们说将这些文件放入缓存中更明智,但我不知道如何做到这一点(我想我也在 StackOverflow 中读到过,但我不太确定)。

提前致谢。

最佳答案

这取决于您如何播放文件,但假设您将文件作为字节流加载,您只需将文件的内容存储为字节数组并将其放入缓存中。

再次加载文件时,您从缓存中检索字节数组并从中创建输入流。

像这样的伪代码:

byte[] cachedFile = cache.get(filename);
if( cachedFile != null ) {
   cachedFile = loadFile( filename);
   cache.put( filename, cachedFile );
}

InputStream stream = new ByteArrayInputStream(cachedFile);
play(stream);

请注意,这只是一些基本方法,您需要向缓存访问添加同步、异常处理、缓存驱逐策略(如果缓存可能太大)等。

此外,您可能会研究内存映射文件,这提供了一个权衡:您不必在播放之前读取整个文件,而是在播放时直接读取流。因此,您只需阅读玩家需要的部分。由于硬盘吞吐量较低,这可能仍然比内存中的数据慢,但这甚至可能不明显,因为您在给定时间只需要文件中的一定量的数据。通过这种方法,您不需要缓存,并且可以减少内存需求。

关于java - 在JAVA中有效播放.wav文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8506719/

相关文章:

java - spring @Controller 和 @RestController 注解的区别

java - 如何在 Java 中为复杂类型添加参数?

java - 检查有效的 URL、URI 构造

java - 比较两个 BufferedImages 之间像素值的最快方法?

使用 JAR 的 Java 小程序?

Java:重新连接套接字有时会出现错误

java - wait() 和 this.wait() 的区别

java - 使用 Eclipse 的 xml 智能感知?

java - Aerospike : Does Java Client support mulitple filters on secondary indexes?

java - 类实例必须在更多类 OSGi 中可见