所以到目前为止我有这个代码:
import java.util.*;
import java.io.*;
public class EmailMerge {
public static void main(String[] args) throws IOException {
Scanner templateReader = null;
Scanner peopleReader = null;
PrintWriter out = null;
String template = "";
ArrayList people = new ArrayList();
try {
templateReader = new Scanner(new FileInputStream("template.txt"));
peopleReader = new Scanner(new FileInputStream("people.txt"));
while(templateReader.hasNext()) {
//System.out.print(templateReader.next());
template = templateReader.next();
}
System.out.println(template);
}
catch(FileNotFoundException e)
{
System.out.println("File(s) not found...");
System.exit(0);
}
}
}
我有一个名为template.txt的文本文档,其中包含:
Dear <<N>>,
Because you are <<A>> years old and <<G>>, we have a
free gift for you. You have absolutely nothing to buy;
just pay the shipping and handling charge of $9.99. To
claim your gift, call us immediately.
Thank you,
Office of Claims Department
我还有另一个名为people.txt的文本文档,其中包含人们的姓名和年龄:
John, 38, Male
Mary, 22, Female
so on and so forth...
我要做的是浏览列表中的所有名称,并使用模板制作个性化消息。然后我必须将每个保存到一个独特的文本文档(即John.txt)。我想要做的是将列表中的名称存储到ArrayList中,我调用了人员,然后将模板存储到一个字符串中,我称之为模板。
然而,当我尝试打印模板时,我的问题出现了。如果有更好的方式将其打印出来,我无法判断我是否存储错误,但是当我使用此代码时,我只能得到&#34; Department&#34;打印到屏幕上。我需要将整个事物存储在String模板中,并能够以正确的格式将其打印到屏幕上,如上所述。 请帮助,谢谢一堆!
更新: 非常感谢你们的帮助! 还有一个问题。我终于在项目的最后,我已经将所有必要的信息存储到一些ArrayLists中,但是当我尝试打印模板时它会工作,但它会做大约1000次。这是我正在使用的循环:
for(int j = 0; j < people.size(); j++){
for(int i = 0; i < names.size(); i++){
System.out.println(template.replace("<<N>>", names.get(i)).replace("<<A>>", ages.get(i)).replace("<<G>>", genders.get(i)));
}
}
我将所有名称/年龄/性别存储到相应的ArrayList中。再次感谢!
答案 0 :(得分:2)
您每次都要替换模板字符串变量,而不是更新它(追加)。请尝试以下代码:
template += templateReader.next();
或更好 - 正如Luiggi在评论中所述 - StringBuilder
:
StringBuiler builder = new StringBuilder("");
while(templateReader.hasNext()) {
//System.out.print(templateReader.next());
builder.append(templateReader.next());
}
template = builder.toString();
StringBuffer
比+
运算符提供更好的performance,因此每当您在循环中附加Strings
时 - 就像在此示例中一样 - 最好使用它。
答案 1 :(得分:1)
使用StringBuilder将整个模板保存在字符串中:
StringBuilder sb = new StringBuilder();
while(templateReader.hasNext()){
//System.out.print(templateReader.next());
sb.append(templateReader.next());
}
template = sb.toString();
它比字符串连接更快,特别是如果你的模板很长。
答案 2 :(得分:0)
您可以使用
一次阅读template.txtString template = new Scanner(new File("template.txt")).useDelimiter("\\Z").next(); System.out.println(template);
useDelimiter(“\ Z”)用于一次读取整个文件。
答案 3 :(得分:0)
我建议将其分成小部分,每个部分都作为单独的方法实现:
以这种方式设计代码将允许您单独测试每个部分,并使跟踪逻辑错误更容易。