Java 使用FileInputStream和FileOutputStream作为缓冲区
我想用硬盘作为音频信号的缓冲区。我的想法是将样本以字节形式写入一个文件,然后用另一个线程读取。但是,我必须解决Java 使用FileInputStream和FileOutputStream作为缓冲区,java,buffer,fileinputstream,fileoutputstream,Java,Buffer,Fileinputstream,Fileoutputstream,我想用硬盘作为音频信号的缓冲区。我的想法是将样本以字节形式写入一个文件,然后用另一个线程读取。但是,我必须解决FIS.read(byte[])的问题返回0并给我一个空缓冲区 这里有什么问题 这是我写字节的操作: 试试{ 写入(音频块); bufferOS.flush(); }捕获(IOEX异常){ //... } 我的读者就是这样做的: byte audioChunk[]=新字节[bufferSize]; int-readBufferSize; int freeBufferSi
FIS.read(byte[])的问题代码>返回0并给我一个空缓冲区
这里有什么问题
这是我写字节的操作:
试试{
写入(音频块);
bufferOS.flush();
}捕获(IOEX异常){
//...
}
我的读者就是这样做的:
byte audioChunk[]=新字节[bufferSize];
int-readBufferSize;
int freeBufferSize=line.available();//line=audioline,available返回缓冲区中的可用空间
试试{
readBufferSize=bufferIS.read(audioChunk,freeBufferSize,0);
}捕获(IOE异常){
//...
}
我用同一个文件创建了bufferOS
和bufferIS
,两者都可以工作。
编写器工作时,将创建文件并在其中包含正确的数据。
然而,bufferIS.read()代码>-调用始终返回0
fileInputStream
使用buffer.available()返回正确的可用字节数
和freeBufferSize
和audioChunk.length
等参数都是正确的
在windows的同一文件上运行FileInputStream
和FileOutputStream
是否有问题 您以错误的顺序将参数传递给read
调用,它应该是:
readBufferSize = bufferIS.read(audioChunk, 0, freeBufferSize);
现在,您正在传递freeBufferSize
作为偏移量,以存储read
调用的结果,0
作为最大读取字节数。如果您告诉read
调用最多读取零字节,那么它返回已读取零字节,这并不奇怪
Javadoc:
读写器处于同一个JVM进程中?它是一个应用程序,但线程不同。(读卡器成为自己的线程,写卡器由主线程执行)好的,写卡器如何通知读卡器?读卡器如何获得文件中数据的偏移量和长度的指示?它们彼此独立运行。当作者得到新的音频字节时,他会在文件中写入音频字节。读者在一个循环中读取他需要的数量,间隔几毫秒。如果没有足够的字节,他只读取尽可能多的字节。这实际上是一个数据队列,存在旧字节不会被丢弃的问题。
* @param b the buffer into which the data is read.
* @param off the start offset in array <code>b</code>
* at which the data is written.
* @param len the maximum number of bytes to read.
* @return the total number of bytes read into the buffer, or
* <code>-1</code> if there is no more data because the end of
* the stream has been reached.
public abstract class InputStream implements Closeable {
// ....
public int read(byte b[], int off, int len) throws IOException