我也来驯服 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 接口通常会有帮助。

 

 

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

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

JavaScript笔记整理——驯服线程和定时器

定时器提供了一种让一段代码在一定毫秒之后,再异步执行的能力。由于Js是单线程的(同一时间只能执行一处Js代码)。定时器提供了一种跳出这种限制的方法,以一种不太直观的方式来执行代码。需要注意的是,定时器...
  • u014695532
  • u014695532
  • 2016年06月24日 16:23
  • 619

驯服最难以捉摸的野兽──创新

管理思想本质上是一种流行风尚,但也有一些受人喜爱的主题,从来不曾失宠过。创新是常青的主题,没有把创新列为前四个或五个优先要务的CEO,是难得一见的。 但是,创新是个难以捉摸的野兽。姑且不论一...
  • wesay1
  • wesay1
  • 2015年07月12日 13:11
  • 387

linux设备驱动之led子系统<一>

简单的led驱动可以用字符或者混杂设备驱动平台,但是linux系统中用的是平台设备驱动,使led驱动成为一个子系统。 原文地址    http://blog.csdn.net/yuanlulu/ar...
  • keleming1
  • keleming1
  • 2016年04月01日 10:58
  • 351

阅读《驯服烂代码》

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

驯服 Tiger: 并发集合

在 Java 编程的早期阶段,位于 Oswego 市的纽约州立大学(SUNY) 的一位教授决定创建一个简单的库,以帮助开发人员构建可以更好地处理多线程情况的应用程序。这并不是说用现有的库就不能实现,但...
  • huaishu
  • huaishu
  • 2013年01月17日 12:15
  • 285

利用ISE的ChipScope抓取FPGA内部信号

博客背景:做一个4路采集板,FPGA采用Spartan6,抓取与ADC通信的SPI信号 第一步 建立工程,SPI通信协议写好后,在项目中加入ICON和ILA核(使用ILA核或者VIO核时,必须要用...
  • mm5670252
  • mm5670252
  • 2018年01月02日 16:43
  • 49

RxJava 驯服数据流之副作用

前面两部分,我们学习到了如何创建 Observable以及如何从 Observable 中获取数据。本部分将介绍一些更高级的用法,以及一些在大型项目中的最佳实践。 Side effects(副作...
  • qq_27062249
  • qq_27062249
  • 2016年12月08日 17:41
  • 66

《驯服烂代码》第一章

【按】这是本人正在撰写的《驯服烂代码》第一章的草稿,请各位网友审阅,望各位不吝赐教,多谢! 第1章 何谓烂代码 光阴如梭,从1993年大学计算机专业本科毕业,至今一晃就过了近20年。在这近...
  • wubinben28
  • wubinben28
  • 2013年05月16日 13:41
  • 2419

利用Oracle DDL触发器实现DDL监控

前言创建此触发器的主要目的是为了控制数据库的版本,虽然会将DDL语句保留但难免会出现遗漏,所以创建DDl触发器记录DDL操作,主要是用来核对数据库变更的SQL语句创建用户并授权...
  • jaune161
  • jaune161
  • 2015年08月05日 17:31
  • 3266
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我也来驯服 Triger !
举报原因:
原因补充:

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