博文

(转)使用MessageFormat控制输出(2008-07-19 20:20:00)

摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165741.html 本文是为ZDNet翻译的系列文章之一,原文已经发表在ZDNet网站Printf 是很多C语言程序员喜欢的工具,当他们转而使用Java时他们非常的失望。Java有一个替代的方法但是那个方法和C语言的printf()  函数的原理不一样。   幸运的是,早期的Java库的开发者认识到创建一个更合适Java的工具而不是一个printf 函数。   java.text.MessageFormat 允许开发者输出文本中的变量的格式。它是一个强大的类,就像下面的例子展示的那样: String message = "Once upon a time ({1,date}, around about {1,time,short}), there "        + "was a humble developer named Geppetto who slaved for "        + "{0,number,integer} days with {2,number,percent} complete user "        + "requirements. ";Object[] variables = new Object[] { new Integer(4),        &nbs......

阅读全文(3000) | 评论:0

(转)String.getBytes()方法中的中文编码问题(2008-07-13 04:29:00)

摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165753.html String.getBytes()的问题String的getBytes()方法是得到一个字串的字节数组,这是众所周知的。但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组。如果你在使用这个方法时不考虑到这一点,你会发现在一个平台上运行良好的系统,放到另外一台机器后会产生意想不到的问题。比如下面的程序, class TestCharset  {     public static void main(String[] args)      {         new TestCharset().execute();     }     private void execute() {         String s = "Hello!你好!";                  byte[] bytes = s.getBytes();         System.out.println("bytes lenght is:" + bytes.length);     } } 在一个中文WindowsXP系统下,运行时,结果为:bytes leng......

阅读全文(3426) | 评论:0

(转)Java中浮点数的输出形式及可能引起的问题(2008-07-13 04:23:00)

摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165759.html 近来在项目中使用到了一个数据库SQL语句,这个SQL语句是动态生成的,类似下面的方式:     Double quantity = ...;     String sql = "INSERT INTO " + tableName + " (id, name, quantity) VALUES("  + id + ",'" + name + "'," + quantity + ")";     系统正常运行1年多了,突然近段时间系统出错。由于生产环境缺乏充分的调试信息,所以,调试非常困难。经过艰苦的追踪和调试输出,发现问题出现在Double型的quantity的字符串表示上。因为近期系统中quantity遇到了一个比较大的值(大于了10的7次方),而Double型的quantity这儿解析为了类似“1.153E7”的科学计数法形式,虽然大部分的SQL兼容的驱动器基本都认识这种科学计数法形式的数字表示形式,但还是有一些不支持(是否SQL规范中有规定我不清楚,欢迎大家求证)。对于一些不支持这种数字表示形式的驱动器,问题就出来了,它会把它当成一个非法的数字从而报错。在Java中浮点数包括基本型float、double,以及对象包装类型的Float和Double,对于这些浮点数的输出,不管是显式地还是隐式地调用toString()得到它的表示字串,输出格式都是按照如下规则进行的:     如果绝对值大于0.001、小于10000000,那么就以常规的小数形式表示。     如果在上述范围之外,则使用科学计数法表示。即类似于......

阅读全文(3113) | 评论:0

(转)Hashtable和HashMap(2008-07-13 04:14:00)

摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165770.html Hashtable和HashMapHashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。一些资料建议,当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。......

阅读全文(2288) | 评论:0

(转)JAVA中正则表达式的应用-java.util.regex篇(2008-07-13 04:04:00)

摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165734.html 现在JDK1.4里终于有了自己的正则表达式API包,JAVA程序员可以免去找第三方提供的正则表达式库的周折了,我们现在就马上来了解一下这个SUN提供的迟来恩物- -对我来说确实如此。 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。  Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。 以下我们就分别来看看这两个类: 2.Pattern类:  Pattern的方法如下: static Pattern compile(String regex) 将给定的正则表达式编译并赋予给Pattern类  static Pattern compile(String regex, int flags) 同上,但增加flag参数的指定,可选的flag参数包括:CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE CASE, CANON EQ  int flags() 返回当前Pattern的匹配flag参数.  Matcher matcher(CharSequence input) 生成一个给定命名的Matcher对象  static boolean matches(String&......

阅读全文(3193) | 评论:1

(转)java.util包(2008-07-19 20:53:00)

摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165807.html 本章介绍Java的实用工具类库java.util包。在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。  图1.1给出了java.util包的基本层次结构图。下面我们将具体介绍其中几个重要的类。           ┌java.util.BitSet           │java.util.Calendar           │      └java.util.GregorianCalendar           │java.util.Date           │java.util.Dictionary           │      └java.util.Hashtable           │             └java.util.Properties           │java.util.EventObject           │java.util.ResourceBundle       ┌普通类┤      ├java.util.ListResourceBundle       │   │      └java.util.PropertyResourceBundle       │   │java.util.Local       │   │java.util.Observable       │   │java.util.Random       │   │java.util.StringTokenizer       │   │java.util.Vector       │   │      └java.util.Stack  Java.util┤   └java.util.TimeZone       │          └java.util.SimpleTimeZone       │   ┌java.util.En......

阅读全文(3197) | 评论:0

(转)JAVA正则表达式4种常用功能(2008-07-19 20:58:00)

摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165801.html JAVA正则表达式4种常用功能      正则表达式在字符串处理上有着强大的功能,sun在jdk1.4加入了对它的支持    下面简单的说下它的4种常用功能:    查询:  以下是代码片段:String str="abc efg ABC";  String regEx="a|f"; //表示a或f  Pattern p=Pattern.compile(regEx); Matcher m=p.matcher(str);  boolean rs=m.find();     如果str中有regEx,那么rs为true,否则为flase。如果想在查找时忽略大小写,则可以写成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);    提取:以下是代码片段:  String regEx = ".+\\(.+)$";String str = "c:\\dir1\\dir2\\name.txt";Pattern p = Pattern.compile(regEx);Matcher m = p.matcher(str);boolean rs = m.find();for (int i = 1; i <= m.groupCount(); i++) {     System.out.println(m.group(i));}    以上的执行结果为name.txt,提取的字符串储存在m.group(i)中,其中i最大值为m.groupCount();    分割:  以下是代码片段:String&nbs......

阅读全文(1916) | 评论:0

(转)使用Java中的Date和Calendar类(2008-07-19 21:20:00)

摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165787.html Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日期, 定制日期的显示格式, 并将文本数据解析成日期对象. 我们写了两篇文章, 这是第一篇, 我们将大概的学习日期, 日期格式, 日期的解析和日期的计算.我们将讨论下面的类:1、具体类(和抽象类相对)java.util.Date 2、抽象类java.text.DateFormat 和它的一个具体子类,java.text.SimpleDateFormat 3、抽象类java.util.Calendar 和它的一个具体子类,java.util.GregorianCalendar 具体类可以被实例化, 但是抽象类却不能. 你首先必须实现抽象类的一个具体子类.Date 类从Java 开发包(JDK) 1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中进一步讨论它. 这种改进旨在更好的处理日期数据的国际化格式. 就象在JDK 1.1中一样, Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.一、创建一个日期对象r让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子. 这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间.import java.......

阅读全文(9267) | 评论:0

(转)Java Security Notes(2008-07-13 03:15:00)

摘要:摘自 winnerineast 的 Blog (1) The book I get is 2nd version, so it's still fresh even author released it in 2001. The book consists of 15 chapters each of which focuses on one of JAVA security topics. In the following days, I will share my study notes with you guys. First of all, I list the chapter list here (actually, you could find them around internet easily):Chapter 1, Java Application SecurityChapter 2, The Default SandboxChapter 3, Java Language SecurityChapter 4, The Security ManagerChapter 5, The Access ControllerChapter 6, Java Class LoaderChapter 7, Introduction to CryptographyChapter 8, Security ProvidorsChapter 9, Keys and CertificatesChapter 10, Key ManagementChapter 11, Message DigestsChapter 12, Digital SignaturesChapter 13, Cipher-Based EncryptionChapter 14, SSL and HTTPSChapter 15, Authentication and AuthorizationIf you review above titiles of chapters carefully and are familiar with JAVA Application anatomy, author presents his view along with JAVA topograph......

阅读全文(2477) | 评论:0

(转)Java安全(2008-07-13 03:05:00)

摘要:  如果要用Java来开发安全程序,坦白地说,第一步(在学习了Java之后)就是要阅读两本有关Java安全的教材,即Gong [1999]和McGraw [1999](后一本特别要看第7.1节)。还应该看一下Sun发布的安全代码指南http://java.sun.com/security/seccodeguide.html。有一组描述Java安全模型的幻灯片可以从 http://www.dwheeler.com/javasec 免费获取。  下面是基于Gong [1999]、McGraw [1999]和Sun的指南的若干关键要点:  不要使用公共域或变量;把它们声明为私有的并提供访问函数以限制对它们的访问。  除非有很好的理由,把方法都设为私有的(如果确实没这样做,说清楚其理由)。这些非私有的方法必须保护自己,因为它们可能会接收到受污染的数据(除非已经用其它方式对它们进行了保护)。  避免使用静态域变量。这样的变量附着在类(而非类的实例)上,而类可以被其它类所定位。其结果就是静态域变量可以被其它类找到,因此很难保证它们的安全。  永远不要把可变对象返回给潜在有恶意的代码(因为代码可能会改变它)。注意,数组是可变的(即使数组的内容不可变),所以不要返回一个含有敏感数据的内部数组的引用。  永远不要直接保存用户给定的可变对象(包括对象的数组)。否则,用户可以把对象交给安全代码,让安全代码“检查”对象,并在安全代码试图使用数据时改变数据。应该在内部存储数组前复制它们,而且要小心(例如,警惕用户编写的复制例程)。  不要依赖于初始化。有好几种方法给未初始化的对象分配内存。  除非有很好的理由,应该使每件事都是确定的。如果某个类或方法不是确定的,攻击者就可以用某种危险而无法预知的方法来扩展它。注意,作为安全性的交换,这会带来可扩展性的丧失。  不要在安全性上依赖包的范围。若干类,如java.lang,缺省是关闭的,而且某些Java虚拟机(JVM)会让你关闭其它包。否则,Java类是没有关闭的。因此,攻击者可以向包中引入一个新类,并用此新类来访问你以为保护了的信息。  不要使用内部类。在内部类转换为字节代码时,内部类会转换为可以访问包中任意类的类。更糟的是,被封装类的私有域静悄悄地变成非私有的,允许内部类访问!  最小化特权。如果可能,完全不要请求任何特殊的许可。McGraw更......

阅读全文(1757) | 评论:0