一、概述

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的类的名字。此类用于确定行的排列顺序。

三、简单示例

<project><loadproperties srcfile="E:\workspace\trans\bin\com\run\ayena\trans\core\Trans.class" encoding="ISO-8859-1"><filterchain><classconstants/></filterchain></loadproperties><echo message="${REMOTE}"/><property name="name" value="FilterChain"/><property name="reader" value="FilterReader"/><copy file="demo.txt" tofile="escapeunicode.txt"><filterchain><escapeunicode/></filterchain></copy><copy file="demo.txt" tofile="expandproperties.txt"><filterchain><expandproperties/></filterchain></copy><copy file="demo.txt" tofile="headfilter.txt"><filterchain><headfilter lines="3" skip="2"/></filterchain></copy><copy file="demo.txt" tofile="linecontains.txt"><filterchain><linecontains ><contains value="嵌套" /></linecontains></filterchain></copy><copy file="demo.txt" tofile="linecontainsregexp.txt"><filterchain><linecontainsregexp casesensitive="false"><regexp pattern="FilterChain*"/></linecontainsregexp></filterchain></copy><copy file="demo.txt" tofile="prefixlines.txt"><filterchain><prefixlines prefix="prefix"/></filterchain></copy><copy file="demo.txt" tofile="suffixlines.txt"><filterchain><suffixlines suffix="suffix"/></filterchain></copy><copy file="tokendemo.txt" tofile="replacetokens.txt"><filterchain><replacetokens begintoken="@" endtoken="@"><token key="name" value="${name}"/><token key="reader" value="${reader}"/></replacetokens></filterchain></copy><copy file="tokendemo.txt" tofile="replacetokens1.txt"><filterchain><filterreader classname="org.apache.tools.ant.filters.ReplaceTokens"><param type="propertiesfile"  value="token.properties"/><param type="begintoken" value="@"/><param type="endtoken" value="@"/></filterreader></filterchain></copy><copy file="demo.txt" tofile="stripjavacomments.txt"><filterchain><stripjavacomments /></filterchain></copy><copy file="demo.txt" tofile="striplinebreaks.txt"><filterchain><striplinebreaks linebreaks="/*"/></filterchain></copy><copy file="demo.txt" tofile="striplinecomments.txt"><filterchain><striplinecomments><comment value="--"/><comment value="#"/><comment value="//"/></striplinecomments></filterchain></copy><copy file="demo.txt" tofile="tabstospaces.txt"><filterchain><tabstospaces tablength="16"/></filterchain></copy><copy file="demo.txt" tofile="tailfilter.txt"><filterchain><tailfilter lines="-1" skip="3"/></filterchain></copy><copy file="demo.txt" tofile="deletecharacters.txt"><filterchain><deletecharacters chars="n\r\n\t " /></filterchain></copy><copy file="demo.txt" tofile="concatfilter.txt"><filterchain><concatfilter append="token.properties" prepend="token.properties"/></filterchain></copy><copy file="demo.txt" tofile="tokenfilter.txt"><filterchain><tokenfilter delimOutput="\t"><stringtokenizer delims="/"/><replacestring from="concat" to="Concat"/><replaceregex pattern="Concat" replace="concat" flags="gi"/><containsstring contains="concat"/><containsregex pattern="concat*"/><trim/><ignoreblank/><scriptfilter language="javascript">self.setToken(self.getToken().toUpperCase());</scriptfilter></tokenfilter></filterchain></copy><copy file="demo.txt" tofile="fixcrlf.txt"><filterchain><fixcrlf tab="add" eof="add" fixlast="false"/></filterchain></copy><copy file="demo.txt" tofile="sortfilter.txt"><filterchain><sortfilter reverse="true"/></filterchain></copy>
</project>

Ant类型之FilterChain相关推荐

  1. JavaWeb:过滤器Filter

    1. 过滤器概述 1.1 什么是过滤器 过滤器会在一组资源(jsp.servlet..css..html等等)的前面执行!它可以让请求得到目标资源,也可以不让请求达到!过滤器有拦截请求的能力! 过滤器 ...

  2. Java的面试汇总,有这些还担心不通过?

    面试官提问的内容通常会由易到难,如果前面容易的内容都答不上来,往往就被刷了,如果是前面提问的都答上来了,他会问一些有深度的问题,这时候就算你回答不上来也不要慌张,他只是看看你的薪资水平而已 接下来我就 ...

  3. java无ide编译_[转]无IDE时编译和运行Java

    本文由 ImportNew - Grey 翻译自 dzone.欢迎加入Java小组.转载请参见文章末尾的要求. 最近Java subreddit出现了一篇"在没有IDE的情况下编译Java包 ...

  4. 无ide编译java_无IDE编译和运行java

    建立和运行Java代码 为了对这篇文章进行更具体的讨论,我将使用一些非常简单的Java类,在同一个包中通过彼此相关的组合或继承(不在 未命名的包中)来调用dustin.examples.这两个在第三个 ...

  5. JavaWeb基础知识总结

     [Java面试题]JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l ...

  6. 3.JavaWeb基础知识总结

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  7. 详谈 Filter 过滤器

    详谈 Filter 过滤器 文章首发在CSDN博客,转载请务必注明以下所有链接,否则考虑法律追究责任. CSDN地址:http://blog.csdn.net/tzs_1041218129/artic ...

  8. 叩丁狼分享—培训实战教程之浅谈过滤器Filter

    一.过滤器的基本概念Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Htt ...

  9. [Java安全]—Tomcat Filter内存马

    文章首发于Secin:Filter内存马及工具检测 文章目录 原理 Filter注册流程 Filter内存马注入 内存马检测工具 原理 Servlet 有自己的过滤器filter,可以通过自定义的过滤 ...

最新文章

  1. C++知识点35——使用智能指针的注意事项(上)
  2. 【错误记录】编译 ijkplayer 报错 (fatal error: libyuv.h: No such file or directory #include “libyuv.h“ )
  3. 【MATLAB】流程控制 ( 循环结构 | for 循环 | while 循环 | 分支结构 | if end 分支结构 | if else end 分支结构 | switch case 分支结构 )
  4. java的枚举类enum
  5. 18.IDA-创建自己的sig
  6. g menu i meun_长沙话读“这里”,到底是阁(gó)里还是该(gái)里
  7. jieba分词_Jieba.el – 在Emacs中使用jieba中文分词
  8. C++之const关键字探究
  9. 计算机缺考学校知道吗,计算机二级机考缺考成绩单会不会显示缺考啊
  10. 红旗7.0 rc1 版编辑开始菜单
  11. 成功要掌握人生的每一次机会
  12. 如何把静态成员导出_dll导入导出及local vftable问题
  13. IDEA 常用快捷键与设置
  14. 觅风易语言教程全集(完整超清版+源码)
  15. 【20保研】四川大学计算机学院(软件学院)2019年全国优秀大学生暑期夏令营招生简章...
  16. 行业陷入“围城”效应,新茶饮品牌凛冬将至
  17. android 闹钟设置的几种方法
  18. CentOS 7 下配置ip forward(虚拟路由器)
  19. vue -V 执行失败 檔案名稱、目錄名稱或磁碟區標籤語法錯誤。
  20. c语言什么事结构体,C语言结构体定义是什么

热门文章

  1. Nordic 芯片包 sdk 软件相关下载地址
  2. APP Scode码校验失败
  3. [GDOUCTF 2023]EZ WEB 学习笔记
  4. kalmarCTF(WEB|EZ)WP
  5. 关于非编系统的组成,作用和发展!
  6. Rust基础-关于trait之一
  7. signature=e260e08d0d5973d18c37cc596c51cae8,女性不妊症領域におけるレーザー手術の現況...
  8. ORA00942,ORA06550报错解决
  9. SQL中的注释语句(三种注释)
  10. mysql sum when then_MySQL中group by , sum , case when then 的使用