OutputStream с ByteArrayOutputStream пишет частично, затем останавливается - PullRequest
0 голосов
/ 28 марта 2019

, поэтому я пытаюсь записать несколько int в файл на 1000 ints, используя байтовый массив, но он делает это только один раз (я подтвердил это с помощью hexeditor), когда мне нужно около 1000, и я понятия не имею, почему этофактически делает первое, но затем останавливается. Это ошибки, которые возникают: Исключение в потоке "main" java.lang.IndexOutOfBoundsException в java.io.ByteArrayOutputStream.write (Неизвестный источник) в java.io.DataOutputStream.write(Неизвестный источник) на test.Class1.main (Class1.java:32)

 public class Class1 {



    static byte[] buf=new byte[1000];

        public static void main(String[] args) throws IOException {

            ByteArrayOutputStream BOS = new ByteArrayOutputStream() ;
            DataOutputStream DOS = new DataOutputStream(BOS);

            RandomAccessFile MyFile = new RandomAccessFile ("myfile.dat", "rw");
            int acc=0;

            int k=0;
            for( k=0;k<100;k++) {

                buf=bufferFiller( buf);         
                DOS.write(buf, k*1000, buf.length); 
                acc++;
            }

        }           
        public static byte[] bufferFiller(byte[] buf) {
            int i=0;
            int  randomNum=0;
            for(i=0;i<1000;i++) {
                buf[i]=(byte) (randomNum = -50000 + (int)(Math.random() * ((100000) + 1)));
            }
            return buf;
        }
    }

1 Ответ

0 голосов
/ 28 марта 2019

Из вопроса ОП проблема заключалась в использовании смещения в буфере.

Javadoc для DataOutputStream.write (выделение добавлено)

public void write (byte [] b, int off, int len) выдает IOException

Записывает len байтов из указанного байтового массива , начиная со смещения с , в основной выходной поток. Если исключение не выдается, значение счетчика увеличивается на len.

Итак, java.lang.IndexOutOfBoundsException был результатом этой строки:

DOS.write(buf, k*1000, buf.length); 

Всегда используя «0» для смещения, .write(...) запишет количество байтов (в данном случае длину буфера), начиная с от смещения (которое должно быть 0 ). ОП всегда хорошо заполнял буфер в каждой итерации цикла.

Так что меняется на что-то вроде:

for( k=0;k<100;k++) {
  buf=bufferFiller( buf);         
  DOS.write(buf, 0, buf.length); 
  acc++;
}

должен решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...