]> granicus.if.org Git - icu/commitdiff
ICU-10944 Switch DictionaryData to use ByteBuffer.
authorFredrik Roubert <roubert@google.com>
Tue, 15 Jul 2014 21:14:31 +0000 (21:14 +0000)
committerFredrik Roubert <roubert@google.com>
Tue, 15 Jul 2014 21:14:31 +0000 (21:14 +0000)
R=markus.icu@gmail.com

Review URL: https://codereview.appspot.com/106610043

X-SVN-Rev: 36041

icu4j/main/classes/core/src/com/ibm/icu/text/DictionaryData.java

index f24970e3cb62c18b271e5d7efab756e984dfe25a..5665fb16cf701d1bd8f75bf47b553d58dc1c5511 100644 (file)
@@ -1,14 +1,15 @@
 /*
  *******************************************************************************
- * Copyright (C) 2012, International Business Machines Corporation and         *
- * others. All Rights Reserved.                                                *
+ * Copyright (C) 2012-2014, International Business Machines Corporation and
+ * others. All Rights Reserved.
  *******************************************************************************
  */
+
 package com.ibm.icu.text;
 
-import java.io.DataInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.ByteBuffer;
 
 import com.ibm.icu.impl.Assert;
 import com.ibm.icu.impl.ICUBinary;
@@ -39,26 +40,25 @@ final class DictionaryData {
     public static final int IX_RESERVED7 = 7;
     public static final int IX_COUNT = 8;
 
-    private static final byte DATA_FORMAT_ID[] = { (byte) 0x44, (byte) 0x69,
-        (byte) 0x63, (byte) 0x74 };
-    
+    private static final int DATA_FORMAT_ID = 0x44696374;
+
     public static DictionaryMatcher loadDictionaryFor(String dictType) throws IOException {
         ICUResourceBundle rb = (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUResourceBundle.ICU_BRKITR_BASE_NAME);
         String dictFileName = rb.getStringWithFallback("dictionaries/" + dictType);
         dictFileName = ICUResourceBundle.ICU_BUNDLE +ICUResourceBundle.ICU_BRKITR_NAME+ "/" + dictFileName;
         InputStream is = ICUData.getStream(dictFileName);
-        ICUBinary.readHeader(is, DATA_FORMAT_ID, null);
-        DataInputStream s = new DataInputStream(is);
+        ByteBuffer bytes = ICUBinary.getByteBufferFromInputStream(is);
+        ICUBinary.readHeader(bytes, DATA_FORMAT_ID, null);
         int[] indexes = new int[IX_COUNT];
         // TODO: read indexes[IX_STRING_TRIE_OFFSET] first, then read a variable-length indexes[]
         for (int i = 0; i < IX_COUNT; i++) {
-            indexes[i] = s.readInt();
+            indexes[i] = bytes.getInt();
         }
         int offset = indexes[IX_STRING_TRIE_OFFSET];
         Assert.assrt(offset >= (4 * IX_COUNT));
         if (offset > (4 * IX_COUNT)) {
             int diff = offset - (4 * IX_COUNT);
-            s.skipBytes(diff);
+            ICUBinary.skipBytes(bytes, diff);
         }
         int trieType = indexes[IX_TRIE_TYPE] & TRIE_TYPE_MASK;
         int totalSize = indexes[IX_TOTAL_SIZE] - offset;
@@ -68,7 +68,7 @@ final class DictionaryData {
             byte[] data = new byte[totalSize];
             int i;
             for (i = 0; i < data.length; i++) {
-                data[i] = s.readByte();
+                data[i] = bytes.get();
             }
             Assert.assrt(i == totalSize);
             m = new BytesDictionaryMatcher(data, transform);
@@ -77,14 +77,12 @@ final class DictionaryData {
             int num = totalSize / 2;
             char[] data = new char[totalSize / 2];
             for (int i = 0; i < num; i++) {
-                data[i] = s.readChar();
+                data[i] = bytes.getChar();
             }
             m = new CharsDictionaryMatcher(new String(data));
         } else {
             m = null;
         }
-        s.close();
-        is.close();
         return m;
     }
 }