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 }