IndexOutOfBoundsException从标准I / O读取和写入时

时间:2012-02-07 06:04:16

标签: java indexoutofboundsexception

我是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个col是inStream.read(...)语句。基本上我想从stdin读取128kb字节并将其写入stdout并返回读取另一个128kb块,依此类推。同样的异常也会抛出到outStream.write()

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

编辑:我也尝试过     InputStream inStream = new BufferedInputStream(System.in,BLOCKSIZE); 指定我想要的缓冲块的大小。但事实证明它不断给出64kb的大小 无论指定什么

2 个答案:

答案 0 :(得分:3)

您在循环中增加readPos(和writePos)。后续读取从该偏移量开始,用于插入buffer,并尝试将BLOCKSIZE个字节写入其中...这将不适合,从而为您提供索引超出范围的错误。 / p>

您编写循环的方式readPoswritePos应始终为0,因为您每次都要创建一个新的缓冲区。那就是说...你真的不想这样做,你想重新使用缓冲区。看起来你只是想从输入流中读取并将其写入输出流...

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

答案 1 :(得分:0)

你的readPos和writePos对应于数组...而不是流...

将它们设置为0并将它们保留为0

在你的写调用中将param 3设置为bytesRead而不是BLOCKSIZE

相关问题