Java BufferedInputStream.read () IndexOutOfBounds - PullRequest
1 голос
/ 14 марта 2012

Я хочу закодировать метод, который читает части из файлов в байтовые массивы. для этого я использую fileinputstream и буферизованный inputsream.

как это:

fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);

Я делаю это только один раз, вызывая имя метода «OpenFile (String File)». После того, как файл был открыт с помощью этого метода, я пытаюсь работать с функцией: «ReadParts (byte [] buffer, int offset, int len)»

dis.read(buffer, offset, len);            
for(int i = 0; i < buffer.length; i++) System.out.print((char)buffer[i]);

// used data:
// file = "C:\Temp\test.txt" with a size of 949
// buffer: always in this case with a size of 237, except for the last one its 238
// offsets: 0, 237, 474, 711 
// len is always 237, except for the last one its 238

строка dis.read () выбрасывает после первого шага всегда сообщение об ошибке indexOutOfBounds, но я не могу понять, почему и что. использование отладчика netbeans не помогло, так как я не могу найти проблему с индексами .....

Ответы [ 4 ]

1 голос
/ 14 марта 2012

Если вы читаете Stream в массив буферов, ваше смещение и длина всегда должны быть:

offset = 0;
len = buffer.length();

Эти параметры указывают, где данные помещаются в буфер, а НЕ какие данные считываются из потока. Поток читается непрерывно (или как это пишется?)!

Если вы всегда звоните:

buffer = new byte[256];
dis.read(buffer, 0, 256);

Это произойдет: Перед первым вызовом Streamposition (позиция следующего возвращаемого байта) равна 0.

  1. Streamposition после call = 256 и буфер содержит байты 0-255
  2. Streamposition после call = 512 и буфер содержит байты 256-511
  3. ...

    dis.reset ();

Streamposition снова равен 0.

Этот код считывает только байты 256-511 из потока в буфер:

byte[] buffer = new byte[512];
dis.skip(256);
dis.read(buffer, 0, 256);

Обратите внимание, что последние 256 байтов буфера не заполнены. Это одно из различий между read (byte [], int, int) и read (byte [])!

Вот несколько ссылок для вас, которые описывают концепцию потока и использование метода read: чтение () Streams

1 голос
/ 14 марта 2012

как у тебя смещение и лен.Я думаю, сейчас вы смещены + len больше, чем буфер.

0 голосов
/ 14 марта 2012

Вы получите IndexOutOfBoundsException - Если

  • смещение отрицательное,

  • лен отрицательный,

  • len больше, чем buffer.length - off

Пример для пункта 3:

Если во входном файле содержится 500 или 1500 символов, следующая программа будет успешно запущена,

byte[] buffer = new byte[1000];
int offset = 0;
int len = 1000;
dis.read(buffer, offset, len);            
for(int i = 0; i < buffer.length; i++) System.out.print((char)buffer[i]);

Но произойдет сбой и возникнет исключение, если

byte[] buffer = new byte[1000];
int offset = 0;
int len = 1001;
dis.read(buffer, offset, len); 
for(int i = 0; i < buffer.length; i++) System.out.print((char)buffer[i]);

Проверьте значение длины в обоих случаях.

0 голосов
/ 14 марта 2012

Смещение - это смещение в буфере, а не в файле.

Я подозреваю, что вы хотите

byte[] buffer = new byte[237];

int len = dis.read(buffer); // read another 237 bytes.

if (len < 0) throw new EOFException(); // no more data.
for(int i = 0; i < len; i++)
   System.out.print((char)buffer[i]);
// or
System.out.print(new String(buffer, 0, 0, len));

В вашем отладчике вы можете проверить, что смещение> = 0 и смещение+ lengh <= buffer.length? </p>

From InputStream.read ()

public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
    throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
    throw new IndexOutOfBoundsException();

Одно из проверенных условий недопустимо.

...