分享

妙用Commons良药

 燮羽 2010-11-25
妙用commons良药<一> 
这一篇文章主要是讲Commons IO的一些内容. 
Commons IO提供了org.apache.commons.io.CopyUtils类来将某个InputStream,Reader,byte[]数据或字符串的内容拷贝到OutputStream或Writer. 

Java代码 
  1. Writer writer = new FileWriter( "test.dat" );  
  2. InputStream inputStream =   
  3.     getClass( ).getResourceAsStream("./test.resource");  
  4. CopyUtils.copy( inputStream, writer );  
  5. writer.close( );  
  6. inputStream.close( );  



如果需要把信息从Reader或InputStream拷贝到字符串中,请使用IOUtils.toString()方法. 
Java代码 
  1. InputStream inStream = url.openStream( );  
  2. String contents = IOUtils.toString( inStream );  



通过org.apache.commons.io.IOUtils,你可以很好地关闭某个InputStream,OutputStream,Reader或Writer,而不必担心null或IOException. 
Java代码 
  1. try {  
  2.     File file = new File( "test.dat" );  
  3.     reader = new FileReader( file );  
  4.     result = CopyUtils.toString( reader );  
  5. catch( IOException ioe ) {  
  6.     System.out.println( "Unable to copy file test.dat to a String." );  
  7. finally {  
  8.     IOUtils.closeQuietly( reader );  
  9. }  



使用FileUtils.byteCountToDisplaySize()生成一个字符串,该字符串含有有一个近似的比较好理解的文件的相对大小的值. 
Java代码 
  1. File file = new File("project.xml");  
  2. long bytes = file.length( );  
  3. String display = FileUtils.byteCountToDisplaySize( bytes );  



如果需要将一个文件拷贝为另一个文件,或者需要将某个文件拷贝到某一个目录中,可以使用如下的代码: 
拷贝为另一个文件: 
Java代码 
  1. File src = new File( "test.dat" );  
  2. file dest = new File( "test.dat.bak" );  
  3. FileUtils.copyFile( src, dest );  

拷贝到某一个目录: 
Java代码 
  1. File src = new File( "test.dat" );  
  2. File dir = new File( "./temp" );  
  3. FileUtils.copyFileToDirectory( src, dir );  



使用Commons IO,你也可以很方便把字符串的内容写入文件中去,具体的过程不用怎么理会: 
Java代码 
  1. String string = "Blah blah blah";  
  2. File dest = new File( "test.tmp" );  
  3. FileUtils.writeStringToFile( dest, string);  



当然,有另外的一个功能,可以将URL的内容存入文件中去: 
Java代码 
  1. URL src = new URL( "http://www." );  
  2. File dest = new File( "times.html" );  
  3. FileUtils.copyURLToFile( src, dest );  



如果你需要删除一个目录下的所有内容(包括其目录),可以这样做: 
Java代码 
  1. File dir = new File( "temp" );  
  2. FileUtils.deleteDirectory( dir );  
如果只想清空目录下所有内容,并不删除该目录,可以这样写:FileUtils.cleanDirectory( dir ); 


很简单地,可以得到一个目录的大小: 
Java代码 
  1. File dir = new File( "temp" );  
  2. long dirSize = FileUtils.sizeOfDirectory( );  



如果你想得到某个目录下所有以.txt结尾的文件,可以如下这样做: 
Java代码 
  1. import java.io.FilenameFilter;  
  2. import org.apache.commons.io.filefilter.SuffixFileFilter;  
  3. import org.apache.commons.lang.ArrayUtils;  
  4.   
  5. File rootDir = new File(".");  
  6. FilenameFilter fileFilter = new SuffixFileFilter(".txt");  
  7. String[] txtFiles = rootDir.list( fileFilter );  
  8. System.out.println( ArrayUtils.toString( txtFiles ) );  



举另一个例子,怎样列出目录中以.htm和.html结尾的文件 
Java代码 
  1. import org.apache.commons.io.filefilter.AndFileFilter;  
  2. import org.apache.commons.io.filefilter.DirectoryFileFilter;  
  3. import org.apache.commons.io.filefilter.IOFileFilter;  
  4. import org.apache.commons.io.filefilter.NotFileFilter;  
  5. import org.apache.commons.io.filefilter.OrFileFilter;  
  6. import org.apache.commons.io.filefilter.SuffixFileFilter;  
  7. import org.apache.commons.lang.ArrayUtils;  
  8.   
  9. IOFileFilter htmlFilter =   
  10.     new OrFileFilter( new SuffixFileFilter("htm"),new SuffixFileFilter("html") ); //复合两个SuffixFileFilter  
  11. IOFileFilter notDirectory = new NotFileFilter( DirectoryFileFilter.INSTANCE );    //拒绝选择目录  
  12. FilenameFilter fileFilter = new AndFileFilter( htmlFilter, notDirectory );  
  13. String[] htmlFiles = rootDir.list(fileFilter);  
  14. System.out.println( ArrayUtils.toString( htmlFiles ));  


注:文中代码来之<<Jakarta Commons Cookbook>>一书第十章 
文章待续,会写一些关于commons的笔录下来 
 
妙用Commons良药<二> 

谈谈怎么用org.apache.commons.lang.StringUtils这一个类,讲一下具体的几个常用的方法 
使用StringUtils.isBlank(),该方法在收到空字符串,零长度字符串或全为空格的字符串时将返回true.它能通过返回true的方式优雅地处理null. 
Java代码 
  1. String test = "";  
  2. String test2 = "\n\n\t";  
  3. String test3 = null;  
  4. String test4 = "Test";  
  5. System.out.println( "test blank? " + StringUtils.isBlank( test ) );  
  6. System.out.println( "test2 blank? " + StringUtils.isBlank( test2 ) );  
  7. System.out.println( "test3 blank? " + StringUtils.isBlank( test3 ) );  
  8. System.out.println( "test4 blank? " + StringUtils.isBlank( test4 ) );  
前面三个返回true,返回一个返回false 


同样,有一个StringUtils.isNotBlank()方法,当一个字符串里面为空,或只包含空格,或是null时,该方法将返回false,该方法的作用相当于: 
Java代码 
  1. if( variable != null &&  variable.length( ) > 0 && !variable.trim( ).equals("") ) {  
  2.         // Do something  
  3. }  



接下来,介绍一个非常有用的方法StringUtils.abbreviate(),该方法接受一个字符串,如果可以的话就缩减它,如果要把一个字符串缩减为20个字符长,而原字符串长度小于20个字符长,则该方法将返回原文本.若原字符串长度大于20个字符,则显示17个字符和3个省略号. 
Java代码 
  1. String test = "This is a test of the abbreviation."  
  2. String test2 = "Test"  
  3. System.out.println( StringUtils.abbreviate( test, 10 ) );  
  4. System.out.println( StringUtils.abbreviate( test2, 10 ) );  
结果如下: 
This is... 
Test
 
另外一点,可以使用StringUtils.split(),并提供一系列字符作为分隔符,StringUtils.chomp()去除字符串的末行终止序列. 



接下来,看一下StringUtils.substringBetween()方法,看下面一个例子: 
Java代码 
  1. String variables = "{45}, {35}, {120}" ;  
  2. List numbers = new ArrayList( );  
  3.   
  4. String variablesTemp = variables;  
  5. while( StringUtils.substringBetween( variablesTemp, "{""}" ) != null ) {  
  6.     String numberStr = StringUtils.substringBetween( variables, "{""}" );  
  7.     Double number = new Double( numberStr );  
  8.     numbers.add( number );  
  9.     variablesTemp = variablesTemp.substring( variablesTemp.indexOf(",") );  
  10. }  
  11. double sum = StatUtil.sum( ArrayUtils.toPrimitive( numbers.toArray( ) ) );  
  12. System.out.println( "Variables: " + variables + ", Sum: " + sum );  
其结果如下: 
Variable: {45}, {35}, {120}, Sum: 200 


如果字符串的首尾含有需要清除的字符,可使用StringUtils.strip()清除它们.看下面例子: 
Java代码 
  1. String original = "-------***---SHAZAM!---***-------";  
  2. String stripped = StringUtils.strip( original, "-*" );  
  3. System.out.println( "Stripped: " + stripped )  

结果如下: 
Stripped: SHAZAM! 



增加一点,StringUtils.reverse()可以实现字符串的反转,StringUtils.reverseDelimited()能够分隔符反向排列字符串中的标记.举例: 
Java代码 
  1. public Sentence reverseSentence(String sentence) {  
  2.     String reversed = StringUtils.chomp( sentence, "." );  
  3.     reversed = StringUtils.reverseDelimited( reversed, ' ' );  
  4.     reversed = reversed + ".";  
  5.     return reversed;  
  6. }   
  7. String sentence = "I am Susan."  
  8. String reversed = reverseSentence( sentence ) );  
  9. System.out.println( sentence );  
  10. System.out.println( reversed );  

结果如下: 
I am Susan. 
Susan am I.:
 


当然,还可以检测字符串内容,isNumeric( ),isAlpha(),isAlphanumeric(),and isAlphaSpace()这几个方法用来验证用户输入的正确性,验证字符串的内容是否为数字,是否字符,是否为数字+字符,是否为字符+空格. 


如果你需要检查一个大文件里面一个字符串出现的次数,可以为StringUtils.countMatches()这一个方法,下面举一个比较好的例子,不能将整个文件放入内存中,相对比较合理的做法是一次一行地统计,其方法如下: 
Java代码 
  1. public  int testNumber() throws Exception{  
  2.        File manuscriptFile = new File("c:\\test.txt");  
  3.        Reader reader = new FileReader(manuscriptFile);  
  4.        LineNumberReader lineReader = new LineNumberReader(reader);  
  5.        int number = 0;  
  6.        while(lineReader.ready()){  
  7.            String line = StringUtils.lowerCase(lineReader.readLine());  
  8.            number += StringUtils.countMatches(line, "test");  
  9.        }  
  10.        return number;  
  11.          
  12.    }  
 
这一篇文章主要是介绍怎样用Commons处理XMl文件 
1、将XML文档转化为你想要的对象 
   可以使用org.apache.commons.digester.Digester来实现你想要的功能,其步骤如下:定义待匹配的模式,以及遇到之些模式时将执行的动作,通过Digester可以很容易地实现你自己的SAX解析器,并让你无须处理复杂的SAX API,即可完成你想要的功能。Digester只是SAX外面的一个轻量级外壳,其解析的速度差不多和SAX一样快的。 
   看一个XML文件: 
Java代码 
  1. <?xml version="1.0"?>  
  2. <plays>  
  3.   <play genre="tragedy" year="1603" language="english">  
  4.     <name>Hamlet</name>  
  5.     <author>William Shakespeare</author>  
  6.     <summary>  
  7.       Prince of Denmark freaks out, talks to ghost, gets into a  
  8.       crazy nihilistic funk, and dies in a duel.  
  9.     </summary>  
  10.     <characters>  
  11.       <character protagonist="false">  
  12.         <name>Claudius</name>  
  13.         <description>King of Denmark</description>  
  14.       </character>  
  15.       <character protagonist="true">  
  16.         <name>Hamlet</name>  
  17.         <descr> Son to the late, and nephew of the present king </descr>  
  18.       </character>  
  19.       <character protagonist="false">  
  20.         <name>Horatio</name>  
  21.         <descr>friend to Hamlet </descr>  
  22.       </character>  
  23.     </characters>  
  24.   </play>  
  25. </plays>  


为了解析这一个配置文件的内容,相对应地我们写出下面的类: 
Java代码 
  1. public class Play {  
  2.     private String genre;  
  3.     private String year;  
  4.     private String language;  
  5.     private String name;  
  6.     private String author;  
  7.     private String summary;  
  8.     private List characters = new ArrayList( );  
  9.     // accessors omitted for brevity  
  10.     // Add method to support adding elements to characters.  
  11.     public void addCharacter(Character character) {  
  12.         characters.add( character );  
  13.     }  
  14. }  
  15. public class Character {  
  16.     private String name;  
  17.     private String description;  
  18.     private boolean protagonist;  
  19.     // accessors omitted for brevity  
  20. }  


下一步,写出Digester的配置文件: 
Java代码 
  1. <?xml version="1.0"?>  
  2. <digester-rules>  
  3.   <pattern value="plays/play">  
  4.     <object-create-rule classname="xml.digester.Play"/>  
  5.     <set-next-rule methodname="add" paramtype="java.lang.Object"/>  
  6.     <set-properties-rule/>  
  7.     <bean-property-setter-rule pattern="name"/>  
  8.     <bean-property-setter-rule pattern="summary"/>  
  9.     <bean-property-setter-rule pattern="author"/>  
  10.     <pattern value="characters/character">  
  11.       <object-create-rule classname="xml.digester.Character"/>  
  12.       <set-next-rule methodname="addCharacter"   
  13.                      paramtype="xml.digester.Character"/>  
  14.       <set-properties-rule/>  
  15.       <bean-property-setter-rule pattern="name"/>  
  16.       <bean-property-setter-rule pattern="descr"   
  17.                                  propertyname="description"/>  
  18.     </pattern>  
  19.   </pattern>  
  20. </digester-rules>  


下面是其解析的过程,是不是相对于SAX来说简单多了啊,呵呵: 
Java代码 
  1. import org.apache.commons.digester.Digester;  
  2. import org.apache.commons.digester.xmlrules.DigesterLoader;  
  3.   
  4. List plays = new ArrayList( );  
  5. // Create an instance of the Digester from the XML rule set  
  6. URL rules = getClass( ).getResource("./play-rules.xml");  
  7. Digester digester = DigesterLoader.createDigester(rules);  
  8. // Push a reference to the plays List on to the Stack  
  9. digester.push(plays);  
  10.   
  11. // Parse the XML document  
  12. InputStream input = getClass( ).getResourceAsStream("./plays.xml");  
  13. Object root = digester.parse(input);  
  14.   
  15. // The XML document contained one play "Hamlet"  
  16. Play hamlet = (Play) plays.get(0);  
  17. List characters = (List) hamlet.getCharacters( );  



2、将Beans转化为XML文档 
使用Commons Betwixt里面的org.apache.commons.betwixt.io.BeanWriter类可以把某个bean转换为一个xml文档,看下面的例子: 

Java代码 
  1. Play play = new Play( );  
  2. // populatePlay populates all properties and nested Character objects  
  3. populatePlay( play );  
  4. // Write XML document  
  5. BeanWriter beanWriter = new BeanWriter( );  
  6. beanWriter.enablePrettyPrint( );  
  7. beanWriter.write( play );  
  8. System.out.println( beanWriter.toString( ) );  

短短的几行代码就可以实现这一个功能了,简单吧;注意一下,beanWriter.enablePrettyPrint( )是启用缩进格式. 

BeanWriter 类还用于向某个OutputStream或Writer写入XML文档,只要向其构造函数传一个Writer或OutputStream实例即可. 
Java代码 
  1. import org.apache.commons.betwixt.io.BeanWriter  
  2.   
  3. Play play = new Play( );  
  4. populatePlay( play );  
  5.   
  6. Writer outputWriter = new FileWriter("test.dat");  
  7. BeanWriter beanWriter = new BeanWriter( outputWriter );  
  8. beanWriter.setEndOfLine( "\r\n" );  
  9. beanWriter.setIndent( "\t" );  
  10. beanWriter.enablePrettyPrint( );  
  11. beanWriter.write( play );  
  12. outputWriter.close( );  

另外提示一下,beanWriter.setEndOfLine()方法可接受一个String作为行结束序列。beanWriter.setIndent()方法接受一个String参数,该String将在BeanWriter中enablePrettyPrint()开启缩进时用作缩进字符串。 

3、转换XML文档为Beans 
其实这一部分的内容和第一部分的内容差不多有点类似的,有兴趣的朋友可以对比一下. 
Commons Betwixt使用Commons Digester解析XML,而BeanReader即为Digester的一个子类。BeanReader使用自省机制以及类路径中的Betwixt映射文件来创建了一组Digester规则. 
举例,有一个XMl文件就为前面第一个XML文件 

Java代码 
  1. import org.apache.commons.betwixt.io.BeanReader;  
  2.   
  3. InputStream customPlay =   
  4.     getClass( ).getResourceAsStream("./customized-play.xml");  
  5. BeanReader beanReader = new BeanReader( );  
  6. beanReader.getXMLIntrospector( ).setWrapCollectionsInElement(false);  
  7. beanReader.registerBeanClass(Play.class);  
  8. Play play = (Play) beanReader.parse( customPlay );  



注:些文章中的代码来自<<Jakarta Commons Cookbook>>第六章内容
 
妙用Commons良药<四> 

谈一谈Math包的一点内容,和怎样对属性文件,xml文件进行访问 
1、关于org.apache.commons.lang.math的应用 
可使用Commons Lang的NumberUtils.max()和NumberUtils.min()方法来从基本类型数组(如
Java代码 
  1. double[],float[],long[],int[],short[],byte[])中检索出最小或最大值.举例:  
  2. import org.apache.commons.lang.math.NumberUtils;  
  3.   
  4. double[] array = {0.20.40.5, -3.04.2234.226};  
  5. double max = NumberUtils.max( array ); // returns 4.226  
  6. double min = NumberUtils.min( array ); // returns -3.0  



当然,你可以处理数学的范围,需要为某个变量定义一组可接受的值,并检测该变量值是否落在指定的范围内.Range是一个接口,定义了一个简单的数值范围,它有几个不同的实现,如NumberRange,DoubleRange,FloatRange,IntRange以及LongRange等等. 
Java代码 
  1. import org.apache.commons.lang.math.DoubleRange;  
  2. import org.apache.commons.lang.math.Range;  
  3.   
  4. Range safeSpeed = new DoubleRange( 0.065.0 );  
  5. double currentSpeed = getCurrentSpeed( );  
  6. if( !safeSpeed.containsDouble( currentSpeed ) ) {  
  7.     System.out.println( "Warning, current speed is unsafe." );  
  8. }  




如果你想生成一个随机数,可以这样写: 
Java代码 
  1. import org.apache.commons.lang.math.RandomUtils;  
  2.   
  3. // Create a random integer between 0 and 30  
  4. int maxVal = 30;  
  5. int randomInt = RandomUtils.nextInt( maxVal );  

其作用相当于:int randomInt = (int) Math.floor( (Math.random( ) * (double) maxVal) ); 
此外提示一点,RandomUtils.nextBoolean()可以返回一个随机的boolean变量 


2、关于Jakarta Commons Math包一点应用 
举一个例子,如下: 
Java代码 
  1. import org.apache.commons.math.stat.StatUtils;  
  2.   
  3. double[] values = new double[] { 2.35.46.27.323.3 };  
  4. System.out.println( "min: " + StatUtils.min( values ) );  
  5. System.out.println( "max: " + StatUtils.max( values ) );  
  6. System.out.println( "平均值: " + StatUtils.mean( values ) );  
  7. System.out.println( "积: " + StatUtils.product( values ) );  
  8. System.out.println( "和: " + StatUtils.sum( values ) );  
  9. System.out.println( "方差: " + StatUtils.variance( values ) );  


当然,这一个包也可以处理复数,矩阵,统计以及线性方程,具体的用法参考官方的文档 


3、使用Commons Configuration包配置应用程序 
如果想访问属性文件的话,可以运用PropertiesConfiguration这一个类: 
属性文件如下: 
speed=23.332 
names=Bob,Gautam,Jarret,Stefan 
correct=false 
Java代码 
  1. 其代码如下:  
  2. import org.apache.commons.configuration.Configuration;  
  3. import org.apache.commons.configuration.PropertiesConfiguration;  
  4.   
  5. Configuration config = new PropertiesConfiguration( "test.properties" );         
  6. float speed = config.getFloat("speed"));  
  7. List names = config.getList("names"));  
  8. boolean correct = config.getBoolean("correct");  



如果想访问一个xml文件里面具体的属性,可以使用XMLConfiguration的一个实现从某个文档中加载配置参数。举例如下: 
其配置文件: 
Java代码 
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
  2. <engine-config>  
  3.     <start-criteria>  
  4.         <criteria type="critical">  
  5.             Temperature Above -10 Celsius  
  6.         </criteria>  
  7.         <criteria> Fuel tank is not empty </criteria>  
  8.     </start-criteria>  
  9.     <name>  
  10.         <first>Tom</first>  
  11.         <last>Payne</last>  
  12.     </name>  
  13.     <horsepower>42</horsepower>  
  14. </engine-config>  

具体访问的代码如下: 
Java代码 
  1. import org.apache.commons.configuration.Configuration;  
  2. import org.apache.commons.configuration.DOMConfiguration;  
  3.   
  4. String resource = "com/discursive/jccook/configuration/global.xml";  
  5. Configuration config = new DOMConfiguration(resource);      
  6. // Retrieve a list of all Criteria elements  
  7. List startCriteria = config.getList("start-criteria.criteria");  
  8. // Retrieve the value of the first criteria element  
  9. String firstCriteria = config.getString("start-criteria.criteria(0)");  
  10. // Retrieve the type attribute of the first criteria element  
  11. String firstCriteriaType = config.getString("start-criteria.criteria(0)[@type]");  
  12. // Retrieve the horsepower as an int  
  13. int horsepower = config.getInt("horsepower");  
 
这一篇文章主要是讲一下关于Commons开源项目中其Commons BeanUtils的一些相关的用法. 

1、复制Bean属性 
如果你有两个相同的Bean的实例,并需要将其中的一个bean属性复制到另一个中去,调用PropertyUtils.copyProperties()即可,这一个方法经常在使用struts,hibernate等框架的时候常常用到.举例: 
Java代码 
  1. import org.apache.commons.beanutils.PropertyUtils;  
  2.   
  3. Book book = new Book( );  
  4. book.setName( "Prelude to Foundation" );  
  5. book.setAuthorName( "Asimov" );  
  6. Book destinationBook = new Book( );  
  7. PropertyUtils.copyProperties( destinationBook, book );  

请注意,该方法是将相同的引用对象赋给目的的bean,并没有克隆bean属性的值. 


2、怎样使用Map来封装Bean 
假如你需要将bean的属性传入Map 
可使用BeanMap类封装任何Bean。该Map通过内省机制提供了对bean属性的访问,使得其看上去像是Map中成对的键与值.举例: 
Java代码 
  1. import java.util.*;  
  2. import org.apache.commons.beanutils.PropertyUtils;  
  3.   
  4. // Create a Person and a Book bean instance  
  5. Person person = new Person( );  
  6. person.setName( "Some Dude" );  
  7.   
  8. Book book = new Book( );  
  9. book.setName( "Some Silly Computer Book" );  
  10. book.setAuthor( person );  
  11.   
  12. // Describe both beans with a Map  
  13. Map bookMap = PropertyUtils.describe( book );  
  14. Map authorMap = PropertyUtils.describe( bookMap.get("book") );  
  15. System.out.println( "Book Name: " + bookMap.get( "name" ) );  
  16. System.out.println( "Author Name: " + authorMap.get( "name" ) );  

注意一点,如果你修改了BeanMap的时候,你也就修改了其内部的Bean. 
还有常用的clear(),setBean(Object bean)等方法 


3、可以根据Bean的属性来比较Beans 
使用BeanComparator可根据bean属性来比较两个Bean.兴例如下: 
Java代码 
  1. import java.util.*;  
  2. import org.apache.commons.beanutils.BeanComparator;  
  3.   
  4. Country country1 = new Country( );  
  5. country1.setName( "India" );  
  6. Country country2 = new Country( );  
  7. country2.setName( "Pakistan" );  
  8. Country country3 = new Country( );  
  9. country3.setName( "Afghanistan" );  
  10.   
  11. // Create a List of Country objects  
  12. Country[] countryArray = new Country[] { country1, country2, country3 };  
  13. List countryList = Arrays.asList( countryArray );  
  14.   
  15. // Sort countries by name  
  16. Comparator nameCompare = new BeanComparator( "name" );  
  17. Collections.sort( countryList, nameCompare );  
  18.   
  19. System.out.println( "Sorted Countries:" );  
  20. Iterator countryIterator = countryList.iterator( );  
  21. while( countryIterator.hasNext( ) ) {  
  22.     Country country = (Country) countryIterator.next( );  
  23.     System.out.println( "\tCountry: " + country.getName( ) );  
  24. }  

结果显示如下: 
引用
Sorted Countries: 
    Country: Afghanistan 
    Country: India 
    Country: Pakistan 


注:文章中的代码均来之<<Jakarta  Commons Cookbook>>一书第三章
 
妙用Commons良药 <六> 
1、定义toString(),hashCode(),equals()等内容 
toString()方法举例: 
Java代码 
  1. import org.apache.commons.lang.builder.ToStringBuilder;  
  2. import org.apache.commons.lang.builder.ToStringStyle;  
  3.   
  4. public String toString( ) {  
  5.     return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)  
  6.                    .append("lastName", lastName)  
  7.                    .append("firstName", firstName)  
  8.                    .toString( );  
  9. }  

提示一点,ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE),第二个参数当然也可以为ToStringStyle.DEFAULT_STYLE,ToStringStyle.NO_FIELD_NAMES_STYLE和ToStringStyle.SIMPLE_STYLE 


hashCode()与equals()方法举例: 
Java代码 
  1. import org.apache.commons.lang.builder.HashCodeBuilder;  
  2. import org.apache.commons.lang.builder.EqualsBuilder;  
  3.   
  4. public class PoliticalCandidate {  
  5.     public int hashCode( ) {  
  6.         return new HashCodeBuilder(1737//两个不为0且非偶的质数  
  7.                        .append(firstName)  
  8.                        .append(lastName).toHashCode( );  
  9.     }  
  10.   
  11.     public boolean equals(Object o) {  
  12.         boolean equals = false;  
  13.         if ( o != null &&   
  14.             PoliticalCandidate.class.isAssignableFrom(o) ) {  
  15.             PoliticalCandidate pc = (PoliticalCandidate) o;  
  16.             equals = (new EqualsBuilder( )  
  17.                        .append(firstName, ps.firstName)  
  18.                        .append(lastName, ps.lastName)).isEquals( );  
  19.         }  
  20.         return equals;  
  21.     }  
  22. }  



2、操作数组内容 
ArrayUtils.toString()方法可以输入数组内容,此方法接受任意一个数组作为参数并输出其内容,输出时所有元素位于大括号,中间逗号隔开.举例: 
Java代码 
  1. int[] intArray = new int[] { 23456 };  
  2. int[] multiDimension = new int[][] { { 123 }, { 23 }, {567} };  
  3. System.out.println( "intArray: " + ArrayUtils.toString( intArray ) );  
  4. System.out.println( "multiDimension: " + ArrayUtils.toString( multiDimension ) );  


使用ArrayUtils.reverse()方法可以反转一个数组. 
使用ArrayUtils.toObject()和ArrayUtils.toPrimitive()两个方法,即可互相转换基本类型数组和对象数组。 


当然,Commons也提供了方便的方法,可以在数组中搜索特定项. 
使用ArrayUtils.contains()方法可以判定数组是否存在指完元素.当然有两个比较实用的方法ArrayUtils.lastIndexOf()和ArrayUtils.indexOf(),举例如下: 
Java代码 
  1. import org.apache.commons.lang.ArrayUtils;  
  2.   
  3. String[] stringArray = { "Red""Orange""Blue""Brown""Red" };  
  4. boolean containsBlue = ArrayUtils.contains( stringArray, "Blue" );  
  5. int indexOfRed = ArrayUtils.indexOf( stringArray, "Red");  
  6. int lastIndexOfRed = ArrayUtils.lastIndexOf( string, "Red" );  
  7.   
  8. System.out.println( "Array contains 'Blue'? " + containsBlue );  
  9. System.out.println( "Index of 'Red'? " + indexOfRed );  
  10. System.out.println( "Last Index of 'Red'? " + lastIndexOfRed );  

结果如下: 
引用
Array contains 'Blue'? true 
Index of 'Red'? 0 
Last Index of 'Red'? 4


另外一个功能,你可以很容易将一个二维对象数组成一个Map对象,只需要ArrayUtils.toMap()这一个方法即可.举例如下: 
Java代码 
  1. import org.apache.commons.lang.ArrayUtils;  
  2.   
  3. Object[] weightArray =   
  4.     new Object[][] { {"H" , new Double( 1.007)},  
  5.                      {"He"new Double( 4.002)},  
  6.                      {"Li"new Double( 6.941)},  
  7.                      {"Be"new Double( 9.012)},  
  8.                      {"B",  new Double(10.811)},  
  9.                      {"Ne"new Double(20.180)} };  
  10. Map weights = ArrayUtils.toMap( weightArray );  
  11. Double hydrogenWeight = map.get( "H" );  



3、怎样格式化日期 
如果你想格式化一个的时候,需要注意一下JDK中自带的SimpleDatFormat类不是线程安全的。你可以用FastDateFormat或DateFormatUtils来实现你想要的功能。如果在你的系统中有多个线程共享一个SimpleDatFormat实例,建议你马上改为SimpleDatFormat类. 
举例: 
Java代码 
  1. Date now = new Date( );  
  2. String isoDT = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format( now );  
  3. System.out.println( "It is currently: " + isoDT );  

结果是: 
引用
It is currently: 2004-03-26T16:20:00-07:00


又举一个例子,如下: 
Java代码 
  1. FastDateFormat formatter =   
  2. new FastDateFormat( "yyyy-mm", TimeZone.getDefault( ), Locale.getDefault( ));  
  3. String output = formatter.format( new Date( ) );  
  4. // output equals "2003-10"  


DateFormatUtils的时间格式如下: 
Java代码 
  1. ISO_DATE_FORMAT  
  2.  yyyy-MM-dd"2004-01-02"  
  3.    
  4. ISO_DATE_TIME_ZONE_FORMAT  
  5.  yyyy-MM-ddZZ"2004-01-02-07:00"  
  6.    
  7. ISO_DATETIME_FORMAT  
  8.  yyyy-MM-dd'T'HH:mm:ss"2004-01-02T23:22:12"  
  9.    
  10. ISO_DATETIME_TIME_ZONE_FORMAT  
  11.  yyyy-MM-dd'T'HH:mm:ssZZ"2004-01-02T21:13:45-07:00"  
  12.    
  13. ISO_TIME_FORMAT  
  14.  'T'HH:mm:ss"T04:23:22"  
  15.    
  16. ISO_TIME_NO_T_FORMAT  
  17.  HH:mm:ss"05:12:34"  
  18.    
  19. ISO_TIME_NO_T_TIME_ZONE_FORMAT  
  20.  HH:mm:ssZZ"12:32:22-07:00"  
  21.    
  22. ISO_TIME_TIME_ZONE_FORMAT  
  23.  'T'HH:mm:ssZZ"T18:23:22-07:00"  
  24.    
  25. SMTP_DATETIME_FORMAT  
  26.  EEE, dd MMM yyyy HH:mm:ss Z"Wed, 01 Feb 2004 20:03:01 CST"  


注:本文章代码均来自<<Jarkata Commonss Cookbook>>一书第一章的内容,下一讲主要说一下Functors方面的内容 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多