我是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的大小 无论指定什么
答案 0 :(得分:3)
您在循环中增加readPos
(和writePos
)。后续读取从该偏移量开始,用于插入buffer
,并尝试将BLOCKSIZE
个字节写入其中...这将不适合,从而为您提供索引超出范围的错误。 / p>
您编写循环的方式readPos
和writePos
应始终为0
,因为您每次都要创建一个新的缓冲区。那就是说...你真的不想这样做,你想重新使用缓冲区。看起来你只是想从输入流中读取并将其写入输出流...
while ((bytesRead = inStream.read(buffer,readPos,BLOCKSIZE)) != -1) {
outStream.write(buffer,writePos,bytesRead);
}
答案 1 :(得分:0)
你的readPos和writePos对应于数组...而不是流...
将它们设置为0并将它们保留为0
在你的写调用中将param 3设置为bytesRead而不是BLOCKSIZE