java jar 保存数组_java – 使用jar文件中的字节数组缓存声音

我可以使用

javasound标签维基页面中的“播放剪辑”解决方案来阅读和播放声音.然而,对于经常播放的声音(例如,快速激光枪声,脚步声等),每次想要创建新剪辑时,打开流并重新读取文件对我来说是不利的.所以,我正在尝试将读取文件缓存到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.我可以使用扫描仪读取字节,但我需要将它们读入某个数组.我应该只使用ArrayList< Byte>? (参见下面的“次优示例”.)

所以,我的问题是:我可以将嵌入文件读入byte []以便以后重复访问的最佳方法是什么?

限制

>我必须能够访问jar文件中的文件.我相信这限制了我对Class.getResource或Class.getResourceAsStream的限制.

>文件字节应存储在标准byte []变量中.

>我更愿意这样做,而不会引入不必要的依赖,例如Guava或Apache Commons.到目前为止,我的整个项目都是使用vanilla 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: \path\to\sound\in\jar\file.wav (The system cannot find the path specified)

次优的例子

虽然这个例子有效,但我不认为ArrayList是最好的方法,因为不断调整大小等.

// Get a stream.

InputStream s = clazz.getResourceAsStream(fullPath);

// Get a byte array.

ArrayList byteArrayList = new ArrayList();

// 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);

}

上一篇阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值