【问题标题】:HashMap to txt file - writing key & value in Java OOPHashMap 到 txt 文件 - 在 Java OOP 中写入键和值
【发布时间】:2016-03-16 08:45:00
【问题描述】:

我正在创建一个 ChatBox 程序,它响应输入到我的 Java 程序中的关键字。我有一个存储为 HashMap 的响应列表,在外部 txt 文件中。我想创建一个方法,使我能够添加到 HashMap new keysword(key):responses(values) 并因此添加到外部 txt 文件。

我已经在此文本文件中插入了 key: values,但我很难尝试以正确的格式向其中添加新的 keys: values,然后检索它们。

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

当我运行我的代码时,hashMap 确实会写入外部文本文件,所以这似乎可以工作(它将它写入外部文本文件,因此稍后可以由另一种方法使用)。但是,当我再次运行我的程序时,我立即收到一条错误消息,指出;

文件missing-map.txt中对Hello的响应缺失(hello是插入的键)。

看来我要添加的 key:value 是丢失了我在方法中输入的任何内容的“价值”部分。我被告知这可能是我的格式,即它应该以下列方式存储;

    **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类中)>>

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

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

    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 的代码 >>

  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;
}

【问题讨论】:

  • 您的问题在哪里?你提到有一个错误信息,它是什么?
  • 您能否包含您从文件中填充地图的代码?
  • @Perdomoff ...这是错误消息 - 在文件 missing-map.txt 中缺少对 Hello 的响应
  • @Paddyd - 已在底部编辑和添加

标签: java oop hashmap filewriter bluej


【解决方案1】:

您可以使用java.lang.Properties,它基本上是一个可以与.properties 文件交互的HashMap

反过来,属性文件只不过是由 '=' 分隔的键和值的列表

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

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

您可以使用Properties.load()Properties 对象中加载属性文件

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

如果您想将 Properties 对象的状态保存到后备属性文件,只需使用 Properties.store

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 试过了,但现在它说 Missing response for together in file missing-map.txt
    • @Giustiniano 的回答似乎比尝试修复循环内的逻辑要好
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-03
      • 2013-03-25
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      相关资源
      最近更新 更多