我有一个用一个外部方法扩展TreeMap的类。 外部方法“open”假设以下列格式“word:meaning”读取给定文件中的行,并将其添加到TreeMap - put(“word”,“含义”)。
所以我用RandomAccessFile读取文件并将键值放在TreeMap中,当我打印TreeMap时,我可以看到正确的键和值,例如:
{AAAA=BBBB, CAB=yahoo!}
但出于某种原因,当我得到(“AAAA”)时,我得到了空。
为什么会发生这种情况以及如何解决它?
这是代码
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();
}
}
答案 0 :(得分:2)
您问题的先前版本中的“问号”非常重要。它们表明你认为你看到的字符串实际上并不是你正在使用的字符串。 RandomAccessFile是读取文本文件的不良选择。您可能正在阅读文本编码的文本文件不单字节(也许是utf-16)?由于RandomAccessFile执行“ascii”字符转换,因此生成的字符串被错误编码。这导致您的get()
来电失败。
首先,弄清楚文件的字符编码,并使用适当配置的InputStreamReader打开它。
第二,扩展TreeMap是一个非常糟糕的设计。在这里使用聚合,而不是扩展。