/* * Copyright 2006 Bradley Schatz. All rights reserved. * * This file is part of pasco2, the next generation Internet Explorer cache * and history record parser. * * pasco2 is free software; you can redistribute it and/or modify * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * pasco2 is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with pasco2; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package isi.pasco2.io; import isi.pasco2.util.StructConverter; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FastReadIndexFile implements IndexFile { ByteBuffer content = null; public FastReadIndexFile(String fileName) throws FileNotFoundException, IOException { File file = new File(fileName); // Create a read-only memory-mapped file FileChannel roChannel = new RandomAccessFile(file, "r").getChannel(); ByteBuffer roBuf = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, (int) roChannel.size()); byte[] buf = new byte[roBuf.limit()]; roBuf.get(buf, 0, roBuf.limit()); content = ByteBuffer.wrap(buf); roChannel.close(); } public FastReadIndexFile(String fileName, InputStream stream, long len) throws FileNotFoundException, IOException { ByteBuffer roBuf = ByteBuffer.allocate((int)len); byte[] buf = roBuf.array(); int offset = 0; int res = 0; while ((res = stream.read(buf, offset, (int)len-offset)) > 0) { offset = offset + res; if (offset == len) { break; } } stream.close(); content = roBuf; } public FastReadIndexFile(String fileName, String mode) throws FileNotFoundException, IOException { this(fileName); } public void seek(long offset) throws IOException { content.clear(); content.position((int) offset); } public int readLittleEndianInt() throws IOException { byte[] bytes = new byte[4]; content.get(bytes, 0, 4); return StructConverter.bytesIntoInt(bytes, 0); } public long readLittleEndianUInt() throws IOException { byte[] bytes = new byte[4]; content.get(bytes, 0, 4); return StructConverter.bytesIntoUInt(bytes, 0); } public int readLittleEndianShort() throws IOException { byte[] bytes = new byte[2]; content.get(bytes, 0, 2); return StructConverter.bytesIntoShort(bytes, 0); } public int read(byte[] buf, int offset, int count) throws IOException { content.get(buf, offset, count); return count; } public int read() throws IOException { return content.get(); } public char readAsciiChar() throws IOException { return (char) content.get(); } public int readUnsignedByte() throws IOException { return content.get(); } public void close() throws IOException { } public String readStringAtOffset(long offset, int length) throws IOException { seek(offset); byte[] dn = new byte[length]; read(dn, 0, length); if (dn[0] == 0) { return new String(); } else { return new String(dn); } } public int readIntAtOffset(long offset) throws IOException { seek(offset); return readLittleEndianInt(); } public long readUIntAtOffset(long offset) throws IOException { seek(offset); return readLittleEndianUInt(); } public int readShortAtOffset(long offset) throws IOException { seek(offset); return readLittleEndianShort(); } }