Записать x байтов со значением y в файл в java - PullRequest
1 голос
/ 03 мая 2011

Я пытаюсь записать в файл определенное количество байтов, скажем, x байтов со значением y.Проблема в том, что я делаю это много времени, и в настоящее время я использую DataOutputStream с BufferedOutputStream и метод записи, который получает массив байтов.Каждый раз я выделяю новый массив байтов длины 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.Обратите внимание, что блок массива может увеличиваться до max int, если nameOccurence [i] достаточно велико.

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

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

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

Использование

String strFileName = "C:/FileIO/BufferedOutputStreamDemo";
FileOutputStream fos = new FileOutputStream(strFileName);
fos.write(yourbytes);
1 голос
/ 03 мая 2011

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

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