听起来缓存使用字节数组从JAR文件中(Caching sounds using byte array

2019-08-18 08:25发布

我可以读取和播放使用“播放声音Clip从”解决方案javasound标签的wiki页面。 然而,对于那些经常播放的声音(例如,快速的激光枪的声音,脚步声,等等),它的不和谐我是你要创建一个新的每次打开流并重新读取文件Clip 。 所以,我试图读取文件缓存到一个byte[]随后,从缓存加载它们。

装载部分很简单:

// Get a BAIS.
ByteArrayInputStream bais = new ByteArrayInputStream(cache.get(fileName));

// Convert to an audio stream.
AudioInputStream ais = AudioSystem.getAudioInputStream(bais);

然而,最初获得该文件的内容到一个字节数组被证明是一个挑战。 问题是,我试图从包含在该.jar文件中读取的声音-所以使用java.io.File不是一个选项(据我所知),以及各种解决方案,我已经看到了(下面的链接)不适用。

在我看来,这是最难的部分会得到该文件的长度,而无需使用创建字节数组java.io.File 。 我可以用读取的字节中Scanner ,但我需要将它们读入一些阵列。 我应该使用ArrayList<Byte> ? (参见“实施例的次优”的下方。)

所以,我的问题: 什么是我可以读取嵌入的文件转换成最佳的方式byte[]供以后重复访问?

限制

  • 我必须要能够在jar文件中访问文件。 我相信,这限制了我Class.getResourceClass.getResourceAsStream
  • 文件的字节应被存储在一个标准的byte[]变量。
  • 我宁愿做没有引入不必要的依赖,如番石榴或Apache共享。 我的整个项目到目前为止是香草的Java(JDK6),我想保持这种方式。

我有什么企图?

我已经尝试使用RandomAccessFile ,就像这样:

// Get the file.
RandomAccessFile f = new RandomAccessFile(fullPath, "r");

// Create a byte array.
theseBytes = new byte[(int) f.length()];

// Read into the array.
f.read(theseBytes);

// Close the file.
f.close();

// Put in map for later reference.
byteCache.put(fullPath, theseBytes);

然而,显然这仅适用于磁盘引用的文件; 我得到以下错误:

java.io.FileNotFoundException:\路径\为\声音\中\罐子\ file.wav(系统找不到指定的路径)

次优实例

虽然这个例子的作品 ,我不认为一个ArrayList是做到这一点的最好办法,由于不断调整大小等。

// Get a stream.
InputStream s = clazz.getResourceAsStream(fullPath);

// Get a byte array.
ArrayList<Byte> byteArrayList = new ArrayList<Byte>();

// Create a storage variable.
int last = 0;

// Loop.
while ((last = s.read()) != -1) {
    // Get it.
    byteArrayList.add((byte) last);
}

// Create a byte array.
theseBytes = new byte[byteArrayList.size()];

// Loop over each element.
for (int i = 0; i < theseBytes.length; i++) {
    // Set the byte.
    theseBytes[i] = byteArrayList.get(i);
}

上一页阅读

  • 答案由梅德Mitskevich“文件到字节的Java []”
  • 回答为“读取二进制文件到JAVA单个字节数组”由GregS
  • 该javasound标签wiki页面

Answer 1:

试试这个:

InputStream is = new BufferedInputStream(getClass().getResourceAsStream(name));
ByteArrayOutputStream out = new ByteArrayOutputStream();
for (int b; (b = is.read()) != -1;) {
    out.write(b);
}
byte[] a = out.toByteArray();

其中, name是路径中的文件.jar



文章来源: Caching sounds using byte arrays from within jar file