1

私はJavaを初めて使用し、現在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];
}

スローされる例外は次のとおりです。「JavaPigz.main(JavaPigz.java:73)のjava.io.BufferedInputStream.read(BufferedInputStream.java:327)のスレッド"main"java.lang.IndexOutOfBoundsExceptionの例外」

73番目の列はinStream.read(...)ステートメントです。基本的に、stdinから128kbバイトを一度読み取り、それをstdoutに書き込んでから、別の128kbチャンクを読み取るために戻ります。同じ例外がoutStream.write()にもスローされます

デバッグを行ったところ、BufferedInputStreamバッファーは最大64kbのチャンクになっているように見えます。これが本当かどうかわからない。ありがとうございました。

編集:InputStream inStream = new BufferedInputStream(System.in、BLOCKSIZE);も試してみました。必要なバッファチャンクのサイズを指定します。しかし、何が指定されていても、64kbのサイズを提供し続けることがわかりました

4

2 に答える 2

3

ループ内のreadPos(および)を増やしています。writePos後続の読み取りは、に挿入するためにそのオフセットで開始され、それにバイトbufferを書き込もうとしBLOCKSIZEます...これは適合しないため、インデックスの範囲外エラーが発生します。

そのループを作成する方法。特に、毎回新しいバッファを作成するため、常にそうする必要がありreadPosます。そうは言っても...あなたは本当にそれをしたくありません、あなたはバッファを再利用したいです。入力ストリームから読み取り、出力ストリームに書き込もうとしているようです...writePos0

while ((bytesRead = inStream.read(buffer,readPos,BLOCKSIZE)) != -1) {
    outStream.write(buffer,writePos,bytesRead);
}
于 2012-02-07T06:10:04.977 に答える
0

readPosとwritePosは配列に対応します...ストリームには対応しません...

それらを0に設定し、0のままにします

書き込み呼び出しで、パラメータ3をBLOCKSIZEではなくbytesReadに設定します

于 2012-02-07T06:12:29.740 に答える