星期四, 五月 24, 2007

java 读 properties格式文件


package hddqcs.datamining.venus.venusfile;

import hddqcs.datamining.venus.common.DMLogger;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.log4j.Logger;

/**
 *
 * COPYRIGHT(C) Hitachi Global Storage Technologies, Inc.
 * All Rights Reserved.
 *
 * This Class is to reading the process config file
 *
 *  eg. etl_venusProcess.properties
 *
 * @author liuqact
 */
public class ReadingProcessProsFile {
 Logger logger = Logger.getLogger(ReadingProcessProsFile.class.getName());
 public Properties getProperties(String dir,String fileName)throws FileNotFoundException,IOException,Exception {
  // TODO Auto-generated method stub
  try{
   Properties pros = new Properties();
   InputStream prosFile = new FileInputStream("Log4j.properties");
   pros.load(prosFile);
  return pros;
  }catch(FileNotFoundException e){
   logger.error("Properties file inputted is not exist");
   throw e;
  }catch(IOException e){
   logger.error("Reading Properties file inputted failed");
   throw e;
  }catch(Exception e){
   logger.error("get values from Properties file inputted failed");
   throw e;
  }
 }
}

关于serialVersionUID


在定义一个实现接口java.io.Serializable 的类时
如果用EC IDE 会有缺少 UID的警告
 
加一个吧,可以减少程序运行时的资源消耗
 
在EC中,假如类出现这样的警告,那么你可以把鼠标放到类名上,然后
CTRL+1
看看出现在什么
中间有一个是生成serialVersionUID的
 

星期三, 五月 23, 2007

Java操作Excel的一些可以参考的资源

http://sourceforge.net/projects/jexcelapi
JExcelApi is a java library which provides the ability to read, write, and modify
Microsoft Excel spreadsheets. This project mirrors the files on http://www.jexcelapi.org,
which has been known to go down on occasion.

 http://sourceforge.net/projects/excelutils
ExcelUtils, easy export report in excel by excelutils.It like velocity or freemarker, but
it's script is written in excel to control excel format and data.

http://sourceforge.net/projects/exceltemplate
Templating system for Microsoft Excel files in Java.
 
http://sourceforge.net/projects/jaoff
JavaOffice is a pure Java library to read and write MS Word files in the new WordML (format) and
MS Excel files in the new SpreadsheetML format. WordML and SpreadsheetML are xml formats for word
and excel files supported from Office 2003 and above.
 
Simple library written in Java to allow the creation of Excel files based on a Java Collection.
Each element of the collection goes in a row and the columns are based on the properties you define
through an XML config file.
 
http://sourceforge.net/projects/caxton
Caxton is a general purpose package written in Java that is used to render HTML, PDF (using FOP),
 RTF (using JFOR), and Excel (using POI) using stylesheets. There are some additional tools for
 providing easy access to XML, merging XSL stylesheets

Eclipse插件-- Bytecode Outline,Implementors, FindBugs 等

1. Eclipse插件之Bytecode Outline

本文介绍如何利用Eclipse插件Bytecode Outline在Eclipse中的操作使用。

  Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。

  Bytecode Outline 插件可以把当前的正在编辑Java的文件或者class文件直接显示出其相应的字节码出来,而且可以进行两个Java文件的字节码比较或者两个class文件的字节码比较或一个Java文件与一个class文件进行字节码的比较。
 

原文出处: http://dev2dev.bea.com.cn/bbsdoc/20060123182.html

2 Eclipse插件之Implementors

本文介绍如何利用Eclipse插件Implementors在Eclipse中的使用。

  Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。

问题提出:
  如果你想看看某个类或者方法的实现,一般是Ctrl + 鼠标左键,单击即可以打开这个类或者方法的具体实现代码。但是如果碰到接口时,只是到达接口而已,不能到达具体的实现类里。

解决方法:利用Eclipse的Implementors插件。
  当追踪方法代码时,Eclipse默认是转到方法的接口类,而接口中是只有方法名称没有具体的实现代码,此插件提供了追踪到具体实现类的实现代码的功能。

  另外还有Call Hierarchy插件: 显示一个方法的调用层次,可以从中看到它被哪些方法调用了,以及它调用了哪些方法,是代码追踪比较实用的工具。Eclipse 3.1中已经自带有这个功能了。这个插件就不用另加介绍了。

详细信息参考: http://dev2dev.bea.com.cn/bbsdoc/20060124188.html 

3 利用Eclipse开发Hibernate应用程序 --Hibernate Synchronizer插件

介绍如何利用Hibernate Synchronizer插件在Eclipse 3.0.1中快速的开发Hibernate应用程序,提高我们的工作效率。
本文介绍如何利用Eclipse插件EasyExplorer在Eclipse中的使用。

  Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境,Hibernate也是目前很流行的O/R Mapping框架,至少在EJB 3.0大行其道之前,它是我们在考虑O/R Mapping时非常好的选择。

  关于Hibernate框架的细节,请参考《Hibernate in Action》一书。

详细内容点击这里: http://dev2dev.bea.com.cn/bbsdoc/20060124187.html

4 Eclipse插件之EasyExplorer

  Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。

问题提出:
  如果你经常需要在Eclipse里打开相关资源文件所在的文件夹,比较麻烦,要右键,属性,在Location一栏中把所在的文件夹拷贝一下,然后再去资源管理器里输入这个路径,回车,打开它。

解决方法:
  用EasyExplorer插件,有了这个插件就可以很方便地打开资源文件所在的文件夹了。
 

详细内容点击这里 ; http://dev2dev.bea.com.cn/bbsdoc/20060124184.html 

5 Eclipse插件之SQLExplorer

本文介绍如何利用Eclipse插件SQLExplorer在Eclipse中连接各种数据库进行操作使用。

  Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。
 

详细内容点击这里 http://dev2dev.bea.com.cn/bbsdoc/20060126189.html 

6 Eclipse插件之FindBugs

本文介绍如何利用Eclipse插件FindBugs在Eclipse中的使用。

  Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。

问题提出:
  当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被发现后,然后再来进行相应的修改,那么后期修改的代价就相当高了。

解决方法:
  现在有很多Java代码分析工具,FindBugs中开源项目当中的一个,它可以帮你找到代码中隐藏的一些错误,提升你的代码能力与系统安全可靠性。
 
FindBugs:0.9.4 从http://findbugs.sourceforge.net/
官方的文档 http://findbugs.sourceforge.net/manual/
Eclipse plugin for FindBugs version 0.0.17
http://findbugs.sourceforge.net/downloads.html 下载

详细内容点击这里: http://dev2dev.bea.com.cn/bbsdoc/20060124186.html

星期二, 五月 22, 2007

JDK1.5中的线程池使用简介(转)


在多线程大师Doug Lea的贡献下,在JDK1.5中加入了许多对并发特性的支持,例如:线程池。这里介绍的就是1.5种的线程池的简单使用方法。
创建日期:2005-05-11
最后修改日期:2007-03-06
panhaidong@gmail.com

一、简介
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
  • corePoolSize
    线程池维护线程的最少数量
  • maximumPoolSiz
    线程池维护线程的最大数量
  • keepAliveTime
    线程池维护线程所允许的空闲时间
  • unit
    线程池维护线程所允许的空闲时间的单位
  • workQueue
    线程池所使用的缓冲队列
  • handler
    线程池对拒绝任务的处理策略

一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。

当一个任务通过execute(Runnable)方法欲添加到线程池时:

  • 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
  • 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
也就是:处理任务的优先级为:
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。

workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue

handler有四个选择:
  • ThreadPoolExecutor.AbortPolicy()
    抛出java.util.concurrent.RejectedExecutionException异常
  • ThreadPoolExecutor.CallerRunsPolicy()
    重试添加当前的任务,他会自动重复调用execute()方法
  • ThreadPoolExecutor.DiscardOldestPolicy()
    抛弃旧的任务
  • ThreadPoolExecutor.DiscardPolicy()
    抛弃当前的任务

二、一般用法举例 [下载源代码]

package cn.simplelife.exercise;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TestThreadPool {
private static int produceTaskSleepTime = 2;
public static void main(String[] args) {
//构造一个线程池
ThreadPoolExecutor producerPool = new ThreadPoolExecutor(2, 4, 0,
TimeUnit.SECONDS , new ArrayBlockingQueue(3),
new ThreadPoolExecutor.DiscardOldestPolicy());

//每隔produceTaskSleepTime的时间向线程池派送一个任务。
int i=1;
while(true){
try {
Thread.sleep(produceTaskSleepTime);

String task = "task@ " + i;
System.out.println("put " + task);

producerPool.execute(new ThreadPoolTask(task));

i++;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

package cn.simplelife.exercise;

import java.io.Serializable;

/**
* 线程池执行的任务
* @author hdpan
*/
public class ThreadPoolTask implements Runnable,Serializable{

//JDK1.5中,每个实现Serializable接口的类都推荐声明这样的一个ID
private static final long serialVersionUID = 0;

private static int consumeTaskSleepTime = 2000;
private Object threadPoolTaskData;

ThreadPoolTask(Object tasks){
this.threadPoolTaskData = tasks;
}

//每个任务的执行过程,现在是什么都没做,除了print和sleep,:)
public void run(){
System.out.println("start .."+threadPoolTaskData);
try {
//便于观察现象,等待一段时间
Thread.sleep(consumeTaskSleepTime);
} catch (Exception e) {
e.printStackTrace();
}
threadPoolTaskData = null;
}
}


对这两段程序的说明:

  1. 在这段程序中,一个任务就是一个Runnable类型的对象,也就是一个ThreadPoolTask类型的对象。
  2. 一般来说任务除了处理方式外,还需要处理的数据,处理的数据通过构造方法传给任务。
  3. 在这段程序中,main()方法相当于一个残忍的领导,他派发出许多任务,丢给一个叫 threadPool的任劳任怨的小组来做。
    • 这个小组里面队员至少有两个,如果他们两个忙不过来, 任务就被放到任务列表里面。
    • 如果积压的任务过多,多到任务列表都装不下(超过3个)的时候,就雇佣新的队员来帮忙。但是基于成本的考虑,不能雇佣太多的队员, 至多只能雇佣 4个。
    • 如果四个队员都在忙时,再有新的任务, 这个小组就处理不了了,任务就会被通过一种策略来处理,我们的处理方式是不停的派发, 直到接受这个任务为止(更残忍!呵呵)。
    • 因为队员工作是需要成本的,如果工作很闲,闲到 3SECONDS都没有新的任务了,那么有的队员就会被解雇了,但是,为了小组的正常运转,即使工作再闲,小组的队员也不能少于两个。
    • 通过调整 produceTaskSleepTime和 consumeTaskSleepTime的大小来实现对派发任务和处理任务的速度的控制, 改变这两个值就可以观察不同速率下程序的工作情况。
    • 通过调整4中所指的数据,再加上调整任务丢弃策略, 换上其他三种策略,就可以看出不同策略下的不同处理方式。
    • 对于其他的使用方法,参看jdk的帮助,很容易理解和使用。
    这是另外一个例子
    public class NamePrinter implements Runnable {
    private final String name;
    private final int delay;
    public NamePrinter(String name, int delay) {
    this.name = name;
    this.delay = delay;
    }
    public void run() {
    System.out.println("Starting: " + name);
    try {
    Thread.sleep(delay);
    } catch (InterruptedException ignored) { }
    System.out.println("Done with: " + name);
    }
    }
    import java.util.concurrent.*;
    import java.util.Random;
    public class UsePool {
    public static void main(String args[]) {
    Random random = new Random();
    ExecutorService executor =
    Executors.newFixedThreadPool(3); //设定线程池容量为3
    // Sum up wait times to know when to shutdown
    int waitTime = 500;
    for (int i=0; i<10;>
    String name = "NamePrinter " + i;
    int time = random.nextInt(1000);
    waitTime += time;
    Runnable runner = new NamePrinter(name, time);
    System.out.println("Adding: " + name + " / " + time);
    executor.execute(runner);
    }
    try {
    Thread.sleep(waitTime);
    executor.shutdown();
    executor.awaitTermination
    (waitTime, TimeUnit.MILLISECONDS);
    } catch (InterruptedException ignored) {
    }
    System.exit(0);
    }
    }

    附:jdk1.5中关于ThreadPoolExecutor的javadoc地址