X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fengine%2FDictionary.java;h=151bad6b66bfb781fa160c8c2cebe09cc6d935aa;hb=49583e178d3673fd1cade2f306d97303ffbd4a0a;hp=2dba73d602e2f720da547124adf37c3a75e302cb;hpb=20608310f9c77588105f5731935b6a9c9a4749bd;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/engine/Dictionary.java b/src/com/hughes/android/dictionary/engine/Dictionary.java index 2dba73d..151bad6 100644 --- a/src/com/hughes/android/dictionary/engine/Dictionary.java +++ b/src/com/hughes/android/dictionary/engine/Dictionary.java @@ -22,11 +22,14 @@ import com.hughes.util.raf.RAFListSerializer; import com.hughes.util.raf.RAFSerializable; import java.io.DataInput; +import java.io.DataInputStream; import java.io.DataOutput; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.io.RandomAccessFile; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -66,7 +69,8 @@ public class Dictionary implements RAFSerializable { indices = new ArrayList(); } - public Dictionary(final RandomAccessFile raf) throws IOException { + public Dictionary(final FileChannel ch) throws IOException { + DataInput raf = new DataInputStream(Channels.newInputStream(ch)); dictFileVersion = raf.readInt(); if (dictFileVersion < 0 || dictFileVersion > CURRENT_DICT_VERSION) { throw new IOException("Invalid dictionary version: " + dictFileVersion); @@ -77,31 +81,31 @@ public class Dictionary implements RAFSerializable { // Load the sources, then seek past them, because reading them later // disrupts the offset. try { - final RAFList rafSources = RAFList.create(raf, new EntrySource.Serializer( - this), raf.getFilePointer(), dictFileVersion, dictInfo + " sources: "); + final RAFList rafSources = RAFList.create(ch, new EntrySource.Serializer( + this), ch.position(), dictFileVersion, dictInfo + " sources: "); sources = new ArrayList(rafSources); - raf.seek(rafSources.getEndOffset()); + ch.position(rafSources.getEndOffset()); pairEntries = CachingList.create( - RAFList.create(raf, new PairEntry.Serializer(this), raf.getFilePointer(), dictFileVersion, dictInfo + " pairs: "), + RAFList.create(ch, new PairEntry.Serializer(this), ch.position(), dictFileVersion, dictInfo + " pairs: "), CACHE_SIZE); textEntries = CachingList.create( - RAFList.create(raf, new TextEntry.Serializer(this), raf.getFilePointer(), dictFileVersion, dictInfo + " text: "), + RAFList.create(ch, new TextEntry.Serializer(this), ch.position(), dictFileVersion, dictInfo + " text: "), CACHE_SIZE); if (dictFileVersion >= 5) { htmlEntries = CachingList.create( - RAFList.create(raf, new HtmlEntry.Serializer(this), raf.getFilePointer(), dictFileVersion, dictInfo + " html: "), + RAFList.create(ch, new HtmlEntry.Serializer(this), ch.position(), dictFileVersion, dictInfo + " html: "), CACHE_SIZE); } else { htmlEntries = Collections.emptyList(); } if (dictFileVersion >= 7) { - htmlData = RAFList.create(raf, new HtmlEntry.DataDeserializer(), raf.getFilePointer(), dictFileVersion, dictInfo + " html: "); + htmlData = RAFList.create(ch, new HtmlEntry.DataDeserializer(), ch.position(), dictFileVersion, dictInfo + " html: "); } else { htmlData = null; } - indices = CachingList.createFullyCached(RAFList.create(raf, indexSerializer, - raf.getFilePointer(), dictFileVersion, dictInfo + " index: ")); + indices = CachingList.createFullyCached(RAFList.create(ch, new IndexSerializer(ch), + ch.position(), dictFileVersion, dictInfo + " index: ")); } catch (RuntimeException e) { final IOException ioe = new IOException("RuntimeException loading dictionary"); ioe.initCause(e); @@ -131,15 +135,21 @@ public class Dictionary implements RAFSerializable { assert htmlData == null; RAFList.write(raf, htmlEntries, new HtmlEntry.DataSerializer(), 128, true); System.out.println("indices start: " + raf.getFilePointer()); - RAFList.write(raf, indices, indexSerializer); + RAFList.write(raf, indices, new IndexSerializer(null)); System.out.println("end: " + raf.getFilePointer()); raf.writeUTF(END_OF_DICTIONARY); } - private final RAFListSerializer indexSerializer = new RAFListSerializer() { + private final class IndexSerializer implements RAFListSerializer { + private final FileChannel ch; + + public IndexSerializer(FileChannel ch) { + this.ch = ch; + } + @Override public Index read(DataInput raf, final int readIndex) throws IOException { - return new Index(Dictionary.this, raf); + return new Index(Dictionary.this, ch, raf); } @Override @@ -187,7 +197,7 @@ public class Dictionary implements RAFSerializable { RandomAccessFile raf = null; try { raf = new RandomAccessFile(file, "r"); - final Dictionary dict = new Dictionary(raf); + final Dictionary dict = new Dictionary(raf.getChannel()); final DictionaryInfo dictionaryInfo = dict.getDictionaryInfo(); dictionaryInfo.uncompressedFilename = file.getName(); dictionaryInfo.uncompressedBytes = file.length();