Java高级知识总结


资料整理于网络:参考http://blog.csdn.net/column/details/java0115.html,在此感谢

1.关于枚举的用法

Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看。

1、可以在enum中添加变量和方法

先来看一段代码示例:

[java]  view plain copy
  1. public enum State {  
  2.         Normal("正常态"1), Update("已更新"2), Deleted("已删除"3), Fired("已屏蔽"4);  
  3.         // 成员变量  
  4.         private String name;  
  5.         private int index;  
  6.   
  7.         // 构造方法,注意:构造方法不能为public,因为enum并不可以被实例化  
  8.         private State(String name, int index) {  
  9.             this.name = name;  
  10.             this.index = index;  
  11.         }  
  12.   
  13.         // 普通方法  
  14.         public static String getName(int index) {  
  15.             for (State c : State .values()) {  
  16.                 if (c.getIndex() == index) {  
  17.                     return c.name;  
  18.                 }  
  19.             }  
  20.             return null;  
  21.         }  
  22.   
  23.         // get set 方法  
  24.         public String getName() {  
  25.             return name;  
  26.         }  
  27.   
  28.         public void setName(String name) {  
  29.             this.name = name;  
  30.         }  
  31.   
  32.         public int getIndex() {  
  33.             return index;  
  34.         }  
  35.   
  36.         public void setIndex(int index) {  
  37.             this.index = index;  
  38.         }  
  39.     }  

从上面的代码中我们可以看到,定义完枚举值,然后在其后面加上分号,接着就可以定义其他的变量、方法了。另外需要特别说明的是,enum中的构造方法不可以用public标识,这样做是为了防止用户实例化enum。

2、可以用来定义常量

先来回顾一下Java中如何定义常量吧,看下面一段代码:

public static final int normalState = 1;
private static final int updateState = 2;

下面我们还可以用enum枚举来代替上面的常量定义,代码如下:

[java]  view plain copy
  1. public enum State {    
  2.   Normal, Update, Deleted, Fired  
  3. }  

在Java中用enum来定义常量在语法上没有什么优势,但是enum枚举类型可以提供更多的操作功能。

3、在enum中实现接口

先来看下面一段代码:

[java]  view plain copy
  1. public interface ICanReadState {  
  2.         void read();  
  3.   
  4.         String getState();  
  5. }  
  6.   
  7.     public enum State implements ICanReadState {  
  8.         Normal("正常态"1), Update("已更新"2), Deleted("已删除"3), Fired("已屏蔽"4);  
  9.   
  10.         private String name;  
  11.         private int index;  
  12.   
  13.         private State(String name, int index) {  
  14.             this.name = name;  
  15.             this.index = index;  
  16.         }  
  17.   
  18.         // 接口方法1  
  19.   
  20.         @Override  
  21.         public String getState() {  
  22.             return this.name;  
  23.         }  
  24.   
  25.         // 接口方法2  
  26.         @Override  
  27.         public void read() {  
  28.             System.out.println(this.index + ":" + this.name);  
  29.         }  
  30.     }  

和一般的类中使用接口一样,enum枚举中同样可以继承接口,并实现接口中的所有方法,这样做的好处在于可以更方便地对枚举中的值进行排序、比较等操作,封装性更好。

总结

说白了,enum枚举类型是一个不可以被继承的final类,就以上面的State枚举为例,如果你查看enum类型的字节码,其实是State类型的类静态常量。


2.Java中操作Cookie对象

/**
 * @Description: 
 *
 * @Title: CookieUtil.java
 * @Package com.hupu.nac.util
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-1-15 上午10:17:51
 * @version V2.0
 */
package com.hupu.nac.util;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Description: Cookie读写
 *
 * @ClassName: CookieUtil
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-1-15 上午10:17:51
 * @version V2.0
 */
public class CookieUtil {
	
	/**
	 * @Description: 添加cookie 
	 *
	 * @param response
	 * @param name
	 * @param value
	 * @param maxAge
	 * @return
	 *
	 * @Title: CookieUtil.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-1-15 上午10:29:29
	 * @version V2.0
	 */
	public static Cookie addCookie(HttpServletResponse response,String name,String value,int maxAge){
	    Cookie cookie = new Cookie(name,value);
		cookie.setPath("/");
	    if(maxAge > 0){
	    	cookie.setMaxAge(maxAge);
	    }
	    response.addCookie(cookie);
	    return cookie;
	}
	
	/**
	 * @Description: 根据key获取Cookie对象
	 *
	 * @param request
	 * @param key
	 * @return
	 *
	 * @Title: CookieUtil.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-1-15 上午10:29:44
	 * @version V2.0
	 */
	public static Cookie getCookieByName(HttpServletRequest request,String key){
	    Map cookieMap = readCookieMap(request);
	    if(cookieMap.containsKey(key)){
	        Cookie cookie = (Cookie)cookieMap.get(key);
	        return cookie;
	    }else{
	        return null;
	    }   
	}
	
	/**
	 * @Description: 封装Cookie读取方法
	 *
	 * @param request
	 * @return
	 *
	 * @Title: CookieUtil.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-1-15 上午10:30:05
	 * @version V2.0
	 */
	private static Map readCookieMap(HttpServletRequest request){  
	    Map cookieMap = new HashMap();
	    Cookie[] cookies = request.getCookies();
	    if(null != cookies){
	        for(Cookie cookie : cookies){
	            cookieMap.put(cookie.getName(), cookie);
	        }
	    }
	    return cookieMap;
	}
}




3.使用JAXB对XML和Java对象进行转换


package com.advanced.JAXB完成XML与Java对象的互转;

import java.io.ByteArrayOutputStream;
import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

/**
 * @Description:JAXB对象和XML转换util 
 *  
 * @ClassName: JAXBUtil 
 * @Copyright: Copyright (c) 2014 
 * 
 * @author He
 *
 */
public class JAXBUtil {
	
	/**
	 * 将对象转换为XML
	 * 
	 * @param ojb
	 * @param beanClass
	 * @return
	 * @throws Exception
	 */
	public String objectToXmlStr(Object obj, Class beanClass) throws Exception{
		
		JAXBContext context = JAXBContext.newInstance(beanClass);
		//根据上下文获取marshaller对象
		Marshaller marshaller = context.createMarshaller();
		//设置编码集
		marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
		//格式化XML输出,有分行和缩进
		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
		//打印到控制台
//		marshaller.marshal(obj, System.out);
		
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		marshaller.marshal(obj, baos);
		String xmlObj = new String(baos.toByteArray());
		
		return xmlObj.replace(" standalone=\"yes\"", "");
	}
	
	/** 
     * @Description: 将对象转换为XML并且写入文件 
     * 
     * @param obj 
     * @param beanClass 
     * @param file 
     * @throws Exception 
     * 
     * @Title: JAXBUtil.java 
     * @Copyright: Copyright (c) 2014 
     */  
    @SuppressWarnings("unchecked")  
    public void objectToXmlStr(Object obj, Class beanClass, File file) throws Exception {  
        JAXBContext context = JAXBContext.newInstance(beanClass);  
        // 根据上下文获取marshaller对象  
        Marshaller marshaller = context.createMarshaller();  
        // 设置编码字符集  
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");  
        // 格式化XML输出,有分行和缩进  
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
        // 打印到控制台  
        marshaller.marshal(obj, System.out);  
        marshaller.marshal(obj, file);  
    }  
      
	
	/**
	 * 解析XML文件并转换为对象
	 * 
	 * @param file
	 * @param beanClass
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public  T xmlStrToObject(File file, Class beanClass) throws Exception{
		T bean = beanClass.newInstance();
		JAXBContext context = JAXBContext.newInstance(beanClass);
		Unmarshaller unmarshaller = context.createUnmarshaller();
		bean = (T) unmarshaller.unmarshal(file);
		return bean;
	}
	
}

4.任务调度开源框架Quartz动态添加、修改和删除定时任务


 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听。Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。并且还能和Spring配置整合使用。Quartz在功能上远远超越了JDK自带的Timer,很好很强大!好啦,直接上代码:

[java]  view plain copy
  1. /** 
  2.  * @Description:  
  3.  * 
  4.  * @Title: QuartzManager.java 
  5.  * @Package com.joyce.quartz 
  6.  * @Copyright: Copyright (c) 2014 
  7.  * 
  8.  * @author Comsys-LZP 
  9.  * @date 2014-6-26 下午03:15:52 
  10.  * @version V2.0 
  11.  */  
  12. package com.joyce.quartz;  
  13.   
  14. import org.quartz.CronTrigger;  
  15. import org.quartz.JobDetail;  
  16. import org.quartz.Scheduler;  
  17. import org.quartz.SchedulerFactory;  
  18. import org.quartz.impl.StdSchedulerFactory;  
  19.   
  20. /** 
  21.  * @Description: 定时任务管理类 
  22.  *  
  23.  * @ClassName: QuartzManager 
  24.  * @Copyright: Copyright (c) 2014 
  25.  *  
  26.  * @author Comsys-LZP 
  27.  * @date 2014-6-26 下午03:15:52 
  28.  * @version V2.0 
  29.  */  
  30. public class QuartzManager {  
  31.     private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();  
  32.     private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";  
  33.     private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";  
  34.   
  35.     /** 
  36.      * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 
  37.      *  
  38.      * @param jobName 
  39.      *            任务名 
  40.      * @param cls 
  41.      *            任务 
  42.      * @param time 
  43.      *            时间设置,参考quartz说明文档 
  44.      *  
  45.      * @Title: QuartzManager.java 
  46.      * @Copyright: Copyright (c) 2014 
  47.      *  
  48.      * @author Comsys-LZP 
  49.      * @date 2014-6-26 下午03:47:44 
  50.      * @version V2.0 
  51.      */  
  52.     @SuppressWarnings("unchecked")  
  53.     public static void addJob(String jobName, Class cls, String time) {  
  54.         try {  
  55.             Scheduler sched = gSchedulerFactory.getScheduler();  
  56.             JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类  
  57.             // 触发器  
  58.             CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组  
  59.             trigger.setCronExpression(time);// 触发器时间设定  
  60.             sched.scheduleJob(jobDetail, trigger);  
  61.             // 启动  
  62.             if (!sched.isShutdown()) {  
  63.                 sched.start();  
  64.             }  
  65.         } catch (Exception e) {  
  66.             throw new RuntimeException(e);  
  67.         }  
  68.     }  
  69.   
  70.     /** 
  71.      * @Description: 添加一个定时任务 
  72.      *  
  73.      * @param jobName 
  74.      *            任务名 
  75.      * @param jobGroupName 
  76.      *            任务组名 
  77.      * @param triggerName 
  78.      *            触发器名 
  79.      * @param triggerGroupName 
  80.      *            触发器组名 
  81.      * @param jobClass 
  82.      *            任务 
  83.      * @param time 
  84.      *            时间设置,参考quartz说明文档 
  85.      *  
  86.      * @Title: QuartzManager.java 
  87.      * @Copyright: Copyright (c) 2014 
  88.      *  
  89.      * @author Comsys-LZP 
  90.      * @date 2014-6-26 下午03:48:15 
  91.      * @version V2.0 
  92.      */  
  93.     @SuppressWarnings("unchecked")  
  94.     public static void addJob(String jobName, String jobGroupName,  
  95.             String triggerName, String triggerGroupName, Class jobClass,  
  96.             String time) {  
  97.         try {  
  98.             Scheduler sched = gSchedulerFactory.getScheduler();  
  99.             JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类  
  100.             // 触发器  
  101.             CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组  
  102.             trigger.setCronExpression(time);// 触发器时间设定  
  103.             sched.scheduleJob(jobDetail, trigger);  
  104.         } catch (Exception e) {  
  105.             throw new RuntimeException(e);  
  106.         }  
  107.     }  
  108.   
  109.     /** 
  110.      * @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) 
  111.      *  
  112.      * @param jobName 
  113.      * @param time 
  114.      *  
  115.      * @Title: QuartzManager.java 
  116.      * @Copyright: Copyright (c) 2014 
  117.      *  
  118.      * @author Comsys-LZP 
  119.      * @date 2014-6-26 下午03:49:21 
  120.      * @version V2.0 
  121.      */  
  122.     @SuppressWarnings("unchecked")  
  123.     public static void modifyJobTime(String jobName, String time) {  
  124.         try {  
  125.             Scheduler sched = gSchedulerFactory.getScheduler();  
  126.             CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);  
  127.             if (trigger == null) {  
  128.                 return;  
  129.             }  
  130.             String oldTime = trigger.getCronExpression();  
  131.             if (!oldTime.equalsIgnoreCase(time)) {  
  132.                 JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);  
  133.                 Class objJobClass = jobDetail.getJobClass();  
  134.                 removeJob(jobName);  
  135.                 addJob(jobName, objJobClass, time);  
  136.             }  
  137.         } catch (Exception e) {  
  138.             throw new RuntimeException(e);  
  139.         }  
  140.     }  
  141.   
  142.     /** 
  143.      * @Description: 修改一个任务的触发时间 
  144.      *  
  145.      * @param triggerName 
  146.      * @param triggerGroupName 
  147.      * @param time 
  148.      *  
  149.      * @Title: QuartzManager.java 
  150.      * @Copyright: Copyright (c) 2014 
  151.      *  
  152.      * @author Comsys-LZP 
  153.      * @date 2014-6-26 下午03:49:37 
  154.      * @version V2.0 
  155.      */  
  156.     public static void modifyJobTime(String triggerName,  
  157.             String triggerGroupName, String time) {  
  158.         try {  
  159.             Scheduler sched = gSchedulerFactory.getScheduler();  
  160.             CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);  
  161.             if (trigger == null) {  
  162.                 return;  
  163.             }  
  164.             String oldTime = trigger.getCronExpression();  
  165.             if (!oldTime.equalsIgnoreCase(time)) {  
  166.                 CronTrigger ct = (CronTrigger) trigger;  
  167.                 // 修改时间  
  168.                 ct.setCronExpression(time);  
  169.                 // 重启触发器  
  170.                 sched.resumeTrigger(triggerName, triggerGroupName);  
  171.             }  
  172.         } catch (Exception e) {  
  173.             throw new RuntimeException(e);  
  174.         }  
  175.     }  
  176.   
  177.     /** 
  178.      * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名) 
  179.      *  
  180.      * @param jobName 
  181.      *  
  182.      * @Title: QuartzManager.java 
  183.      * @Copyright: Copyright (c) 2014 
  184.      *  
  185.      * @author Comsys-LZP 
  186.      * @date 2014-6-26 下午03:49:51 
  187.      * @version V2.0 
  188.      */  
  189.     public static void removeJob(String jobName) {  
  190.         try {  
  191.             Scheduler sched = gSchedulerFactory.getScheduler();  
  192.             sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器  
  193.             sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器  
  194.             sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务  
  195.         } catch (Exception e) {  
  196.             throw new RuntimeException(e);  
  197.         }  
  198.     }  
  199.   
  200.     /** 
  201.      * @Description: 移除一个任务 
  202.      *  
  203.      * @param jobName 
  204.      * @param jobGroupName 
  205.      * @param triggerName 
  206.      * @param triggerGroupName 
  207.      *  
  208.      * @Title: QuartzManager.java 
  209.      * @Copyright: Copyright (c) 2014 
  210.      *  
  211.      * @author Comsys-LZP 
  212.      * @date 2014-6-26 下午03:50:01 
  213.      * @version V2.0 
  214.      */  
  215.     public static void removeJob(String jobName, String jobGroupName,  
  216.             String triggerName, String triggerGroupName) {  
  217.         try {  
  218.             Scheduler sched = gSchedulerFactory.getScheduler();  
  219.             sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器  
  220.             sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器  
  221.             sched.deleteJob(jobName, jobGroupName);// 删除任务  
  222.         } catch (Exception e) {  
  223.             throw new RuntimeException(e);  
  224.         }  
  225.     }  
  226.   
  227.     /** 
  228.      * @Description:启动所有定时任务 
  229.      *  
  230.      *  
  231.      * @Title: QuartzManager.java 
  232.      * @Copyright: Copyright (c) 2014 
  233.      *  
  234.      * @author Comsys-LZP 
  235.      * @date 2014-6-26 下午03:50:18 
  236.      * @version V2.0 
  237.      */  
  238.     public static void startJobs() {  
  239.         try {  
  240.             Scheduler sched = gSchedulerFactory.getScheduler();  
  241.             sched.start();  
  242.         } catch (Exception e) {  
  243.             throw new RuntimeException(e);  
  244.         }  
  245.     }  
  246.   
  247.     /** 
  248.      * @Description:关闭所有定时任务 
  249.      *  
  250.      *  
  251.      * @Title: QuartzManager.java 
  252.      * @Copyright: Copyright (c) 2014 
  253.      *  
  254.      * @author Comsys-LZP 
  255.      * @date 2014-6-26 下午03:50:26 
  256.      * @version V2.0 
  257.      */  
  258.     public static void shutdownJobs() {  
  259.         try {  
  260.             Scheduler sched = gSchedulerFactory.getScheduler();  
  261.             if (!sched.isShutdown()) {  
  262.                 sched.shutdown();  
  263.             }  
  264.         } catch (Exception e) {  
  265.             throw new RuntimeException(e);  
  266.         }  
  267.     }  
  268. }  

以上就是quartz任务调度对于任务的常用操作,封装起来以便在外部调用!这样我们就需要任务的执行了:
[java]  view plain copy
  1. /** 
  2.  * @Description:  
  3.  * 
  4.  * @Title: QuartzJob.java 
  5.  * @Package com.joyce.quartz 
  6.  * @Copyright: Copyright (c) 2014 
  7.  * 
  8.  * @author Comsys-LZP 
  9.  * @date 2014-6-26 下午03:37:11 
  10.  * @version V2.0 
  11.  */  
  12. package com.joyce.quartz;  
  13.   
  14. import java.text.SimpleDateFormat;  
  15. import java.util.Date;  
  16.   
  17. import org.quartz.Job;  
  18. import org.quartz.JobExecutionContext;  
  19. import org.quartz.JobExecutionException;  
  20.   
  21. /** 
  22.  * @Description: 任务执行类 
  23.  * 
  24.  * @ClassName: QuartzJob 
  25.  * @Copyright: Copyright (c) 2014 
  26.  * 
  27.  * @author Comsys-LZP 
  28.  * @date 2014-6-26 下午03:37:11 
  29.  * @version V2.0 
  30.  */  
  31. public class QuartzJob implements Job {  
  32.   
  33.     @Override  
  34.     public void execute(JobExecutionContext arg0) throws JobExecutionException {  
  35.         System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ "★★★★★★★★★★★");    
  36.     }  
  37. }  

Ok,我们来测试一下:
[java]  view plain copy
  1. /** 
  2.  * @Description:  
  3.  * 
  4.  * @Title: QuartzTest.java 
  5.  * @Package com.joyce.quartz.main 
  6.  * @Copyright: Copyright (c) 2014 
  7.  * 
  8.  * @author Comsys-LZP 
  9.  * @date 2014-6-26 下午03:35:05 
  10.  * @version V2.0 
  11.  */  
  12. package com.joyce.quartz.main;  
  13.   
  14. import com.joyce.quartz.QuartzJob;  
  15. import com.joyce.quartz.QuartzManager;  
  16.   
  17. /** 
  18.  * @Description: 测试类 
  19.  * 
  20.  * @ClassName: QuartzTest 
  21.  * @Copyright: Copyright (c) 2014 
  22.  * 
  23.  * @author Comsys-LZP 
  24.  * @date 2014-6-26 下午03:35:05 
  25.  * @version V2.0 
  26.  */  
  27. public class QuartzTest {  
  28.     public static void main(String[] args) {  
  29.         try {  
  30.             String job_name = "动态任务调度";  
  31.             System.out.println("【系统启动】开始(每1秒输出一次)...");    
  32.             QuartzManager.addJob(job_name, QuartzJob.class"0/1 * * * * ?");    
  33.               
  34.             Thread.sleep(5000);    
  35.             System.out.println("【修改时间】开始(每2秒输出一次)...");    
  36.             QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");    
  37.             Thread.sleep(6000);    
  38.             System.out.println("【移除定时】开始...");    
  39.             QuartzManager.removeJob(job_name);    
  40.             System.out.println("【移除定时】成功");    
  41.               
  42.             System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");    
  43.             QuartzManager.addJob(job_name, QuartzJob.class"*/10 * * * * ?");    
  44.             Thread.sleep(60000);    
  45.             System.out.println("【移除定时】开始...");    
  46.             QuartzManager.removeJob(job_name);    
  47.             System.out.println("【移除定时】成功");  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.     }  
  52. }  

运行一下,看看效果图:


至于定时的配置的话,有兴趣的各位可以去看看Quartz的cron表达式

5.使用Google的Guava简化处理IO


/**
 * @Description: 
 *
 * @Title: FileGuava.java
 * @Package com.joyce.guava.main
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-6-26 下午01:18:18
 * @version V2.0
 */
package com.joyce.guava.main;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.google.common.base.Charsets;
import com.google.common.io.Files;

/**
 * @Description:Guava的文件
 * 
 * @ClassName: FileGuava
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-6-26 下午01:18:18
 * @version V2.0
 */
public class FileGuava {
	public static void main(String[] args) {
		try {
			File readFile = new File(System.getProperty("user.dir") + "/src/resources/showarp.txt");
			StringBuilder content = new StringBuilder();
			if (readFile.exists()) {
				List lines = readFile(readFile);
				for (String string : lines) {
					System.out.println(string);
					content.append(string + "\n");
				}
			}
			File writeFile = new File(System.getProperty("user.dir") + "/src/resources/showarp" + new SimpleDateFormat("yyyyMMdd").format(new Date())+ ".txt");
			writeFile(content.toString(), writeFile);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @Description: Guava文件读取
	 * 
	 * @param file
	 * @return
	 * 
	 * @Title: FileGuava.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午01:20:50
	 * @version V2.0
	 */
	private static List readFile(File file) throws Exception {
		if (!file.exists()) {
			return null;
		}
		return Files.readLines(file, Charsets.UTF_8);
	}
	
	/**
	 * @Description: 从文件中获取有规则的数据 
	 *
	 * @param file
	 * @return
	 *
	 * @Title: FileGuava.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午01:56:42
	 * @version V2.0
	 */
	public List readFileData(File file) throws Exception {
		List list = new ArrayList();
		for (String rLine : readFile(file)) {
			list.add(rLine.split("\\s+"));
		}
		return list;
	}

	/**
	 * @Description: Guava写文件
	 * 
	 * @param content
	 * @param file
	 * 
	 * @Title: FileGuava.java
	 * @Copyright: Copyright (c) 2014
	 * 
	 * @author Comsys-LZP
	 * @date 2014-6-26 下午01:32:06
	 * @version V2.0
	 */
	private static void writeFile(String content, File file) throws Exception {
		if (!file.exists()) {
			file.createNewFile();
		}
		Files.write(content, file, Charsets.UTF_8);
	}
}


6. 使用Guava处理Collection集合

Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。

1. 基本工具 [Basic utilities]
    让使用Java语言变得更舒适
    1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服。很多Guava工具类用快速失败拒绝null值,而不是盲目地接受
    1.2 前置条件: 让方法中的条件检查更简单
    1.3 常见Object方法: 简化Object方法实现,如hashCode()和toString()
    1.4 排序: Guava强大的”流畅风格比较器”
    1.5 Throwables:简化了异常和错误的传播与检查

2. 集合[Collections]
    Guava对JDK集合的扩展,这是Guava最成熟和为人所知的部分
    2.1 不可变集合: 用不变的集合进行防御性编程和性能提升。
    2.2 新集合类型: multisets, multimaps, tables, bidirectional maps等
    2.3 强大的集合工具类: 提供java.util.Collections中没有的集合工具
    2.4 扩展工具类:让实现和扩展集合类变得更容易,比如创建Collection的装饰器,或实现迭代器

3. 缓存[Caches]
    Guava Cache:本地缓存实现,支持多种缓存过期策略

4. 函数式风格[Functional idioms]
    Guava的函数式支持可以显著简化代码,但请谨慎使用它

5. 并发[Concurrency]
    强大而简单的抽象,让编写正确的并发代码更简单
    5.1 ListenableFuture:完成后触发回调的Future
    5.2 Service框架:抽象可开启和关闭的服务,帮助你维护服务的状态逻辑

6. 字符串处理[Strings]
    非常有用的字符串工具,包括分割、连接、填充等操作

7. 原生类型[Primitives]
    扩展 JDK 未提供的原生类型(如int、char)操作, 包括某些类型的无符号形式

8. 区间[Ranges]
    可比较类型的区间API,包括连续和离散类型

9. I/O
    简化I/O尤其是I/O流和文件的操作,针对Java5和6版本

10. 散列[Hash]
    提供比Object.hashCode()更复杂的散列实现,并提供布鲁姆过滤器的实现

11. 事件总线[EventBus]
    发布-订阅模式的组件通信,但组件不需要显式地注册到其他组件中

12. 数学运算[Math]
    优化的、充分测试的数学工具类

13. 反射[Reflection]
    Guava 的 Java 反射机制工具类 




至于Guava这个这里就不多说了,上一篇已经讲得很详细了!这次主要是分享一下Guava对集合的一些升华处理,好啦,不多说,直接上代码:
[java]  view plain copy
  1. package com.joyce.guava.bean;  
  2.   
  3. /** 
  4.  * 学生实体类 
  5.  *  
  6.  * @author Joyce.Luo 
  7.  * @date 2014-6-19 下午02:37:19 
  8.  */  
  9. public class Student {  
  10.     /** 
  11.      * 学号 
  12.      */  
  13.     private Integer stuId;  
  14.     /** 
  15.      * 姓名 
  16.      */  
  17.     private String stuName;  
  18.     /** 
  19.      * 年龄 
  20.      */  
  21.     private Integer stuAge;  
  22.   
  23.     /** 
  24.      * @return the stuId 
  25.      */  
  26.     public Integer getStuId() {  
  27.         return stuId;  
  28.     }  
  29.   
  30.     /** 
  31.      * @param stuId 
  32.      *            the stuId to set 
  33.      */  
  34.     public void setStuId(Integer stuId) {  
  35.         this.stuId = stuId;  
  36.     }  
  37.   
  38.     /** 
  39.      * @return the stuName 
  40.      */  
  41.     public String getStuName() {  
  42.         return stuName;  
  43.     }  
  44.   
  45.     /** 
  46.      * @param stuName 
  47.      *            the stuName to set 
  48.      */  
  49.     public void setStuName(String stuName) {  
  50.         this.stuName = stuName;  
  51.     }  
  52.   
  53.     /** 
  54.      * @return the stuAge 
  55.      */  
  56.     public Integer getStuAge() {  
  57.         return stuAge;  
  58.     }  
  59.   
  60.     /** 
  61.      * @param stuAge 
  62.      *            the stuAge to set 
  63.      */  
  64.     public void setStuAge(Integer stuAge) {  
  65.         this.stuAge = stuAge;  
  66.     }  
  67.   
  68.     /** 
  69.      *  
  70.      */  
  71.     public Student() {  
  72.         super();  
  73.     }  
  74.   
  75.     /** 
  76.      * @param stuId 
  77.      * @param stuName 
  78.      * @param stuAge 
  79.      */  
  80.     public Student(Integer stuId, String stuName, Integer stuAge) {  
  81.         super();  
  82.         this.stuId = stuId;  
  83.         this.stuName = stuName;  
  84.         this.stuAge = stuAge;  
  85.     }  
  86. }  

实体类有了,主要是为了在集合中使用提供方便!关键在于:

[java]  view plain copy
  1. /** 
  2.  * @Description:  
  3.  * 
  4.  * @Title: SetGuava.java 
  5.  * @Package com.joyce.guava.main 
  6.  * @Copyright: Copyright (c) 2014 
  7.  * 
  8.  * @author Comsys-LZP 
  9.  * @date 2014-6-26 上午11:03:53 
  10.  * @version V2.0 
  11.  */  
  12. package com.joyce.guava.main;  
  13.   
  14. import java.util.Collections;  
  15. import java.util.List;  
  16. import java.util.Map;  
  17.   
  18. import com.google.common.collect.ArrayListMultimap;  
  19. import com.google.common.collect.BiMap;  
  20. import com.google.common.collect.ClassToInstanceMap;  
  21. import com.google.common.collect.HashBasedTable;  
  22. import com.google.common.collect.HashBiMap;  
  23. import com.google.common.collect.HashMultiset;  
  24. import com.google.common.collect.Lists;  
  25. import com.google.common.collect.Multimap;  
  26. import com.google.common.collect.Multiset;  
  27. import com.google.common.collect.MutableClassToInstanceMap;  
  28. import com.google.common.collect.Ordering;  
  29. import com.google.common.collect.Table;  
  30. import com.joyce.guava.bean.Student;  
  31.   
  32. /** 
  33.  * @Description: Guava的集合 
  34.  *  
  35.  * @ClassName: SetGuava 
  36.  * @Copyright: Copyright (c) 2014 
  37.  *  
  38.  * @author Comsys-LZP 
  39.  * @date 2014-6-26 上午11:03:53 
  40.  * @version V2.0 
  41.  */  
  42. public class SetGuava {  
  43.     public static void main(String[] args) {  
  44.         /** 
  45.          * Guava API 提供了有用的新的集合类型, 协同已经存在的java集合工作的很好。 分别是 Multimap, Multiset, 
  46.          * Table, BiMap, ClassToInstanceMap 
  47.          */  
  48.         System.out.println("Multimap:一种key可以重复的map,子类有ListMultimap和SetMultimap,对应的通过key分别得到list和set");  
  49.         testMultimap();  
  50.         System.out.println("Multiset:不是集合,可以增加重复的元素,并且可以统计出重复元素的个数");  
  51.         testMulitiset();  
  52.         System.out.println("Table:相当于有两个key的map");  
  53.         testTable();  
  54.         System.out.println("BiMap: 是一个一一映射,可以通过key得到value,也可以通过value得到key");  
  55.         testBitMap();  
  56.         System.out.println("ClassToInstanceMap:map的key并不是只是一种类型");  
  57.         testClassToInstanceMap();  
  58.         System.out.println("排序,是guava一份非常灵活的比较类,可以被用来操作,扩展,当作比较器,排序提供了集合排序的很多控制 ");  
  59.         testOrder();  
  60.     }  
  61.   
  62.     /** 
  63.      * @Description: Multimap:一种key可以重复的map,子类有ListMultimap和SetMultimap,对应的通过key分别得到list和set 
  64.      *  
  65.      *  
  66.      * @Title: SetGuava.java 
  67.      * @Copyright: Copyright (c) 2014 
  68.      *  
  69.      * @author Comsys-LZP 
  70.      * @date 2014-6-26 上午11:19:50 
  71.      * @version V2.0 
  72.      */  
  73.     private static void testMultimap() {  
  74.         Multimap customersByType = ArrayListMultimap.create();  
  75.         customersByType.put("abc"new Student(1"Joyce"20));  
  76.         customersByType.put("abc"new Student(1"Joyce One"20));  
  77.         customersByType.put("abc"new Student(1"Joyce Two"20));  
  78.         customersByType.put("abc"new Student(1"Joyce Three"20));  
  79.         customersByType.put("abcd"new Student(1"Joyce Four"20));  
  80.         customersByType.put("abcde"new Student(1"Joyce Five"20));  
  81.         System.out.println(customersByType.get("abc").size());  
  82.         for (Student stu : customersByType.get("abc")) {  
  83.             System.out.println(stu.getStuName());  
  84.         }  
  85.     }  
  86.   
  87.     /** 
  88.      * @Description: Multiset:不是集合,可以增加重复的元素,并且可以统计出重复元素的个数 
  89.      *  
  90.      *  
  91.      * @Title: SetGuava.java 
  92.      * @Copyright: Copyright (c) 2014 
  93.      *  
  94.      * @author Comsys-LZP 
  95.      * @date 2014-6-26 上午11:19:59 
  96.      * @version V2.0 
  97.      */  
  98.     private static void testMulitiset() {  
  99.         Multiset multiSet = HashMultiset.create();  
  100.         multiSet.add(10);  
  101.         multiSet.add(30);  
  102.         multiSet.add(30);  
  103.         multiSet.add(40);  
  104.         System.out.println(multiSet.count(30)); // 2 -- 统计XX出现的次数  
  105.         System.out.println(multiSet.size()); // 4 -- 元素的个数  
  106.     }  
  107.   
  108.     /** 
  109.      * @Description: Table:相当于有两个key的map 
  110.      *  
  111.      *  
  112.      * @Title: SetGuava.java 
  113.      * @Copyright: Copyright (c) 2014 
  114.      *  
  115.      * @author Comsys-LZP 
  116.      * @date 2014-6-26 上午11:24:43 
  117.      * @version V2.0 
  118.      */  
  119.     private static void testTable() {  
  120.         Table personTable = HashBasedTable.create();  
  121.         personTable.put(120new Student(1"46546"20));  
  122.         personTable.put(030new Student(2"46546"30));  
  123.         personTable.put(025new Student(3"46546"25));  
  124.         personTable.put(150new Student(4"46546"50));  
  125.         personTable.put(027new Student(5"46546"27));  
  126.         personTable.put(129new Student(6"46546"29));  
  127.         personTable.put(038new Student(7"46546"38));  
  128.         personTable.put(166new Student(8"46546"66));  
  129.   
  130.         // 得到行集合  
  131.         Map rowMap = personTable.row(0);  
  132.         Integer rowMax = Collections.max(rowMap.keySet());  
  133.         System.out.println(rowMax);  
  134.     }  
  135.   
  136.     /** 
  137.      * @Description: BiMap: 是一个一一映射,可以通过key得到value,也可以通过value得到key 
  138.      *  
  139.      *  
  140.      * @Title: SetGuava.java 
  141.      * @Copyright: Copyright (c) 2014 
  142.      *  
  143.      * @author Comsys-LZP 
  144.      * @date 2014-6-26 上午11:36:59 
  145.      * @version V2.0 
  146.      */  
  147.     private static void testBitMap() {  
  148.         // 双向map  
  149.         BiMap biMap = HashBiMap.create();  
  150.         biMap.put(1"hello");  
  151.         biMap.put(2"helloa");  
  152.         biMap.put(3"world");  
  153.         biMap.put(4"worldb");  
  154.         biMap.put(5"my");  
  155.         biMap.put(6"myc");  
  156.         // 通过key取value  
  157.         String value = biMap.get(5);  
  158.         System.out.println("key -- [5] ; value -- [" + value + "]");  
  159.         // 通过value取key  
  160.         Integer key = biMap.inverse().get("my");  
  161.         System.out.println("value -- [my] ; key -- [" + key + "]");  
  162.     }  
  163.   
  164.     /** 
  165.      * @Description: ClassToInstanceMap:有的时候,你的map的key并不是一种类型,他们是很多类型,你想通过映射他们得到这种类型, 
  166.      *               guava提供了ClassToInstanceMap满足了这个目的。 
  167.      *  
  168.      *               除了继承自Map接口,ClassToInstaceMap提供了方法 T getInstance(Class) 和 
  169.      *               T putInstance(Class, T),消除了强制类型转换。 
  170.      *  
  171.      *               该类有一个简单类型的参数,通常称为B,代表了map控制的上层绑定,例如: 
  172.      *               ClassToInstanceMap numberDefaults = 
  173.      *               MutableClassToInstanceMap.create(); 
  174.      *               numberDefaults.putInstance(Integer.class, 
  175.      *               Integer.valueOf(0)); 
  176.      *  
  177.      *               从技术上来说,ClassToInstanceMap 实现了Map, 
  178.      *               B>,或者说,这是一个从B的子类到B对象的映射,这可能使得ClassToInstanceMap的泛型轻度混乱, 
  179.      *               但是只要记住B总是Map的上层绑定类型,通常来说B只是一个对象。 guava提供了有用的实现, 
  180.      *               MutableClassToInstanceMap 和 ImmutableClassToInstanceMap. 
  181.      *               重点:像其他的Map,ClassToInstanceMap 
  182.      *               含有的原生类型的项目,一个原生类型和他的相应的包装类可以映射到不同的值; 
  183.      *  
  184.      *  
  185.      *  
  186.      * @Title: SetGuava.java 
  187.      * @Copyright: Copyright (c) 2014 
  188.      *  
  189.      * @author Comsys-LZP 
  190.      * @date 2014-6-26 上午11:42:52 
  191.      * @version V2.0 
  192.      */  
  193.     private static void testClassToInstanceMap() {  
  194.         ClassToInstanceMap classToInstanceMap = MutableClassToInstanceMap.create();  
  195.         Student stu = new Student(1"Joyce"20);  
  196.         classToInstanceMap.putInstance(Student.class, stu);  
  197.         Student stuObj = classToInstanceMap.getInstance(Student.class);  
  198.         System.out.println(stuObj.getStuName());  
  199.     }  
  200.       
  201.     /** 
  202.      * @Description:排序,是guava一份非常灵活的比较类,可以被用来操作,扩展,当作比较器,排序提供了集合排序的很多控制  
  203.      * 
  204.      * 
  205.      * @Title: SetGuava.java 
  206.      * @Copyright: Copyright (c) 2014 
  207.      * 
  208.      * @author Comsys-LZP 
  209.      * @date 2014-6-26 上午11:49:30 
  210.      * @version V2.0 
  211.      */  
  212.     private static void testOrder(){  
  213.         List numberList = Lists.newArrayList(3020608010);  
  214.         System.out.println(Ordering.natural().sortedCopy(numberList)); //10,20,30,60,80  
  215.         System.out.println(Ordering.natural().reverse().sortedCopy(numberList)); //80,60,30,20,10  
  216.         System.out.println(Ordering.natural().min(numberList));//10  
  217.         System.out.println(Ordering.natural().max(numberList));//80  
  218.         numberList =  Lists.newArrayList(30206080null10);  
  219.         System.out.println(Ordering.natural().nullsLast().sortedCopy(numberList));//10, 20,30,60,80,null  
  220.         System.out.println(Ordering.natural().nullsFirst().sortedCopy(numberList));//null,10,20,30,60,80  
  221.     }  
  222. }  
效果如图: Java高级知识总结_第1张图片

相信大家伙对上面的代码如果理解深入了的话,会明白了的!!!其实Guava在集合上面还提供了其他方法,这里


7.递归遍历某个文件夹下所有文件


/*
  * 通过递归得到某一路径下所有的目录及其文件
  */
 static void getFiles(String filePath){
  File root = new File(filePath);
    File[] files = root.listFiles();
    for(File file:files){     
     if(file.isDirectory()){
      /*
       * 递归调用
       */
      getFiles(file.getAbsolutePath());
      filelist.add(file.getAbsolutePath());
      System.out.println("显示"+filePath+"下所有子目录及其文件"+file.getAbsolutePath());
     }else{
      System.out.println("显示"+filePath+"下所有子目录"+file.getAbsolutePath());
     }     
    }
 }



你可能感兴趣的:(Java高级,Java高级学习)