从文本文档存储字符串并将其打印到屏幕

时间:2014-09-05 00:46:46

标签: java arraylist

所以到目前为止我有这个代码:

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中。再次感谢!

4 个答案:

答案 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.txt
    String template = new Scanner(new File("template.txt")).useDelimiter("\\Z").next();
    System.out.println(template);

useDelimiter(“\ Z”)用于一次读取整个文件。

答案 3 :(得分:0)

我建议将其分成小部分,每个部分都作为单独的方法实现:

  • 使用名称和其他数据读取文件的一种方法
  • 读取模板的一种方法
  • 替换&#34;字段的一种方法&#34;在具有正确数据的模板中

以这种方式设计代码将允许您单独测试每个部分,并使跟踪逻辑错误更容易。