簡體   English   中英

使用jar文件中的字節數組緩存聲音

[英]Caching sounds using byte arrays from within jar file

我可以使用標簽維基頁面上的“播放Clip ”解決方案來閱讀和播放聲音。 但是,對於經常播放的聲音(例如,快速的激光槍聲,腳步聲等),每次想要創建新的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是最好的方法,因為不斷調整大小等。

// 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文件的路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM