0%

ant concat

前言

在项目中,因为一个问题需要修改某个大的文本文件(超过50MB),由于项目 git 中限制了文件不能超过 50MB,导致文件无法提交成功。此时需要将文件拆分成多个子文件,在打包时再合并成一个文件。由于项目中使用 ant 打包,自然就想到了用 ant 来解决这一问题。concat 标签就是用来合并文件或字符串的,刚好满足这个需求。

使用

concat 有很多属性,主要用到的是 destfileencodingoutputencodingfixlastlineeol

  • destfile,主要表示合并后输出的文件
  • encoding,主要表示输入的文件的编码格式,默认是 JVM 的编码格式
  • outputencoding,主要表示输出的文件的编码格式,默认是 JVM 的编码格式
  • fixlastline,合并文件时有效,主要表示多个文件合并过程中处理完一个文件后是否添加新的一行
  • eol,与 fixlastline 结合使用,主要表示合并文件中添加一行的内容。主要有:crlfcrlfmacunixdos。默认会随操作系统类型进行设置,如 dos 操作系统添加 crlf ,unix 操作系统添加 lf

其他属性的使用及解释参考官网:http://ant.apache.org/manual/index.html

例子

假设在 test 目录下有两个文件:a.txt、b.txt,其内容如下

a.txt

1
2
3
4
1,北京
2,上海
3,广州
4,深圳

b.txt

1
2
3
4
5,杭州
6,武汉
7,天津
8,重庆

现在要将两个文件的内容合并成一个文件 c.txt,则可以编写如下构建脚本

1
2
3
4
5
6
7
<project name="testAntConcat" default="build" basedir=".">
<target name="build">
<concat fixlastline="yes" destfile="c.txt" encoding="utf-8" outputencoding="utf-8">
<fileset dir="test" includes="*.txt" />
</concat>
</target>
</project>

结果会生成一个 c.txt 文件,内容如下,刚好是 a.txt 和 b.txt 文件的内容

1
2
3
4
5
6
7
8
1,北京
2,上海
3,广州
4,深圳
5,杭州
6,武汉
7,天津
8,重庆

有几个需要注意的地方。第一,在脚本中,fixlastline="yes" 是必须的,否则合并文件后不会换行,会出现如下的情况,至于新增的换行符,使用默认的即可,ant 会根据系统自行添加。

1
2
3
4
5
6
7
1,北京
2,上海
3,广州
4,深圳5,杭州
6,武汉
7,天津
8,重庆

第二,encoding="utf-8" outputencoding="utf-8" 这两个属性也是必须的,否则合并文件后会出现乱码,因为包含中文,如果不包含中文,只有数字和字母,没有这两个属性也可以。

总体而言,concat 还是比较简单的,参考官网的说明,写个简单例子验证一下,就能正确运用到项目中了。

参考资料

ant使用指导:http://ant.apache.org/manual/index.html