首先,要寫出自己的Ant Task是一件非常簡單的事情,有了心里的這層藐視之后,做起事來就容易多了!
說說我做這個Ant Task的背景,隨著部門框架的推廣,支持國際化是一個嚴肅的問題,我們選擇了utf-8作為UNICODE字符集的編碼形式,因此現有項目必須經過一些轉換的處理,自然,Ant是首選工具。
可以看一個完整的build.xml:
<?xml version="1.0" encoding="UTF-8"?>

<project default="main" basedir=".">
<property name="jsp.dir" value="organtype" />
<property name="lib.dir" value="bin" />
<path id="classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
</fileset>
<pathelement path="bin" />
</path>
<!-- 編碼關鍵字替換 -->
<target name="replace" description="將GBK,gb2312換成UTF-8">
<replace dir="${jsp.dir}" token="GBK" value="UTF-8" />
<replace dir="${jsp.dir}" token="gb2312" value="UTF-8" />
</target>

<!-- 初始化任務 -->
<target name="init-tasks" description="==> 生成代碼前的初始化工作">
<taskdef name="gbk2utf8" classname="org.loushang.bsp.util.GBK2UTF8">
<classpath refid="classpath" />
</taskdef>
</target>

<!-- 編碼格式轉換 -->
<target name="convert" description="改變文件的編碼格式" depends="init-tasks">
<gbk2utf8 destDir="${jsp.dir}" format="java" destEncoding="utf-8" />
</target>
<!-- 主任務 -->
<target name="main" description="主任務">
<antcall target="replace" />
<antcall target="convert" />
</target>
</project>

解釋一下,首先這個任務進行jsp頁編碼形式的替換,接著進行內容編碼的轉換,其中可以指定目標目錄,文件格式,目標編碼形式。Ant Task主要用到了java的反射技術,我們自己的Task可以繼承Task類,然后復寫excute()方法,看看GBK2UTF8的源代碼:
1
import java.io.BufferedReader;
2
import java.io.File;
3
import java.io.FileOutputStream;
4
import java.io.FileReader;
5
import java.io.IOException;
6
import java.io.OutputStreamWriter;
7
import java.util.ArrayList;
8
import java.util.List;
9
10
import org.apache.tools.ant.BuildException;
11
import org.apache.tools.ant.Task;
12
13
public class GBK2UTF8 extends Task
{
14
private String format = "";
15
16
private String destEncoding = "";
17
18
private String destDir = "";
19
20
private static List list = new ArrayList();
21
22
public String getDestDir()
{
23
return destDir;
24
}
25
public void setDestDir(String destDir)
{
26
this.destDir = destDir;
27
}
28
/**//*
29
* 復寫execute()方法,實現自己的內容
30
*/
31
public void execute() throws BuildException
{
32
super.execute();
33
getAllFilesOfDir(getDestDir());
34
StringBuffer tempSb = new StringBuffer();
35
int hasRead = 0;
36
for (int i = 0; i < list.size(); i++)
{
37
System.out.println(list.get(i));
38
try
{
39
BufferedReader bfr = new BufferedReader(new FileReader(
40
(File) list.get(i)));
41
String temp = bfr.readLine();
42
while (temp != null)
{
43
tempSb.append(temp);
44
tempSb.append("\n");
45
temp = bfr.readLine();
46
}
47
bfr.close();
48
// 文件內容編碼轉換
49
OutputStreamWriter osw = new OutputStreamWriter(
50
new FileOutputStream((File) list.get(i)),
51
getDestEncoding());
52
osw.write(tempSb.toString(), 0, tempSb.toString().length());
53
osw.flush();
54
osw.close();
55
tempSb = null;
56
tempSb = new StringBuffer();
57
} catch (IOException e)
{
58
e.printStackTrace();
59
}
60
}
61
}
62
63
/**//*
64
* 判斷后綴名是否滿足條件
65
*/
66
private boolean isProperFormat(File file)
{
67
return (file.getName().endsWith(getFormat()));
68
}
69
70
/**//*
71
* 取得所有的文件列表
72
*/
73
private List getAllFilesOfDir(String dir)
{
74
File file = new File(dir);
75
if (!file.exists())
{
76
throw new RuntimeException("給出的目錄不存在!");
77
}
78
File[] files = file.listFiles();
79
for (int i = 0; i < files.length; i++)
{
80
if (files[i].isFile() && isProperFormat(files[i]))
{
81
list.add(files[i].getAbsoluteFile());
82
} else if (files[i].isDirectory())
{
83
getAllFilesOfDir(files[i].getAbsolutePath());
84
} else
{
85
// 那些不符合格式的文件將略去
86
}
87
}
88
return list;
89
}
90
91
public String getDestEncoding()
{
92
return destEncoding;
93
}
94
95
public void setDestEncoding(String destEncoding)
{
96
this.destEncoding = destEncoding;
97
}
98
99
public String getFormat()
{
100
return format;
101
}
102
103
public void setFormat(String format)
{
104
this.format = format;
105
}
106
}
107
這樣,就完成任務了??纯词遣皇呛芎唵危?BR>參考資料:http://ant.apache.org/manual/tutorial-writing-tasks.html