Можно ли оптимизировать код
Есть код, который выполняет простую задачу - сохраняет текущее состояние элементов Map, а именно X и Y элемента Map и его основное содержимое - массив объектов, имеющих аттрибуты: x,y,z и имя (число). Я хочу, чтобы запись на диск и чтение происходили максимально быстро. Вроде как, BufferedInput/OutputStream обеспечивает наилучшую скорость чтения-записи, но в процессе приходится применять кучу методов, чего не было при применении DataInput/OutputStream. То есть код вида:
...
os.write(Int);
...
is.readInt();
...
Превратился в:
...
os.write(ByteBuffer.allocate(4).putInt(X).array());
...
IntBuffer ib = ByteBuffer.wrap(is.readAllBytes()).asIntBuffer();
ib.get();
...
Дополнительные взаимодействия с данными перед записью кажутся мне избыточными. Можно ли это как-то сделать лучше? Весь блок код тут:
ArrayList<int[]> objectsI = new ArrayList<int[]>();
ArrayList<Integer> objects = new ArrayList<Integer>();
Map<String,tile> tiles;
int Pos;
tile(int x, int y){
X = x;
Y = y;
}
public void save(String map) {
BufferedOutputStream os1 = null;
BufferedOutputStream os2 = null;
try {
os1 = new BufferedOutputStream(new FileOutputStream(map+"_tiles.bin"));
os2 = new BufferedOutputStream(new FileOutputStream(map+"_map.bin"));
} catch (IOException e) {
System.out.println(e);
}
for (int x = -10; x < 10; x++)
for (int y = -10; y < 10; y++)
if (tiles.get(x+"."+y) != null)
save(x,y,map);
Pos = 0;
}
public void save(int X, int Y, String map) {
BufferedOutputStream os1 = null;
BufferedOutputStream os2 = null;
try {
os1 = new BufferedOutputStream(new FileOutputStream(map+"_tiles.bin",true));
os2 = new BufferedOutputStream(new FileOutputStream(map+"_map.bin",true));
tile t = tiles.get(X+"."+Y);
if (t != null) {
os1.write(ByteBuffer.allocate(4).putInt(X).array());
os1.write(ByteBuffer.allocate(4).putInt(Y).array());
os1.write(ByteBuffer.allocate(4).putInt(Pos).array());
os1.close();
os2.write(ByteBuffer.allocate(4).putInt(t.objects.size()).array());
Pos = Pos + 1 + t.objects.size()*4;
for (int i = 0; i < t.objects.size(); i++) {
os2.write(ByteBuffer.allocate(4).putInt(t.objects.get(i)).array());
int[] I = t.objectsI.get(i);
os2.write(ByteBuffer.allocate(4).putInt(I[0]).array());
os2.write(ByteBuffer.allocate(4).putInt(I[1]).array());
os2.write(ByteBuffer.allocate(4).putInt(I[2]).array());
}
os2.close();
}
} catch (IOException e) {
System.out.println(e);
}
}
public void load(String map) {
BufferedInputStream is1 = null;
BufferedInputStream is2 = null;
IntBuffer ib1 = null;
IntBuffer ib2 = null;
try {
is1 = new BufferedInputStream(new FileInputStream(map+"_tiles.bin"));
ib1 = ByteBuffer.wrap(is1.readAllBytes()).asIntBuffer();
is1.close();
is2 = new BufferedInputStream(new FileInputStream(map+"_map.bin"));
ib2 = ByteBuffer.wrap(is2.readAllBytes()).asIntBuffer();
is2.close();
} catch (IOException e) {
}
for (int x = -10; x < 10; x++)
for (int y = -10; y < 10; y++) {
read(x,y,ib1,ib2);
ib1.position(0);
ib2.position(0);
}
}
public void read(int X, int Y, IntBuffer ib1, IntBuffer ib2) {
int pos = -1;
while(ib1.remaining() != 0) {
int x = ib1.get();
if (x != X) {
ib1.position(ib1.position()+2);
continue;
}
int y = ib1.get();
if (y == Y) {
pos = ib1.get();
break;
}
ib1.position(ib1.position()+1);
}
if (pos != -1) {
ib2.position(pos);
tile t = new tile(X,Y);
int size = ib2.get();
for (int i = 0; i < size; i++) {
t.objects.add(ib2.get());
t.objectsI.add(new int[] {ib2.get(),ib2.get(),ib2.get()});
}
tiles.put(X+"."+Y,t);
}
}