FilterChain是一组FilterReader,用户可以通过继承java.io.FilterReader类来定义自己的FilterReader。通过使用filterreader元素可以轻松的将自定义的FilterReader做为嵌套元素插入到filterchain中。通过FilterChain,ant可以灵活的进行数据的转换。支持FilterChain的task有:concat、copy、loadfile、loadproperties、move。过滤器链是通过嵌套0到多个过滤器形成的。Ant提供了一些内置的过滤器。
FilterReader:一个定义过滤器的通用方法。可以用它在构建文件中定义用户自定义的过滤器元素。内置的过滤器也可以通过这种方式进行定义。filterreader元素必须提供一个classname属性,用这个名称解析的类必须继承java.io.FilterReader。如果自定义的过滤器需要参数化,必须实现org.apache.tools.type.Parameterizable。
classname:filterreader的类名。
filterreader支持嵌套classpath和param元素,每个param可以接受name、type和value属性。其他的过滤器也默认支持。
ClassConstants:过滤java类中定义的基本常量,并以name=value的格式按行输出。此过滤器需要bcel包来解析java类文件。此过滤器与大多数操作字符序列的过滤器不同,此过滤器在组成类的字节序列上进行操作,但是字节到达过滤器后是字符序列,所以在使用字符编码时要格外注意,大多数编码信息会从任意字节序列转为字符,在转回字节的过程中丢失。特别是常用的默认字符编码(CP152和UTF8)。因此,从ant1.7起,从字符转换到字节采用ISO-8859-1编码,也必须使用这个编码读取java类文件。
EscapeUnicode:ant1.6起,将输入的所有非US-ASCII字符更改为等效的\u加上4位数字的unicode转义。
ExpandProperties:如果数据包含${}格式的ant属性,过滤器会将其替换为实际的值。ant1.8.3起,可以嵌套propertyset元素。
HeadFilter:读取提供给过滤器的数据的前几行。具有以下属性:
lines:读取的行数,默认为10。
skip:跳过的行数,默认为0。
LineContains:只包含用户指定字符串的行。具有以下属性:
contains:要包含的字符串。只能作为嵌套元素使用,支持多个contains元素。
negate:ant1.7起,是否只选择不包含指定字符串的行。
LineContainsRegExp:只包含与用户指定的正则表达式匹配的字符串的行。具有以下属性:
regexp:正则表达式。只能作为嵌套元素使用,支持多个contains元素。有关嵌套元素regexp的说明,请参考regexp类型。
negate:ant1.7起,是否只选择不包含与指定正则表达式匹配的字符串的行。
caseseneitive:ant1.8.2起,是否区分大小写,默认为true。
PrefixLines:每一行附加一个前缀。具有以下属性:
prefix:附加到行的前缀。
SuffixLines:ant1.8起,每一行附加一个后缀。具有以下属性:
suffix:附加到行的后缀。
ReplaceTokens:将开始标记和结束标记之间的所有字符串替换为用户定义的值。具有以下属性:
begintoken:开始标记,默认为@。
endtoken:结束标记,默认为@。
token:用户定义的字符标记。只能做为嵌套元素使用。
propertiesfile:获取标记字符的属性文件。只能在通过filterreader方式使用ReplaceTokens时使用。
value:字符标记替换的值,token的属性。
StripJavaComments:使用java语法准则从数据中去除注释。不支持任何属性。
StripLineBreaks:从数据中去除特定的字符。具有以下属性:
linebreaks:要去掉的字符,默认为“\r\n”。
StripLineComments:删除以用户指定的注释起始字符串开头的行。
comment:当出现在行的开头时,将此行识别为注释的字符串。
TabsToSpaces:用空格替换制表符。具有以下属性:
tablength:替换的空格数量,默认为8。
TailFilter:读取提供给过滤器的数据的最后几行。具有以下属性:
lines:读取的行数,默认为10。如果为-1,表示读取所有的行。
skip:从后面跳过的行数,默认为0。
DeleteCharacters:ant1.6起,删除指定的字符。具有以下属性:
chars:要删除的字符,支持转义。
ConcatFilter:ant1.6起,预写或附加内容文件到过滤后的文件。具有以下属性:
prepend:内容将预写到文件的文件名。
append:内容将附加到文件的文件名。
TokenFilter:ant1.6起,将输入切分为一组字符串,并将这组字符串传递给字符串过滤器,与其他过滤器不同,TokenFilter不支持param元素。分词器和字符串过滤器通过嵌套元素定义。只能定义一个分词器,如果没有指定默认为LineTokenizer,可以有0到多个字符串过滤器。字符串过滤器处理分词字符串后返回字符串或者null。如果返回字符串,会将字符串传递到下一个过滤器,直到所有的过滤器都被调用。如果所有过滤器都调用后返回的是字符串,会将字符串与相关的分词分隔符输出。分隔符可以通过delimOutput属性覆盖。具有以下属性:
delimOutput:如果不为空,覆盖分词器返回的分隔符。
默认分词器有:
LineTokenizer:将输入切分成行,分词器通过“\r”、“\n”或者“\r\n”分隔行。是默认的分词器。具有以下属性:
includeDelims:是否包含行结尾,默认为false。
FileTokenizer:将所有的输入做为一个分词字符串。所以不要在很大的输入上用这个分词器。
StringTokenizer:基于java.util.StringTokenizer。将输入按照空格或者指定的分隔符切分成一组字符串。如果输入以分隔符开头,第一个字符会是空字符串。具有以下属性:
delims:分隔符,默认为空格,
delimsaretokens:如果设置为true,每个分隔符也会返回,默认为false。
suppressdelims:如果设置为true,不返回分隔符,默认为false。
includeDelims:如果设置为true,分词字符串包含分隔符,默认为false。
默认字符串过滤器有:
ReplaceString:一个简单的字符串替换过滤器,可以被FilterChain直接使用。具有以下属性:
form:要被替换的字符串。
to:被替换字符串的新值,如果不设置,默认为空字符串。
ContainsString:过滤包含自定字符串的分词字符串。具有以下属性:
contains:要包含的字符串。
ReplaceRegex:替换匹配正则表达式字符串的过滤器,可以被FilterChain直接使用。具有以下属性:
pattern:要匹配的正则表达式。
replace:替换匹配正则表达式字符串的字符串。默认为空字符串。
flags:匹配正则表达式所使用的模式,可选值有g(全局替换,替换所有匹配项)、i(不区分大小写)、m(多行匹配模式,使用^和$做为任一行的开始和结束)、s(单行模式,“.”可以与任意字符匹配,包括换行符,所有的输入看作是一行)。
ContainsRegex:过滤匹配正则表达式的字符串。还可以选择替换与正则表达式匹配的字符串。可以被FilterChain直接使用。具有以下属性:
pattern:要匹配的正则表达式。
replace:替换匹配正则表达式字符串的字符串。默认为原始字符串。
flags:匹配正则表达式所使用的模式,可选值有g(全局替换,替换所有匹配项)、i(不区分大小写)、m(多行匹配模式,使用^和$做为任一行的开始和结束)、s(单行模式,“.”可以与任意字符匹配,包括换行符,所有的输入看作是一行)。
Trim:去掉字符串开始和结束的空格,可以被FilterChain直接使用。
IgnoreBlank:移除空的分词字符串,可以被FilterChain直接使用。
DeleteCharacters:从分词字符串中删除自定字符,具有以下属性:
chars:要删除的字符,支持转义。
UniqFilter:去掉重复的分词字符串,可以被FilterChain直接使用。
ScriptFilter:执行支持BSF或者JSR223语言的脚本。script提供了包含getToken()和setToken(String) 方法的self对象。可以被FilterChain直接使用。具有以下属性:
language:编写脚本的程序语言,必须是支持BSF或者JSR223的语言。
manager:使用的脚本引擎管理器。可选值有:bsf(BSF脚本管理器)、javax(jdk1.6+支持的JSR223脚本管理器)、auto(如果bsf存在使用bsf,否则使用javax),默认为auto。
src:如果脚本不是嵌套在标签中,设置脚本文件的位置。
setbeans:ant1.8起,是否在脚本中设置所有属性、引用和targets。如果设置为false,只有project和self可用。默认为true。
classpath:传递到脚本的类路径。
classpathref:使用的类路径引用。
FixCRLF:见ant内置任务fixcrlf。
SortFilter:ant1.8起,读取所有行并进行排序,顺序可以反转,可以自定义java.util.Comparator接口的实现来进行更多的控制。
reverse:是否反转顺序,默认为false。如果设置了comparator属性,则忽略此属性。
comparator:实现了java.util.Comparator的类的名字。此类用于确定行的排列顺序。
self.setToken(self.getToken().toUpperCase());