当前位置: 首页 > 面试题库 >

使用jar文件中的字节数组缓存声音

应俭
2023-03-14
问题内容

我可以使用javasound标签Wiki页面上的“正在播放Clip”解决方案来读取和播放声音。但是,对于经常播放的声音(例如,快速的激光枪声,脚步声等),每次创建新文件时打开流并重新读取文件对我来说是不舒服的。因此,我尝试将读取的文件缓存到,然后从缓存加载它们。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[]以便以后重复访问的最佳方法是什么?

  • 我必须能够访问jarfile中的文件。我相信这将我限制为Class.getResourceClass.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(系统找不到指定的路径)

次佳范例

尽管此示例 有效 ,但ArrayList由于不断调整大小等原因,我不认为an 是实现此目的的最佳方法。

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

问题答案:

试试这个:

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



 类似资料:
  • 我有Spring启动应用程序,它由2个模块组成:前端和Spring启动应用程序项目(前端是Spring启动应用程序的等级依赖性)。 如果我运行app启动并正常工作,然后我更改某些内容,gradle重建项目并替换frontend.jar.前端仅包含静态资源。它们被添加到类路径中,Spring可以为这些静态文件的请求提供服务。用构建替换frontend.jar后,无法加载自动重启Spring应用程序资

  • 对于启发式预计算表,我需要一个包含1504935936个条目的字节数组。这大约需要1.5 GB内存。 为什么我有一个“内存不足错误:Java堆空间”-例外,如果我给程序2 GB的RAM 与 它起作用了。为什么它需要那么多RAM?

  • 问题内容: 在Scala中,我可以这样声明一个字节数组 这太冗长了。有没有更简单的方法来声明Byte数组,类似于Java的 请注意,由于String 中的,以下结果导致错误 问题答案: 我相信您能做的最短的是 您 必须 将和转换为字节,因为它们不是有效的字节文字,因为它们超出了有符号字节的范围([-128,127])。 请注意,Java也是如此,以下给出了编译错误: 您必须将192和168强制转换

  • 我在.htaccess文件中设置了此代码,但woff字体不会缓存。 我也尝试过没有过期活动和过期默认值“访问加1个月”,但仍然不能再次工作。怎么了?如何缓存这种字体?其他对象,如CSS,JS和所有图像,通过缓存控制方法正确缓存,但我仍然无法缓存woff字体。

  • 问题内容: 我正在寻找编写一个自定义类加载器,它将通过自定义网络加载文件。最后,我要做的只是文件的字节数组。 我无法将字节数组转储到文件系统上并使用。 我的第一个计划是从流或字节数组创建对象,但它仅支持对象。 我已经写了一些使用的东西: 这对于小型文件可能很好用,但是我尝试加载包含几乎所有类的jar文件,它只是为了遍历所有条目而已,更不用说加载找到的类了。 如果有人知道一个解决方案比每次加载类都遍

  • 问题内容: 所以-我有一个需要a 作为输入的第三方库。我有一个。 我不想将字节写入磁盘..我想将其保留在内存中。我如何从提供的内容创建一个想法(无需写入磁盘)? 问题答案: 抱歉,不可能。除非您具有RAM磁盘,否则File本质上是磁盘上的实体-但这不是您可以用Java创建的东西。 这正是API不应该基于File对象(或过载以接受InputStream)的原因。