Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java树映射<;字符串,字符串>;即使密钥存在,也返回null_Java - Fatal编程技术网

Java树映射<;字符串,字符串>;即使密钥存在,也返回null

Java树映射<;字符串,字符串>;即使密钥存在,也返回null,java,Java,我有一个类,它用一个外部方法扩展TreeMap。 外部方法“open”假设从给定文件中读取以下格式的行“word:means”,并将其添加到TreeMap-put(“word”,“means”) 因此,我使用RandomAccessFile读取文件,并将键值放入树状图中,当我打印树状图时,我可以看到正确的键和值,例如: {AAAA=BBBB, CAB=yahoo!} 但由于某种原因,当我得到(“AAAA”)时,我得到空值 发生这种情况的原因以及如何解决 这是密码 public class In

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

因此,我使用RandomAccessFile读取文件,并将键值放入树状图中,当我打印树状图时,我可以看到正确的键和值,例如:

{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();
}
MemoryDictionary中的公共类扩展了TreeMap实现
持久字典{
private static final long serialVersionUID=1L;//(因为我们正在扩展
//可序列化类)
私有文件;
公共InMemoryDictionary(文件dictFile){
超级();
this.dictFile=dictFile;
}
@凌驾
public void open()引发IOException{
清除();
RandomAccessFile文件=新的RandomAccessFile(dictFile,“rw”);
查找文件(0);
弦线;
而(null!=(line=file.readLine()){
int firstColon=line.indexOf(“:”);
put(第行子字符串(0,第一个冒号-1),
line.substring(第一个冒号+1,line.length()-1));
}       
file.close();
}
@凌驾
public void close()引发IOException{
dictFile.delete();
RandomAccessFile文件=新的RandomAccessFile(dictFile,“rw”);
查找文件(0);
对于(Map.Entry:entrySet()){
file.writeChars(entry.getKey()+”:“+entry.getValue()+”\n”);
}
file.close();
}
}

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

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


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

要更快获得更好的帮助,请发布一个。不要包括SIG。在问题中,它们是噪音。这个问题在键/值的文本中有一些非常奇怪的字符。请提供一个最小的完整示例来说明您的问题{�A.�A.�A.�A=�B�B�B�B�C�A.�B=�Y�A.�H�o�o�!}..这是什么?忽略问号,刷新页面…@gilsilas:你也可以发布代码,在那里打印
{AAAA=BBBB,CAB=yahoo!}
,然后接收
.get(“AAAA”);