Java 1.5开始,提供了类似C语言格式化文本的功能。与在java.util包下与格式化有关的类或接口有4个,分别是Formattable、FormattableFlags、Formatter、FormatFlagsConversionMismatchException。其中,最主要的是Formatter类与Formattable接口,另外两个FormattableFlags是为Formattable接口提供服务的,FormatFlagsConversionMismatchException是异常类。
一、Formatter的用法
先来分析Formatter的用法,通过分析源码,我们可以看到,Formatter的构造函数有12个,可见Formatter的功能非常大强大,不过,这12个可以分成如下几类,一类是字符串操作Formatter(),Formatter(Appendable a),Formatter(Appendable a, Locale l),Formatter(Local l);一类是关于文件的操作,分别是Formatter(File file),Formatter(File file, String csn),Formattter(File file, String csn, Local l),Formatter(String fileName),Formatter(String filename, String csn),Formatter(String filename, String csn, Locale l);一类是关于输出流的操作,分别是Formatter(OutputStream os),Formatter(OutputStream os , String csn),Formatter(OutputStream os, String csn, Local l),Formatter(PrintStream ps)
1、 对字符串的操作
针对的是实现Appendable接口的字符串,我们对Appendable接口可能比较陌生,但是对于实现了改接口的StringBuffer、StringBuilder类肯定比较熟悉,他们共同的特点就是都有append函数。以下代码实现对字符串的操作:
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb, Locale.UK);
formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d");
System.out.println(sb);
formatter.format(Locale.FRANCE, "e = %+10.4f", Math.E);
System.out.println(sb);
// String balanceDelta = "mmmm";
formatter.format("Amount gained or lost since last statement: $ %(,.2f", Math.E);
System.out.println(sb);
2、 对文件的操作
以下代码可以实现文件的写操作。
File f = new File("C:/Temp/InstallConfig.ini");
try {
Formatter formatter = new Formatter(f);
formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d");
formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d");
formatter.flush();
formatter.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
3、 对输出流的操作
以下代码实现输出流的操作、
try {
//BufferedOutputStream bos = new BufferedOutputStream(System.out);
Formatter formatter = new Formatter(System.out);
formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d");
formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d");
formatter.flush();
formatter.close();
} catch (Exception e) {
e.printStackTrace();
}
通过以上代码,我们知道了Formatter的使用场景,接下来分析如何使用。Formatter里面最主要的函数就是format()函数,该函数实现了重载,分别是public Formatter format(String format, Object ... args)与public Formatter format(Locale l, String format, Object ... args),其中,第一个函数是在内部调用了第二个函数。
Locale l:本地方言
String format:要格式化的字符串
Object ... args:可变个数的参数对象
要格式化字符串,在字符串中就需要声明,声明的格式如下:
%[argument_index$][flags][width][.precision]conversion
argument_index:后面参数... args的位置,从1到参数的个数;
flags:可选 flags 是修改输出格式的字符集。有效标志集取决于转换类型
width:控制一个域的最小值,默认情况下下是右对齐的,可以通过使用“-”标志来改变对其方向。
precision:精度,用于String时,表示输出字符的最大数量,用于浮点数时,表示小数部分要显示出来的 位数(默认是6位),多则舍入,少则补0,用于整数会触发异常。
conversion:转换格式。
具体用法可参见:
二、Formattable的用法
凡是继承实现了Formattable接口的对象,都可以被Formatter格式化,不过,格式化的conversion只能是以’s’结尾的,jdk中提供了一个例子。有兴趣的可以看一下。