1

TreeMap を 1 つの外部メソッドで拡張するクラスがあります。外部メソッド「open」は、指定されたファイルから次の形式「word:meaning」で行を読み取り、それを TreeMap に追加するとします - put("word", "meaning")。

そのため、RandomAccessFile を使用してファイルを読み取り、キーと値を TreeMap に配置します。TreeMap を印刷すると、適切なキーと値が表示されます。次に例を示します。

{AAAA=BBBB, CAB=yahoo!}

しかし、何らかの理由で get("AAAA") を実行すると null が返されます。

それが起こっている理由とそれを解決する方法はありますか?

ここにコードがあります

public class InMemoryDictionary extends TreeMap<String, String> implements
    PersistentDictionary {
private static final long serialVersionUID = 1L; // (because we're extending
                                                    // a serializable class)
private File dictFile;

public InMemoryDictionary(File dictFile) {
    super();
    this.dictFile = dictFile;
}

@Override
public void open() throws IOException {     
    clear();
    RandomAccessFile file = new RandomAccessFile(dictFile, "rw");
    file.seek(0);
    String line;
    while (null != (line = file.readLine())) {
        int firstColon = line.indexOf(":");
        put(line.substring(0, firstColon - 1),
                line.substring(firstColon + 1, line.length() - 1));
    }       
    file.close();
}

@Override
public void close() throws IOException {    
    dictFile.delete();
    RandomAccessFile file = new RandomAccessFile(dictFile, "rw");       
    file.seek(0);
    for (Map.Entry<String, String> entry : entrySet()) {            
        file.writeChars(entry.getKey() + ":" + entry.getValue() + "\n");
    }
    file.close();
}

}

4

1 に答える 1

2

以前のバージョンの質問の「疑問符」は重要です。それらは、あなたが見ていると思っていた文字列が実際にはあなたが使用している文字列ではないことを示しています。RandomAccessFileは、テキストファイルを読み取るのに適していません。おそらく、1バイトではないテキストエンコーディング(おそらくutf-16)のテキストファイルを読んでいますか?RandomAccessFileは「ASCII」文字変換を行うため、結果の文字列は誤ってエンコードされます。これにより、get()呼び出しが失敗します。

まず、ファイルの文字エンコードを把握し、適切に構成されたInputStreamReaderで開きます。

次に、TreeMapの拡張は非常に貧弱な設計です。ここでは、拡張子ではなく集計を使用します。

于 2013-03-18T19:27:37.087 に答える