2013-03-18 68 views
1

我有一個使用一種外部方法擴展TreeMap的類。 外部方法「打開」假設以下面的格式「word:meaning」從給定的文件中讀取行並將其添加到TreeMap中 - put(「word」,「meaning」)。即使密鑰存在,Java TreeMap <String,String>也會返回null

所以我閱讀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(); 
} 

}

+5

爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。不要包括sigs。在問題中,它們是噪音。這個問題在鍵/值的文本中有一些非常奇怪的字符。 – 2013-03-18 19:06:10

+0

請提供一個說明您的問題的最小,完整的例子。 – 2013-03-18 19:08:10

+0

{ A A A A= B B B B, C A B= y a h o o !} ..這是什麼? – 2013-03-18 19:10:41

回答

2

從以前版本的問題的 「問號」 是很重要的。他們表示你認爲你所看到的琴絃並不是你正在使用的琴絃。 RandomAccessFile是閱讀文本文件的糟糕選擇。你大概是閱讀一個文本文件的文本編碼是而不是單字節(UTF-16也許)?由於RandomAccessFile執行「ascii」字符轉換,所以產生的字符串會被錯誤編碼。這導致您的get()調用失敗。

首先,找出文件的字符編碼,並用適當配置的InputStreamReader打開它。

第二,擴展TreeMap是一個非常糟糕的設計。這裏使用聚合,而不是擴展。

相關問題