HashMap到txt文件 - 写入密钥& Java OOP中的值

时间:2015-12-10 16:09:18

标签: java oop hashmap filewriter bluej

我正在创建一个ChatBox程序,该程序响应键入我的Java程序的关键字。我有一个存储为HashMap的响应列表,位于外部txt文件中。我想创建一个方法,使我能够添加到HashMap新的关键字(键):响应(值),因此,添加到外部txt文件。

我已经有了key:值插入到这个文本文件中,但是我很难尝试添加新的键:值,格式正确,然后检索它们。

我有一个名为' addtoresponses()'应该从方法中获取字符串参数并将它们插入到hashMap中。然后使用另一个名为' listMap'的类,使用另一种方法将hashMap写入txt文件。

当我运行我的代码时,hashMap会写入外部文本文件,因此它似乎可以工作(它将它写入外部文本文件,因此稍后可以被其他方法使用)。但是,当我再次运行我的程序时,我立即收到一条错误消息,说明这一点;

缺少文件missing-map.txt中的Hello响应(hello是插入的密钥)。

似乎关键:我加入的价值是失去“价值”'我输入我的方法的一部分。我被告知它可能是我的格式,即它应该以下列方式存储;

    **key
    response all on one line of length
    key
    another response all on one line
    etc.**

但我不知道如何实现这一目标。我很确定它不是将HashMap插入txt文件的方法。我相信我是如何将这些值放入HashMap的,但我并不十分自信。

非常感谢有人可以查看我的代码并尝试查看我出错的地方,以及出现此错误消息的原因以及我如何解决它。

我已在下面发布了代码;

InstructorMode的构造函数>>

public InstructorMode()
{
    helper = new FileAssistance();
    edits = new HashMap<String, String>();
}

添加到HashMap的方法(在InstructorMode类中)&gt;&gt;

public void addtoresponse(String key, String value)
{
    edits.put(key, value); 
    helper.listaMap(edits, "missing-map.txt");
}

添加到外部txt文件的方法(名为FileAssistance的类)&gt;&gt;

    public void listaMap(HashMap<String, String> map, String filename)
     {
    if(map != null) {
        try (FileWriter writer = new FileWriter(filename, true)) {
            for(String key : map.keySet()) {
                String value = map.get(key);
                if(value == null) {
                    System.out.println("Warning: " +
                                       key + " in listaMap.");
                    value = "Not sure";
                }
                writer.write(key.trim());
                writer.write('\n');
                writer.write(value.trim());
                writer.write('\n');
            }                    
            writer.close();
        }
        catch(IOException e) {
            System.out.println("Issue: " + filename +
                               " in listaMap");
        }
    }
    else {
        System.out.println("Null map passed to listaMap.");
    }
}

非常感谢您的帮助!

编辑 - 读取HashMap的代码&gt;&gt;

  public HashMap<String, String> lookatM(String filename)
    {
    HashMap<String, String> map = new HashMap<>();
    try (BufferedReader reader =
            new BufferedReader(new FileReader(filename))) {
        String word;
        word = reader.readLine();
        while(word != null) {
            String response = reader.readLine();
            if(response != null) {
                response = response.trim();
                if(response.length() != 0) {
                    map.put(word, response);
                }
                else {
                    System.out.println("Blank response for " +
                                       word + " in file " +
                                       filename);
                }
            }
            else {
                System.out.println("Missing response for " +
                                   word + " in file " +
                                   filename);
            }
            word = reader.readLine();
        }
    }
    catch(IOException e) {
        System.out.println("Problem reading file: " + filename +
                           " in LookatM");
    }
    return map;
}

3 个答案:

答案 0 :(得分:1)

您可以使用java.lang.Properties,它基本上是HashMap,可以与.properties文件进行交互。

反过来,属性文件只不过是由'='

分隔的键和值列表

例如,您可以拥有包含以下内容的属性文件:

Name=Sauron    
Attitude=Nice in a peculiar way
[...]

您可以使用Properties

Properties.load()对象中加载属性文件

如果要添加更多键/值对,只需使用方法Properties.setProperty()

如果要将Properties对象的状态保存到支持属性文件,只需使用Properties.store

有关详细信息,请参阅Properties javadoc

此外,here您可以找到有关如何在代码中使用“属性”的教程

答案 1 :(得分:0)

你在循环中执行reader.readLine两次,这就是输出消息的原因。你应该使用'标准'

while((word = reader.readLine()) != null){
 //loop body
}

答案 2 :(得分:0)

我还没有尝试在我的计算机上运行您的代码,但仅通过查看您的代码段,这些建议很少 -
 1.请检查文件中包含键值行的任何隐藏字符。还有一件事要检查文件末尾是否有空换行  2.还有一件事要检查文件中的最后一个键值对是否收到此错误。
 3.我知道这很明显,但IDE中的调试也很有用!  

最后一点,如果你必须将地图存储到文件中并从文件重建,那么你可以将地图对象序列化为文件并从该序列化文件重建对象。这是我在网上找到的简单教程tutorial。 属性文件也可以完成上述工作。