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