#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
.