Можно ли оптимизировать код

Есть код, который выполняет простую задачу - сохраняет текущее состояние элементов 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);
        }
    }

Ответы (0 шт):