我也来驯服 Triger !

原创 2004年08月31日 13:10:00

1.     驯服 TigerProperties类的新特性<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

传统的操作Properties的方法如下,它将属性存在一个类ini的文本文件中,下面是读取方法:

import java.util.*;
import java.io.*;

public class LoadSample {
  public static void main(String args[]) throws Exception {
    Properties prop = new Properties();
    FileInputStream fis =
      new FileInputStream("sample.properties");
    prop.load(fis);
    prop.list(System.out);
    System.out.println("/nThe foo property: " +
        prop.getProperty("foo"));
  }
}
tiger版本中增加了用xml 文件保存属性的方法,操作方法与原来一样,只是加上了xml的字样:

import java.util.*;
import java.io.*;

public class LoadSampleXML {
  public static void main(String args[]) throws Exception {
    Properties prop = new Properties();
    FileInputStream fis =
      new FileInputStream("sampleprops.xml");
    prop.loadFromXML(fis);
    prop.list(System.out);
    System.out.println("/nThe foo property: " +
        prop.getProperty("foo"));
  }
}

import java.util.*;
import java.io.*;

public class StoreXML {
  public static void main(String args[]) throws Exception {
    Properties prop = new Properties();
    prop.setProperty("one-two", "buckle my shoe");
    prop.setProperty("three-four", "shut the door");
    prop.setProperty("five-six", "pick up sticks");
    prop.setProperty("seven-eight", "lay them straight");
    prop.setProperty("nine-ten", "a big, fat hen");
    FileOutputStream fos =
      new FileOutputStream("rhyme.xml");
    prop.storeToXML(fos, "Rhyme");
    fos.close();
  }
}
这是新的属性文件:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

<properties>

<comment>Rhyme</comment>

<entry key="seven-eight">lay them straight</entry>

<entry key="five-six">pick up sticks</entry>

<entry key="nine-ten">a big, fat hen</entry>

<entry key="three-four">shut the door</entry>

<entry key="one-two">buckle my shoe</entry>

</properties>

 

使用 XML 文件还是使用老式的 a=b 类型的文件完全取决于您自己。老式文件从内存的角度看肯定是轻量级的。不过,由于 XML 的普遍使用,人们会期望 XML 格式流行起来,因为它已经被广泛使用了,只不过没有用到 Properties 对象。

2.   驯服 Tiger:新的StringBuilder

StringBuffer被设计为线程安全的,但是有时我们想在单线程中使用StringBuffer的提供的功能,StringBuffer的线程安全性会带来性能损失,StringBuilder正是为此而设计的。

3.   驯服 Tiger:格式化输出

格式化字符串:

不是用加号将字符串连接在一起(如 firstName + " " + lastName),而是先提供一个字符串描述输出形式,然后提供参数替换字符串中的占位符

Formatter java.util.Formatter):

您可能不会经常直接使用这个类,但是它提供了所要进行的格式化的内部机制。在这个类的 Javadoc 中,会看到一个描述所支持的格式化选项的表。用 Formatter 格式化输出分为两步:创建一个 Appendable 对象以存储输出,用 format() 方法将带格式的内容放到这个对象中。下面列出了 Appendable 接口的实现器:

·    BufferedWriter

·    CharArrayWriter

·    CharBuffer

·    FileWriter

·    FilterWriter

·    LogStream

·    OutputStreamWriter

·    PipedWriter

·    PrintStream

·    PrintWriter

·    StringBuffer

·    StringBuilder

·    StringWriter

·    Writer

在使用 Formatter 类时,将实现了Appendable接口的对象传递给构造函数,把它作为扩充目标。清单 1 显示了通常如何开始使用 Formatter

清单 1. formatter 的典型用法

StringBuilder sb = new StringBuilder();

Formatter formatter = new Formatter(sb, ocale.US);

 

创建了Formatter 类后,用格式化字符串和参数调用其 format() 方法。如果需要使用与传递给出构造函数的不同的 Locale 作为格式化输出的一部分,还可以向 format() 方法传递一个 Locale 对象。

清单 2. 演示得到精度为 10 位数字的 Pi

public static void main(String args[]) {

StringBuilder sb = new StringBuilder();

Formatter formatter = new Formatter(sb, Locale.US);

formatter.format("PI = %<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />12.10f", Math.PI);

   System.out.println(formatter);

}

 

PrintStream 支持

用于写入标准输出和标准错误的 System.out System.err 对象都是PrintStream的实例。新的PrintStream引入了两个新的构造函数(用于直接写入文件)和六个方法(三对)以提供对格式化的支持。六个方法中的第一对(append)实现了新的 java.lang.Appendable 接口定义的方法,一般直接调用的是 format() printf(),其中 printf() 版本只是 format() 版本的方便的包装器,如清单 3 所示:

清单 3. 使用 PrintStream.format 的例子

public class Now {

  public static void main(String args[]) {

    System.out.format(

        "Today is %1$tB %1$te, %1$tY.",

        Calendar.getInstance()

        );

  }

}

 

运行这个程序的输出是 Today is April 2, 2004.,当然实际的输出取决于运行这个程序的日期。上面代码中的格式化字符串 %1$tB 告诉程序使用第一个参数并打印 date 对象的完整月名。格式化字符串 %1$te 意味着显示月中的日期,而格式化字符串 %1$tY 是四位数字的年。在 Formatter 对象的 Javadoc 中列出了打印日期的其他选项。

String 支持

String 类有两个新的 static format() 方法,它们的作用与相应的 printf() 类似。发送一个格式化字符串和参数(还可能有 Locale)、并使用在格式化字符串中指定的格式转换参数。这些方法不是很显眼,但是有了它们就可以避免直接使用 Formatter 对象并创建中间的 StringBuilder

格式化任意对象Formattable 接口

前面描述如何使用新的格式化能力对已有对象和基本数据进行格式化。如果希望用 Formatter 提供对自己的对象的支持,那么就要用到 Formattable 接口。通过在自己的类中实现如清单 4 所示的一个 formatTo() 方法,可以对自已的类使用格式化字符串:

清单4. Formattable接口方法formatTo

void formatTo(Formatter formatter,

              int flags,

              Integer width,

              Integer precision)

 

清单 5 演示了通过提供一个具有 name 属性的简单类来使用 Formattable 接口。这个 name 显示在输出中,它支持控制输出的宽度和对齐。

清单5. formattable 使用示例

public class MyObject implements Formattable {

String name;

public MyObject(String name) {

 this.name = name;

}

public void formatTo(

         Formatter fmt,

         int f,

         Integer width,

         Integer precision) {

 StringBuilder sb = new StringBuilder();

 if (precision == null) {

    // no max width

    sb.append(name);

 }

else if (name.length() < precision) {

    sb.append(name);

 }

else {

    sb.append(

name.substring(0, precision - 1)).

append('*');

 }

 //apply width and justification

 if ((width != null) && (sb.length() < width)) {

    for (int i = 0, n=sb.length(); i < width - n; i++){

        if ((f & Formattable.LEFT_JUSTIFY) == Formattable.LEFT_JUSTIFY) {

          sb.append(' ');

        }

else {

          sb.insert(0, ' ');

        }

     }

 }

fmt.format(sb.toString());

}

 

public static void main(String args[]) {

 MyObject my1 = new MyObject("John");

 MyObject my2 = new MyObject("Really Long Name");

 //Using toString()

 System.out.println("First Object : " + my1);

 // Second / Using Formatter

 System.out.format("First Object : '%s'//n", my1);

 // Second / Using Formatter

 System.out.format("Second Object: '%s'//n", my2);

 // Second / Using Formatter with width

 System.out.format(

"Second Object: '%10.5s'//n", my2);

 //Using Formatter with width and left justification

 System.out.format(

"Second Object: '%-10.5s'//n", my2);

}

 

}

 

运行这个程序会生成如清单 6 所示的输出。前两行展示了使用 toString Formatter 的不同结果。后三行显示宽度和对齐控制的选项。

清单6. formattable 输出示例

  First Object : MyObject@10b62c9

  First Object : 'John'

  Second Object: 'Really Long Name'

  Second Object: '     Real*'

  Second Object: 'Real*     '

 

结束语

除非通过使用 C 对它们已经很熟悉了,否则掌握 Formatter 中提供的所有格式化选项要花一些时间。有一些小的区别,但是大部分的行为是非常类似的。Java 平台上的一个重要的不同是当格式化字符串无效时会抛出异常。

一定要仔细查看 Formatter 类的 Javadoc 中所列出的可用的格式化字符串。在创建自己的自定义类时,不仅提供一个 toString() 实现,而且实现 Formattable 接口通常会有帮助。

 

 

驯服烂代码(完整版)

  • 2017年04月02日 18:43
  • 40.99MB
  • 下载

阅读《驯服烂代码》

在新做一个项目之前阅读了本书,记录下印象深刻的部分。 作者刚开始描述的做酒店时钟系统的开发流程。由文档到设计到系统,完全按照正常的开发流程。作者采用领域模型订阅和术语表定义的方式明确需求。然后用...
  • shuiyue0626
  • shuiyue0626
  • 2015-12-09 20:07:52
  • 522

我来评三国

“卧龙凤雏,得其一者可安天下”。诸葛亮在〈三国演义〉中还没出场,便赚足了眼球,自我营销的十分成功。一出场便当上了刘备军团的CEO,的确是人才,更是天才。但其能否算将将之才?以我之愚见,的确还存在相当的...
  • liuyuehui110
  • liuyuehui110
  • 2017-04-01 12:25:28
  • 425

读《驯服烂代码——在编程操练中悟道》

读《驯服烂代码——在编程操练中悟道》 第2章 按图索骥地编写代码 第4章 调试一下 第5章 用TDD重做编程操练题目 第6章 消除假数据所带来的重复代码 第8章 嗅出代码腐臭和新的测试点 第9章 测试...
  • q547550831
  • q547550831
  • 2016-06-26 19:59:42
  • 2984

时间过得真快,自己也一直未停下脚步!

虽然自己学了java快一年了,但学安卓也快半年了。由刚开始的懵懵懂懂,到现在略知一二,这一路的艰辛,除了身体上的,还有身体和精神上的。       大一下的时候自己撑破死脸,挤进了一个团队,希望团队是...
  • scboyhj__
  • scboyhj__
  • 2013-11-27 20:45:10
  • 1239

用爱绑架他人?

看待一件事情,肯定是可以从
  • u011280039
  • u011280039
  • 2014-06-19 22:31:38
  • 761

Blog 我也来

Blog 我也来
  • heww
  • heww
  • 2006-09-20 13:30:00
  • 391

我来也!!!

我来也!!!努力!!!
  • shishijie01
  • shishijie01
  • 2010-08-17 19:54:00
  • 122

我也来面试

 最近部门要招做Linux driver方面的人 领导安排leader和我一起面试有一段时间没做Linux开发啦 要来面试的还是一个毕业几年的博士我还特意把以前的一些总结看了看 别搞的到时像别人面我似...
  • sailor_8318
  • sailor_8318
  • 2009-11-13 23:47:00
  • 1729

我也来CSDN

我也来CSDN
  • chime1987
  • chime1987
  • 2009-08-25 18:50:00
  • 128
收藏助手
不良信息举报
您举报文章:我也来驯服 Triger !
举报原因:
原因补充:

(最多只允许输入30个字)