2014-09-05 90 views
0

所以我到目前爲止這樣的代碼:存儲字符串從文本文件和打印到屏幕

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... 

我有什麼牛逼o do是通過列表中的所有名稱並使用該模板創建個性化消息。然後我必須將每個文件保存爲一個獨特的文本文件(即John.txt)。我想要做的是將列表中的名稱存儲到一個ArrayList中,我稱之爲人,然後將模板存儲到一個字符串中,我稱之爲模板。

但是,當我嘗試打印出模板時,出現了我的問題。如果有更好的方法打印出來,我不知道是否存儲錯誤,但是當我使用此代碼時,我只是將「部門」打印到屏幕上。我需要將整個事情存儲在字符串模板中,並能夠以正確的格式將其打印到屏幕上,如上所述。 請幫助,感謝一束!

更新: 非常感謝你們的幫助! 還有一個問題。我終於在項目結束時將所有必要的信息存儲到了幾個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

您的while循環不斷分配/覆蓋新的東西到'template'字符串。你唯一真正打印的是最後一個。 – csmckelvey 2014-09-05 00:51:04

回答

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

甚至更​​好:使用'StringBuilder'。 – 2014-09-05 00:51:16

1

使用StringBuilder整個模板保存在一個字符串:

StringBuilder sb = new StringBuilder(); 
while(templateReader.hasNext()){ 
    //System.out.print(templateReader.next()); 
    sb.append(templateReader.next()); 
} 
template = sb.toString(); 

這是特別是如果你的模板比長字符串連接速度更快。

0

您可以閱讀一次全部使用

 
    String template = new Scanner(new File("template.txt")).useDelimiter("\\Z").next(); 
    System.out.println(template); 

useDelimiter( 「\ Z」)的template.txt用於讀取整個文件一次。

0

我建議打破這種成小部分,它們各自實現爲一個單獨的方法:

  • 一種方法與姓名和其他數據
  • 一種方法在文件中讀取模板
  • 閱讀
  • 一種方法在模板中使用正確的數據

設計代碼這種方式可以讓你單獨測試每一塊並使其EASI取代「田」呃追蹤邏輯錯誤。

相關問題