001 package net.minecraft.world.chunk.storage; 002 003 import java.io.DataInputStream; 004 import java.io.DataOutputStream; 005 import java.io.File; 006 import java.io.IOException; 007 import java.util.HashMap; 008 import java.util.Iterator; 009 import java.util.Map; 010 011 public class RegionFileCache 012 { 013 /** A map containing Files as keys and RegionFiles as values */ 014 private static final Map regionsByFilename = new HashMap(); 015 016 public static synchronized RegionFile createOrLoadRegionFile(File par0File, int par1, int par2) 017 { 018 File var3 = new File(par0File, "region"); 019 File var4 = new File(var3, "r." + (par1 >> 5) + "." + (par2 >> 5) + ".mca"); 020 RegionFile var5 = (RegionFile)regionsByFilename.get(var4); 021 022 if (var5 != null) 023 { 024 return var5; 025 } 026 else 027 { 028 if (!var3.exists()) 029 { 030 var3.mkdirs(); 031 } 032 033 if (regionsByFilename.size() >= 256) 034 { 035 clearRegionFileReferences(); 036 } 037 038 RegionFile var6 = new RegionFile(var4); 039 regionsByFilename.put(var4, var6); 040 return var6; 041 } 042 } 043 044 /** 045 * Saves the current Chunk Map Cache 046 */ 047 public static synchronized void clearRegionFileReferences() 048 { 049 Iterator var0 = regionsByFilename.values().iterator(); 050 051 while (var0.hasNext()) 052 { 053 RegionFile var1 = (RegionFile)var0.next(); 054 055 try 056 { 057 if (var1 != null) 058 { 059 var1.close(); 060 } 061 } 062 catch (IOException var3) 063 { 064 var3.printStackTrace(); 065 } 066 } 067 068 regionsByFilename.clear(); 069 } 070 071 /** 072 * Returns an input stream for the specified chunk. Args: worldDir, chunkX, chunkZ 073 */ 074 public static DataInputStream getChunkInputStream(File par0File, int par1, int par2) 075 { 076 RegionFile var3 = createOrLoadRegionFile(par0File, par1, par2); 077 return var3.getChunkDataInputStream(par1 & 31, par2 & 31); 078 } 079 080 /** 081 * Returns an output stream for the specified chunk. Args: worldDir, chunkX, chunkZ 082 */ 083 public static DataOutputStream getChunkOutputStream(File par0File, int par1, int par2) 084 { 085 RegionFile var3 = createOrLoadRegionFile(par0File, par1, par2); 086 return var3.getChunkDataOutputStream(par1 & 31, par2 & 31); 087 } 088 }