首页 文章资讯内容详情

java基础---->Java的格式化输出

2026-06-01 4 花语

本文内容纲要:

-System.out.format() -Formatter类 -格式化说明符 -Formatter转换 -简单的十六进制转换工具 -友情链接

在JavaSe5中,推出了C语言中printf()风格的格式化输出。这不仅使得控制输出的代码更加简单,同时也给与Java开发者对于输出格式与排列更大的控制能力。今天,我们开始学习Java中的格式化输出。

目录导航

System.out.format() Formatter类 格式化说明符 Formatter转换 简单的十六进制转换工具 友情链接

System.out.format()

由于内容比较简单,我们通过实例来加以说明。项目结构如下:

JavaSe5引入的format方法可用于PrintStream或PrintWriter对象,其中也包括System.out对象。

packagecom.tomhu.format; publicclassFormatTest1{ publicstaticvoidmain(String[]args){ intx=5; doubley=3.141592; //一般方式 System.out.println("x="+x+",y="+y); //printf()方式 System.out.printf("x=%d,y=%f\n",x,y); //format()方式 System.out.format("x=%d,y=%f\n",x,y); } }

输出的结果如下:

x=5,y=3.141592 x=5,y=3.141592 x=5,y=3.141592

可以看到,format与printf是等价的,它们只需要一个简单的格式化字符串,加上一串参数即可,每个参数对应一个格式修饰符。

publicPrintStreamprintf(Stringformat,Object...args){ returnformat(format,args); }

在format的具体代码中,其实就是调用Formatter的format方法:formatter.format(Locale.getDefault(),format,args);

publicPrintStreamformat(Stringformat,Object...args){ try{ synchronized(this){ ensureOpen(); if((formatter==null) ||(formatter.locale()!=Locale.getDefault())) formatter=newFormatter((Appendable)this); formatter.format(Locale.getDefault(),format,args); } }catch(InterruptedIOExceptionx){ Thread.currentThread().interrupt(); }catch(IOExceptionx){ trouble=true; } returnthis; }

Formatter类

在Java中,所有新的格式化功能都由Formatter类处理,上述的printf与format也是。可以将Formatter看作是一个翻译器,它将你的格式化字符串与数据翻译成需要的结果。当你创建一个Formatter对象的时候,需要向其构造器传递一些信息,告诉它最终的结果将向哪里输出

packagecom.tomhu.format; importjava.util.Formatter; publicclassFormatTest2{ publicstaticvoidmain(String[]args){ Stringname="huhx"; intage=22; Formatterformatter=newFormatter(System.out); formatter.format("Mynameis%s,andmyageis%d",name,age); formatter.close(); } }

它的输出结果如下:

Mynameishuhx,andmyageis22

格式化说明符

在插入数据时,如果想要控制空格与对齐,就需要精细复杂的格式修饰符,以下是其抽象的语法:

%[argument_index$][flags][width][.precision]conversion Theoptionalargument_indexisadecimalintegerindicatingthepositionoftheargumentintheargumentlist.Thefirstargumentisreferencedby"1$",thesecondby"2$",etc. Theoptionalflagsisasetofcharactersthatmodifytheoutputformat.Thesetofvalidflagsdependsontheconversion. Theoptionalwidthisanon-negativedecimalintegerindicatingtheminimumnumberofcharacterstobewrittentotheoutput. Theoptionalprecisionisanon-negativedecimalintegerusuallyusedtorestrictthenumberofcharacters.Thespecificbehaviordependsontheconversion. Therequiredconversionisacharacterindicatinghowtheargumentshouldbeformatted.Thesetofvalidconversionsforagivenargumentdependsontheargumentsdatatype.

最常见的应用是控制一个域的最小尺寸,这可以通过指定width来实现。Formatter对象通过在必要时添加空格,来确保一个域至少达到某个长度。在默认的情况下,数据是右对齐的,通过"-"标志可以改变对齐的方向。

与width相对的是precision(精确度),它用来指明最大尺寸。width可以应用各种类型的数据转换,并且其行为方式都一样。precision则不一样,不是所有类型的数据都能使用precision,而且,应用于不同的类型的数据转换时,precision的意义也不同。

precision应用于String时,它表示打印String时输出字符的最大数量

precision应用于浮点数时,它表示小数点要显示出来的位数。默认是6位小数,如果小数位数过多则舍入,过少则在尾部补零。

由于整数没有小数部分,所以precision不能应用于整数。如果你对整数应用precision,则会触发异常

packagecom.tomhu.format;

importjava.util.Formatter;

publicclassFormatTest3{ staticFormatterformatter=newFormatter(System.out);

publicstaticvoidprintTitle(){ formatter.format("%-15s%-5s%-10s\n","huhx","linux","liuli"); formatter.format("%-15s%-5s%-10s\n","zhangkun","yanzi","zhangcong"); formatter.format("%-15s%-5s%-10s\n","zhangkun","yanzhou","zhangcong"); } publicstaticvoidprint(){ formatter.format("%-15s%5d%10.2f\n","Mynameishuhx",5,4.2); formatter.format("%-15.4s%5d%10.2f\n","Mynameishuhx",5,4.1); } publicstaticvoidmain(String[]args){ printTitle(); System.out.println("----------------------------"); print(); formatter.close(); }

}

它的输出结果如下:

huhxlinuxliuli zhangkunyanzizhangcong zhangkunyanzhouzhangcong ---------------------------- Mynameishuhx54.20 Myn54.10

Formatter转换

下面的表格包含了最常用的类型转换:

类型转换字符 d 整数型(10进制) e 浮点数(科学计数) c Unicode字符 x 整数(16进制) b Boolean值 h 散列码(16进制) s String % 字符"%" f 浮点数(10进制)

String.format()是一个static方法,它接受与Formatter.format()方法一样的参数,但返回一个String对象。当你只需要用format方法一次的时候,String.format()还是很方便的。

packagecom.tomhu.format; publicclassFormatTest4{ publicstaticvoidmain(String[]args){ intage=22; Stringname="huhx"; Stringinfo=String.format("Mynameis%sandmyageis%d",name,age); System.out.println(info); } }

它的输出结果如下:

Mynameishuhxandmyageis22

其实String.format方法的实质还是Formatter.format(),只不过是做了简单封装而已:

publicstaticStringformat(Stringformat,Object...args){ returnnewFormatter().format(format,args).toString(); }

简单的十六进制转换工具

packagecom.tomhu.format; publicclassFormatTest5{ publicstaticStringformat(byte[]data){ StringBuilderbuilder=newStringBuilder(); intn=0; for(byteb:data){ if(n%16==0){ builder.append(String.format("%05x:",n)); } builder.append(String.format("%02x",b)); n++; if(n%16==0){ builder.append("\n"); } } builder.append("\n"); returnbuilder.toString(); } publicstaticvoidmain(String[]args){ Stringstring="mynameishuhx,welcometomyblog"; System.out.println(format(string.getBytes())); } }

输出结果如下:

00000:6d79206e616d6520697320687568782c 00010:2077656c636f6d6520746f206d792062 00020:6c6f67

友情链接

本文内容总结:System.out.format(),Formatter类,格式化说明符,Formatter转换,简单的十六进制转换工具,友情链接,

原文链接:https://www.cnblogs.com/huhx/p/javaFormatter.html