我正在用java制作一个聊天机器人,我希望它能够(随机)生成特定主题的首选项,并将首选项写入文件。例如,如果我问聊天机器人"你喜欢蛋糕吗?"而它以前还没有被问过"蛋糕",它会产生一个随机的偏好(正确或错误)。然后,它将自己的偏好写入一个文件("chatbotPreferences.txt"或类似的文件),如果"蛋糕"主题再次出现,可以稍后检索该文件。我遇到的主要问题是每次运行程序时都会覆盖文件。因此,如果我与它讨论"cake",它在文件中写入"cake=true",那么我再次运行它,并询问它关于"pie"one_answers"pie=false"可能出现在文件中的情况,但"cake=true"没有列出
有没有办法防止它被覆盖,或者有人有其他想法吗?谢谢
我不知道如何编写文件,但使用FileWriter
,它非常简单:
将true
作为第二个参数传递给构造函数。
您可以使用Scanner
和String
ArrayList来读取数据,如下所示:
import java.util.*;
Scanner in = new Scanner(new File("chatbotPreferences.txt"));
List<String> things = new ArrayList<String>();
while (in.hasNext())
things.add(in.nextLine());
in.close();
然后,您可以使用ArrayList中的add()
方法将内容添加到列表中,如下所示:
things.add("cake=true");
最后,当需要保存时,只需阅读列表中的所有内容即可。有各种各样的保存方法(听起来你已经这样做了),但这里有一个例子:
import java.io.*;
try {
PrintWriter writer = new PrintWriter("chatbotPreferences.txt");
for (String s : things)
writer.println(s);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
如上所述,您需要向FileWrite构造函数添加true。下面是一个实际操作的示例。如果您多次运行此代码,它将添加文本而不会覆盖。
import java.io.*;
public class FileWriting{
public static void main(String[] args)throws Exception{
FileWriter fw= new FileWriter("test.txt",true); //by adding true you can add to a pre-existing file
PrintWriter pw= new PrintWriter(fw);
pw.println("line 1");
pw.println("line 2");
pw.println("line 3");
pw.println("line 4");
pw.close();
FileReader fr= new FileReader("test.txt");
BufferedReader br= new BufferedReader(fr);
String x;
do{
x= br.readLine();
System.out.println(x);
}while(x!=null);
br.close();
}
}