diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/DictionaryData.java b/icu4j/main/classes/core/src/com/ibm/icu/text/DictionaryData.java index f24970e3cb..5665fb16cf 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/text/DictionaryData.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/text/DictionaryData.java @@ -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; } }