我有一个用一个外部方法扩展TreeMap的类。
外部方法“ open”假设从给定文件中读取以下格式的行:“ word:意义”,并将其添加到TreeMap中-put(“ word”,“意义”)。

因此,我使用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();
}


}

最佳答案

您问题的先前版本中的“问号”很重要。它们表明您认为您看到的字符串实际上不是您正在使用的字符串。 RandomAccessFile是读取文本文件的不佳选择。您可能正在读取文本格式不是一个字节的文本文件(也许是utf-16)?由于RandomAccessFile会进行“ ascii”字符转换,因此产生的字符串编码错误。这导致您的get()调用失败。

首先,找出文件的字符编码,并使用适当配置的InputStreamReader将其打开。

其次,扩展TreeMap是一个非常糟糕的设计。在这里使用聚合,而不是扩展。

关于java - Java TreeMap <String,String>返回null,即使键存在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15484834/

10-11 20:51