Add basic index file reader/writer and basic test
This commit is contained in:
79
src/main/java/net/runelite/cache/fs/IndexEntry.java
vendored
Normal file
79
src/main/java/net/runelite/cache/fs/IndexEntry.java
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
package net.runelite.cache.fs;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class IndexEntry
|
||||
{
|
||||
private IndexFile indexFile;
|
||||
private int id, sector, length;
|
||||
|
||||
public IndexEntry(IndexFile indexFile, int id, int sector, int length)
|
||||
{
|
||||
this.indexFile = indexFile;
|
||||
this.id = id;
|
||||
this.sector = sector;
|
||||
this.length = length;
|
||||
}
|
||||
|
||||
public IndexFile getIndexFile()
|
||||
{
|
||||
return indexFile;
|
||||
}
|
||||
|
||||
public int getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getSector()
|
||||
{
|
||||
return sector;
|
||||
}
|
||||
|
||||
public int getLength()
|
||||
{
|
||||
return length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
int hash = 7;
|
||||
hash = 19 * hash + Objects.hashCode(this.indexFile);
|
||||
hash = 19 * hash + this.id;
|
||||
hash = 19 * hash + this.sector;
|
||||
hash = 19 * hash + this.length;
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
if (obj == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (getClass() != obj.getClass())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
final IndexEntry other = (IndexEntry) obj;
|
||||
if (!Objects.equals(this.indexFile, other.indexFile))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (this.id != other.id)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (this.sector != other.sector)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (this.length != other.length)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
57
src/main/java/net/runelite/cache/fs/IndexFile.java
vendored
Normal file
57
src/main/java/net/runelite/cache/fs/IndexFile.java
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
package net.runelite.cache.fs;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.RandomAccessFile;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class IndexFile
|
||||
{
|
||||
private static final Logger logger = LoggerFactory.getLogger(IndexFile.class);
|
||||
private static final int INDEX_ENTRY_LEN = 6;
|
||||
|
||||
private int indexFileId;
|
||||
private RandomAccessFile idx;
|
||||
private final byte[] buffer = new byte[6];
|
||||
|
||||
public IndexFile(int indexFileId, File file) throws FileNotFoundException
|
||||
{
|
||||
this.indexFileId = indexFileId;
|
||||
this.idx = new RandomAccessFile(file, "rw");
|
||||
}
|
||||
|
||||
public synchronized void write(IndexEntry entry) throws IOException
|
||||
{
|
||||
idx.seek(entry.getId() * INDEX_ENTRY_LEN);
|
||||
|
||||
buffer[0] = (byte) (entry.getLength() >> 16);
|
||||
buffer[1] = (byte) (entry.getLength() >> 8);
|
||||
buffer[2] = (byte) entry.getLength();
|
||||
|
||||
buffer[3] = (byte) (entry.getSector() >> 16);
|
||||
buffer[4] = (byte) (entry.getSector() >> 8);
|
||||
buffer[5] = (byte) entry.getSector();
|
||||
|
||||
idx.write(buffer);
|
||||
}
|
||||
|
||||
public synchronized IndexEntry read(int id) throws IOException
|
||||
{
|
||||
idx.seek(id * INDEX_ENTRY_LEN);
|
||||
int i = idx.read(buffer);
|
||||
if (i != INDEX_ENTRY_LEN)
|
||||
logger.warn("short read");
|
||||
|
||||
int length = ((buffer[0] & 0xFF) << 16) | ((buffer[1] & 0xFF) << 8) | (buffer[2] & 0xFF);
|
||||
int sector = ((buffer[3] & 0xFF) << 16) | ((buffer[4] & 0xFF) << 8) | (buffer[5] & 0xFF);
|
||||
|
||||
return new IndexEntry(this, id, sector, length);
|
||||
}
|
||||
|
||||
public synchronized int getIndexCount() throws IOException
|
||||
{
|
||||
return (int)(idx.length() / INDEX_ENTRY_LEN);
|
||||
}
|
||||
}
|
||||
20
src/test/java/net/runelite/cache/fs/IndexFileTest.java
vendored
Normal file
20
src/test/java/net/runelite/cache/fs/IndexFileTest.java
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
package net.runelite.cache.fs;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class IndexFileTest
|
||||
{
|
||||
@Test
|
||||
public void test1() throws IOException
|
||||
{
|
||||
File file = new File("d:/rs/07/test/test.dat");
|
||||
IndexFile index = new IndexFile(5, file);
|
||||
IndexEntry entry = new IndexEntry(index, 7, 8, 9);
|
||||
index.write(entry);
|
||||
IndexEntry entry2 = index.read(7);
|
||||
Assert.assertEquals(entry, entry2);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user