gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:03:57 26 4
gpt4 key购买 nike

我是 Java 的新手,目前正在用它做一些实验。我写了一个小程序来读取和写入标准 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];
}

这里是抛出的异常:"Exception in thread "main"java.lang.IndexOutOfBoundsException 在 java.io.BufferedInputStream.read(BufferedInputStream.java:327) 在 JavaPigz.main(JavaPigz.java:73)”

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

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

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

最佳答案

您正在增加循环中的readPos(和writePos)。随后的读取从插入到您的 buffer 的偏移量开始,并尝试将 BLOCKSIZE 字节写入其中……这不适合,因此给您一个索引越界错误。

你编写循环的方式,readPoswritePos 应该总是 0 特别是因为你每次都在创建一个新的缓冲区.话虽这么说......你真的不想这样做,你想重新使用缓冲区。看起来你只是想从输入流中读取并将其写入输出流......

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

关于java - IndexOutOfBoundsException 从标准 I/O 读取和写入时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9171714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com