IndexOutOfBoundsException При чтении и записи из стандартного ввода-вывода - PullRequest
1 голос
/ 07 февраля 2012

Я новичок в Java и в настоящее время делаю некоторые эксперименты на нем. Я написал небольшую программу, которая читает и записывает поток ввода-вывода STD, но я продолжал получать исключения за пределы диапазона. Вот мой код

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 at java.io.BufferedInputStream.read (BufferedInputStream.java:327) at JavaPigz.main (JavaPigz.java:73) "

73-й столбец - это оператор inStream.read (...). По сути, я хочу прочитать 128 килобайт байтов из stdin один раз, записать его в стандартный вывод и вернуться к чтению другого фрагмента 128 килобайт, и так далее, и тому подобное. Это же исключение также выдается outStream.write ()

Я выполнил некоторую отладку и, похоже, буферы BufferedInputStream не превышают порцию по 64 КБ. Не знаю, правда ли это. Спасибо.

Редактировать: я тоже пытался делать InputStream inStream = new BufferedInputStream (System.in, BLOCKSIZE); указать размер буферизованного фрагмента, который я хочу. Но оказывается, что он продолжает давать размер 64 КБ независимо от того, что указано

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Вы увеличиваете readPoswritePos) в цикле.Последующие чтения начинаются с этого смещения для вставки в ваш buffer и пытаются записать в него BLOCKSIZE байт ... что не подходит, что дает вам ошибку индексации за пределами границ.

При написании этого цикла readPos и writePos всегда должны быть 0, особенно если вы каждый раз создаете новый буфер.При этом ... вы действительно не хотите этого делать, вы хотите повторно использовать буфер.Похоже, вы просто пытаетесь прочитать из входного потока и записать его в выходной поток ...

while ((bytesRead = inStream.read(buffer,readPos,BLOCKSIZE)) != -1) {
    outStream.write(buffer,writePos,bytesRead);
}
0 голосов
/ 07 февраля 2012

ваши readPos и ​​writePos соответствуют массиву ... не потоку ...

установите их в 0 и оставьте их в 0

в вашем вызове записи установите параметр 3 в bytesRead вместо BLOCKSIZE

...