我遇到了一个很奇怪的问题。我正在编写下面的部分代码。
try {
while (!stopCapture) {
// Read data from the internal buffer of the data line.
int cnt = this.recLine.read(tempBuffer, 0, tempBuffer.length);
if (cnt > 0) {
// Save data in output stream object.
byteArrayOutputStream.write(tempBuffer, 0, cnt);
// System.out.println(" bytes " + tempBuffer[0]);
}// end if
}// ends while
// AudioSystem.write(myAIS, targetType, outputFile);
byteToWave(byteArrayOutputStream);
byteArrayOutputStream.close();
} catch (IOException e) {
// TODO provide runtime exception to reach it to presentation layer
e.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
recLine 是我将声音录制到 byteArrayOutputStream 的 TargetDataLine。在我的测试中,它可以正常工作到 40-48 秒,但是当它每次达到 49 秒时,它都会抛出以下异常:
Exception in thread "Thread-5" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at com.actura.app.capture.ActuraRecorder.run(ActuraRecorder.java:109)
at java.lang.Thread.run(Thread.java:619)
我使用这种技术是因为我需要记录的字节,并且从这些字节中我成功地在 UI 上绘制了一个波形。
在测试期间,我知道当 byteArrayOutputStream 的大小仅为 7.3 mb 时会引发异常。
我可以将此 byteArrayOutputStream 写入随机访问文件,然后每次达到其限制时重置此 byteArrayOutputStream 吗?
我如何提前知道 byteArrayOutputStream 的限制?
我检查了 Integer.MAX_VALUE,但正如我所说,它只是在 7.3 mb 处引发了一个异常,所以我无法访问 Integer.MAX_VALUE。
这个小程序在互联网上运行,所以设置内存大小对我没有帮助。如何将其设置到我客户的计算机上?