Java 从标准I/O读写时的IndexOutOfBoundsException

Java 从标准I/O读写时的IndexOutOfBoundsException,java,indexoutofboundsexception,Java,Indexoutofboundsexception,我是Java新手,目前正在做一些实验。 我写了一个小程序,可以读取和写入std I/O流,但是 不断引发超出范围的异常。这是我的密码 int BLOCKSIZE = 128*1024; InputStream i

我是Java新手,目前正在做一些实验。 我写了一个小程序,可以读取和写入std I/O流,但是 不断引发超出范围的异常。这是我的密码

int BLOCKSIZE = 128*1024;                                                                                                                                                
InputStream inStream = new BufferedInputStream(System.in);

OutputStream outStream = new BufferedOutputStream(System.out);



byte[] buffer = new byte[BLOCKSIZE];




int bytesRead = 0;
int writePos = 0;
int readPos = 0;
while ((bytesRead = inStream.read(buffer,readPos,BLOCKSIZE)) != -1) {
 outStream.write(buffer,writePos,BLOCKSIZE);
 readPos += bytesRead;
 writePos += BLOCKSIZE;
 buffer = new byte[BLOCKSIZE];
}
下面是抛出的异常:“线程中的异常”main“java.lang.IndexOutOfBoundsException 在java.io.BufferedInputStream.read处(BufferedInputStream.java:327) 位于JavaPigz.main(JavaPigz.java:73)”

第73列是inStream.read(…)语句。基本上,我想从stdin中读取一次128kb字节,然后将其写入stdout,然后返回读取另一个128kb块,依此类推。同样的异常也被抛出到outStream.write()中

我做了一些调试,它看起来是BufferedInputStream缓冲区,最多64kb块一次。我不知道这是不是真的。多谢各位

编辑:我也试过这样做 InputStream inStream=新的BufferedInputStream(系统英寸,块大小); 指定所需缓冲块的大小。但事实证明它的大小一直是64kb
无论指定了什么

您都在增加循环中的
readPos
(和
writePos
)。随后的读取将从该偏移量开始,以便插入
缓冲区
,并尝试将
块大小
字节写入其中。。。这将不适合,因此会给您一个索引越界错误

编写循环的方式,
readPos
writePos
应该始终是
0
,特别是因为每次都要创建一个新的缓冲区。话虽如此。。。你真的不想这么做,你想重新使用缓冲区。看起来您只是在尝试从输入流读取数据并将其写入输出流

while ((bytesRead = inStream.read(buffer,readPos,BLOCKSIZE)) != -1) {
    outStream.write(buffer,writePos,bytesRead);
}

您的readPos和writePos对应于数组。。。不去小溪

将其设置为0,并将其保留为0


在write调用中,将param 3设置为bytesRead而不是BLOCKSIZE

,类似的推理也适用于写入。BufferedInputStream一次可以从Stdin中缓冲的最大字节数是多少?我在while循环中执行了inStream.available(),每次它都给我65536(最后一次除外)。谢谢。这将取决于底层操作系统和数据源(文件、套接字等)。您很可能看到底层本机代码以64k的速度分块。老实说,当你处理读/写这样的大块时,你真的应该直接从流中读/写。缓冲包装器类用于优化小型读/写操作(