在JAVA中有效地播放.wav文件
我正在编写一个程序,只需点击一个按钮就可以播放在JAVA中有效地播放.wav文件,java,Java,我正在编写一个程序,只需点击一个按钮就可以播放.wav文件。目前,我一直在这样做: 加载/打开文件 播放文件 关闭文件 这在一个单独的线程中发生 这工作得很好,我做起来没有问题,但我在某个地方读到,每次需要加载文件时都可能会减慢程序的速度,并可能导致各种各样的问题。他们说把这些文件放在缓存中更聪明,但我不知道怎么做(我想我也在StackOverflow中读到了,但我不太确定) 提前感谢。这取决于您如何播放文件,但假设您将文件加载为字节流,则只需将文件内容存储为字节数组并将其放入缓存即可 再次加载
.wav
文件。目前,我一直在这样做:
提前感谢。这取决于您如何播放文件,但假设您将文件加载为字节流,则只需将文件内容存储为字节数组并将其放入缓存即可 再次加载文件时,从缓存中检索字节数组并从中创建输入流 类似于以下伪代码:
byte[] cachedFile = cache.get(filename);
if( cachedFile != null ) {
cachedFile = loadFile( filename);
cache.put( filename, cachedFile );
}
InputStream stream = new ByteArrayInputStream(cachedFile);
play(stream);
请注意,这只是一些基本方法,您需要将同步添加到缓存访问、异常处理、缓存逐出策略(如果缓存可能变得太大)等
除此之外,您还可以查看文件的内存映射,这提供了一个折衷:您不必在播放之前读取整个文件,而是在播放时直接读取流。因此,您只能阅读玩家需要的部分。由于硬盘吞吐量较低,这可能仍然比内存中的数据慢,但这可能并不明显,因为您在给定时间只需要文件中的一定数量的数据。使用这种方法,您不需要缓存,并且可以减少内存需求。这取决于您如何播放文件,但假设您将文件加载为字节流,则只需将文件内容存储为字节数组并将其放入缓存即可 再次加载文件时,从缓存中检索字节数组并从中创建输入流 类似于以下伪代码:
byte[] cachedFile = cache.get(filename);
if( cachedFile != null ) {
cachedFile = loadFile( filename);
cache.put( filename, cachedFile );
}
InputStream stream = new ByteArrayInputStream(cachedFile);
play(stream);
请注意,这只是一些基本方法,您需要将同步添加到缓存访问、异常处理、缓存逐出策略(如果缓存可能变得太大)等
除此之外,您还可以查看文件的内存映射,这提供了一个折衷:您不必在播放之前读取整个文件,而是在播放时直接读取流。因此,您只能阅读玩家需要的部分。由于硬盘吞吐量较低,这可能仍然比内存中的数据慢,但这可能并不明显,因为您在给定时间只需要文件中的一定数量的数据。使用这种方法,您不需要缓存,并且可以减少内存需求