Java 具有LinkedHashMap的多维字节数组。。。有更好的办法吗?

Java 具有LinkedHashMap的多维字节数组。。。有更好的办法吗?,java,multidimensional-array,linkedhashmap,Java,Multidimensional Array,Linkedhashmap,我对Java编程非常陌生,所以请原谅我的新问题:) 我正在使用LinkedHashMap作为我正在修改的应用程序的文件缓存,以帮助开发。我这样做是为了减少I/O开销,从而提高性能。这样做的问题是,开销是以许多其他方式引入的 相关消息来源如下 下面是我用来保存数据的方法。加载数据的方法正好相反 这是缓存的声明 private静态LinkedHashMap缓存=新LinkedHashMap(64,1.1f,true) {受保护的布尔重构(Map.Entry-eldest) { 返回大小()

我对Java编程非常陌生,所以请原谅我的新问题:)

我正在使用LinkedHashMap作为我正在修改的应用程序的文件缓存,以帮助开发。我这样做是为了减少I/O开销,从而提高性能。这样做的问题是,开销是以许多其他方式引入的

相关消息来源如下



下面是我用来保存数据的方法。加载数据的方法正好相反



这是缓存的声明


private静态LinkedHashMap缓存=新LinkedHashMap(64,1.1f,true)
{受保护的布尔重构(Map.Entry-eldest)
{
返回大小()>64;
}
}

因为我对Java流礼仪非常不熟悉,所以很可能上面的代码看起来很马虎。我还确信有更有效的方法来完成上述工作,例如将缓冲区放置在何处

无论如何,我的主要问题是:每当我需要对单个块执行任何操作时,我必须将所有网格数据转换为一个对象,将其发送到缓存,然后写入文件。这是一种非常低效的做事方式。我想知道是否有更好的方法来做这件事,这样我就不必得到();整个字节[8][8][]数组,而我只需要访问该块。我很想做一些像chunk=cache.get[cx]cz这样的事情,但我确信这并不是那么简单

无论如何,正如我之前所说,如果答案显而易见,请原谅这个问题,我只是一个卑微的新手:D。我非常感谢任何意见:)


谢谢。

如果您的目标是减少I/O开销,那么将
字节[]【】【】【】
对象放在包装器对象中,添加脏标志的概念如何


通过这种方式,您可以减少修改文件时写入的次数,仅当您使用缓存完成或将要在插入完整缓存时删除最旧的对象时,才将脏对象写入磁盘。

我将首先创建一个新类,称之为
ByteMatrix3D
,以保存数据。而不是使用
字节[][]
,我会使用带有计算偏移量的一维数组(例如,在8x8x8数组中,
[1][2][3]的偏移量)
可以计算为
1*64+2*8+3
。此更改将消除相当多的对象管理开销,并允许您在不影响更高级别代码的情况下进行其他更改

我要做的第一个改变是使用
MappedByteBuffer
访问文件。这将让操作系统管理实际数据,并使读写对程序透明

// Retrieve Data From LinkedHashMap  
byte grid[][][] = null;  
if(file.exists())
{  
    if (!cache.containsKey(file))  
    {
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(fis, 16384);
        ObjectInputStream ois = new ObjectInputStream(bis);
        cache.put(file, ois.readObject());
        ois.close();
    }
    grid = (byte[][][]) cache.get(file);
} else {
    grid = new byte[8][8][];
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gos = new GZIPOutputStream(baos){{    def.setLevel(2);}};
BufferedOutputStream bos = new BufferedOutputStream(gos, 16384);
DataOutputStream dos = new DataOutputStream(bos);
// Some code writes to dos
dos.close();
byte[cx][cz] = baos.toByteArray();
baos.close();
cache.put(file, grid);
private static LinkedHashMap<File, Object> cache = new LinkedHashMap<File, Object>(64, 1.1f, true)
{protected boolean removeEldestEntry(Map.Entry<File, Object> eldest) 
    {
        return size() > 64;
    }
}