Ant类型之FilterChain

Ant类型之FilterChainFilterChain 是一组 FilterReader 用户可以通过继承 java io FilterReader 类来定义自己的 FilterReader 通过使用 filterreader 元素可以轻松的将自定义的 FilterReader 做为嵌套元素插入到 filterchain 中 通过 FilterChain ant 可以灵活的进行数据的转换 支持 FilterChain 的 task 有 concat copy loadfile loadproperti move 过滤器链是通过嵌套 0 到多个过滤器形成的

一、概述

        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>


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233482.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Tensorflow】Windows安装tensorflow错误原因查询、卸载tensorflow与重新安装

    【Tensorflow】Windows安装tensorflow错误原因查询、卸载tensorflow与重新安装Windows安装tensorflow错误原因查询、卸载tensorflow与重新安装深度学习这个大坑的苦与甜,谁踩谁知道。上文介绍了windows如何安装tensorflow点我:Windows(64)位安装tensorflow,但因为一般电脑上会有好几个版本的python,比如我电脑上装了从2.7各版到3.6等等(具体怎么查询电脑的python版本下面会介绍到),所以在安装的时候一定要确认…

    2022年6月22日
    32
  • shell的比较运算符

    算术运算符 +-*/%表示加减乘除和取余运算+=-=*=/=同C语言中的含义位操作符>>>=表示位左右移一位操作&&=|

    2021年12月24日
    50
  • 允许跨域访问_vue浏览器清空跳转记录

    允许跨域访问_vue浏览器清空跳转记录from http://www.cnblogs.com/fengyuqing/p/javascript_xmlhttp.html在非IE下,使用XMLHttpRequest不能跨域访问,除非要访问的网页设置为允许跨域访问。将网页设置为允许跨域访问的方法如下: JavaResponse.AddHeader(“Access-Control

    2022年10月1日
    2
  • aptitude命令使用

    aptitude命令使用aptitude一个类似于aptinstall的命令使用引用官网的描述解释aptitude是一个功能丰富的包管理器,包括:使用类似mutt的语法灵活地检索软件包,类似dselect的持续用户操作,获取并显示大多数软件包的Debianchangelog的功能,一个类似apt-get的命令行模式。aptitude还是个Y2K兼容,轻便,自清洁以及友好的程序。常…

    2025年7月28日
    4
  • Shell if else语句「建议收藏」

    Shell if else语句「建议收藏」Shellifelse语句if语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell有三种if…else语句:if…fi语句; if…else…fi语句; if…elif…else…fi语句。1)if…else语句if…else语句的语法:if[expression…

    2022年7月11日
    24
  • php嵌入html有哪几种方法_php修改html里面的内容

    php嵌入html有哪几种方法_php修改html里面的内容html中嵌入php代码(以.html结尾的文件)index.html<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><title>错误:html中嵌套php</title></head><body><?phpecho’helloworld’?></body></html

    2022年10月2日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号