Запишите x байт со значением y в файл на java

#java #io

#java #io

Вопрос:

Я пытаюсь записать в файл определенное количество байт, скажем, x байт, со значением y . Проблема в том, что я делаю это много раз, и в настоящее время я использую DataOutputStream с BufferedOutputStream и метод write, который получает массив байт. Каждый раз, когда я выделяю новый массив байтов длиной x и записываю его. Это расточительно, и мне интересно, есть ли более эффективный способ? Спасибо.

Редактировать: я реализовал это, выделив большой массив, который растет в зависимости от спроса, но проблема в том, что я храню его, и он может стать очень большим. Код:

  byte[] block = new byte[4096];
    try {
        for(int i=0; i<nameOccurence.length;   i){
            if(nameOccurence[i] >= block.length){
                int size = ((Integer.MAX_VALUE - nameOccurence[i]) <= 0.5*Integer.MAX_VALUE) ? Integer.MAX_VALUE : (nameOccurence[i] * 2);
                block = new byte[size];
            }
            if(nameOccurence[i] == 0){
                namePointer[i] = -1;//i.e. there are no vertices with this name
                continue;
            }
            namePointer[i] = byteCounter;

            ds.writeInt(nameOccurence[i]);
            ds.write(block, 0, nameOccurence[i]*2);
            ds.write(block, 0, nameOccurence[i]*2);
            byteCounter  = (4*((long)nameOccurence[i])) 4;//because we wrote an integer.
        }
  

где ds — это DataOutputStream. Пожалуйста, обратите внимание, что блок массива может увеличиться до максимального значения int, если значение nameOccurence[i] достаточно велико.

Я думаю, что лучший способ — найти максимальное число для всех i в nameOccurence и выделить массив такой длины. Проблема в том, что он может получить целое число.MAX_VALUE.

Может быть, будет лучше запускать цикл и записывать по 1 байту каждый раз? пожалуйста, обратите внимание, что в основе DataOuputStream лежит BufferedOutputStream.

Комментарии:

1. Пожалуйста, покажите нам код, который вы получили на данный момент.

2. Если вы записываете одно и то же значение неоднократно, зачем вам больше одного byte[] . Если вы используете большой byte[] зачем вам BuffereOutputStream?

3. Вы можете использовать Arrays.fill() для заполнения byte[] . Но если бы не было доказано , что это узкое место, меня бы это не волновало.

Ответ №1:

Использовать

 String strFileName = "C:/FileIO/BufferedOutputStreamDemo";
FileOutputStream fos = new FileOutputStream(strFileName);
fos.write(yourbytes);
  

Комментарии:

1. все в порядке, но я хочу, чтобы это было более эффективно, поэтому, пожалуйста, прочитайте мою правку.

Ответ №2:

Если вы не хотите каждый раз выделять новый массив, выделите массив, который определенно будет достаточно большим для вашего X, сохраните его где-нибудь в своем классе, затем, когда вам нужно будет его записать, заполните его значением Y, и вы сможете указать, сколько байт из массива записать в OutputStream.write(byte[] b, int off, int len) метод. Кроме того, вам не нужно DataOutputStream записывать байты, достаточно просто BufferedOutputStream .