我正在创建一个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;
}
答案 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。
属性文件也可以完成上述工作。