[英]Caching sounds using byte arrays from within jar file
我可以使用javasound標簽維基頁面上的“播放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[]
以便以后重復訪問的最佳方法是什么?
Class.getResource
或Class.getResourceAsStream
限制。 byte[]
變量中。 我嘗試過使用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.