内容管理
java檔案I/O執行個體----生成報表
我們之前學習了兩個重要的子產品,一個就是Java I/O 另外一個就是java的界面程式設計,界面程式設計我們已經實踐過了,但是I/O流還沒有實踐過呢,是以接下來将做一個小項目就是列印報表
需求描述
假設有一個履歷模闆檔案,比如resume.template, 檔案内容如下
- 我的名字是(name)
- 我畢業院校是(schoolName)
- 我的所學專業是(major)
要求:根據模闆檔案,生成新的檔案,并替換源檔案模闆中的指定資訊,如生成新的報表檔案如下
我的名字是Echo
我畢業院校是 T大
我的所學專業是 CS
那我們怎麼實作這個功能呢,我們首先要從指定檔案中讀取資訊,之後替換之後我們又要采用寫的方式将新生成的資訊放入到我們的新建立的檔案中去。
那我們先來初步編輯一下
package Luogu;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class PrintResume {//我們的程式分為幾部分
static BufferedReader brFile = null;
static BufferedWriter bwFile = null;
//第一步:讀取模闆檔案的内容
/*
* 這裡是讀取文檔,是讀取的文本檔案,并且有多行,是以
* 我們采用字元流的方式,并且使用BufferedReader
* 裡面的readFile方法非常友善,讀取效率很高
* 這裡是decorator模式,是以我們的裝飾器是都可以裝飾
* 這裡我們查詢檔案可以通過檔案路徑的方式
* 這裡之前沒有提到,就是媒體流中的檔案流中要傳入一個File型的對象,這裡就是我們需建立對象
*/
public static void main(String[] args) {
try {
brFile = new BufferedReader(new FileReader(new File("D:\\\\Java項目\\\\Luogu\\resume.template.txt")));//最裡面一定是媒體流,加上路徑
String line = null;//每行的内容
String load = null;//儲存我們的檔案
//try {可以不用多次選中
while((line = brFile.readLine()) != null)
{
load = load + line;
}
//第二步:替換檔案中特定的資訊
load.replace("(name)", "Echo").replace("(schoolName)", "T大").replace("(major)", "CS");//這裡直接使用的是字元串的替換方法,可以連續使用
//第三步:将新的資訊輸出到指定檔案中
File file = new File("D:\\\\Java項目\\\\Luogu\\new.resum.txt");
bwFile = new BufferedWriter(new FileWriter(file));
bwFile.write(load);
}catch(FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {//try裡面的語句是局部變量在finally裡不可見
try {
bwFile.close();
brFile.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
這裡我們運作就發現了一個問題,檔案是生成了,但是我們點開檔案發現出現了亂碼
null鎴戠殑鍚嶅瓧鏄?: (name)鎴戞瘯涓氶櫌鏍℃槸: (schoolName)鎴戠殑鎵?瀛︿笓涓氭槸: (major)
出現這種問題是為什麼呢,你可以先想一想,節下來我就要解決這個問題了
問題出現的原因
出現這種問題就是就是因為我們這裡将源檔案的類型定義的.template,我們将其改成txt檔案
就是源檔案為resume.txt; 新檔案是newResume.txt