17 2010

用Java创建ZIP压缩文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
 * 压缩文件夹
 * @param sourceDIR 文件夹名称(包含路径)
 * @param targetZipFile 生成zip文件名
 * @author liuxiangwei
 */
public static void zipDIR(String sourceDIR, String targetZipFile) {
	try {
		FileOutputStream target = new FileOutputStream(targetZipFile);
		ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(target));
		int BUFFER_SIZE = 1024;
		byte buff[] = new byte[BUFFER_SIZE];
		File dir = new File(sourceDIR);
		if (!dir.isDirectory()) {
			throw new IllegalArgumentException(sourceDIR+" is not a directory!");
		}
		File files[] = dir.listFiles();
 
		for (int i = 0; i < files.length; i++) {
			FileInputStream fi = new FileInputStream(files[i]);
			BufferedInputStream origin = new BufferedInputStream(fi);
			ZipEntry entry = new ZipEntry(files[i].getName());
			out.putNextEntry(entry);
			int count;
			while ((count = origin.read(buff)) != -1) {
				out.write(buff, 0, count);
			}
			origin.close();
		}
		out.close();
 
	} catch (IOException e) {
		throw new MsgException("");
	}
}

注意:建议使用org.apache.tools.zip.*包下相关类,否则可能会出现中文乱码问题。

参考:java 实现zip与unzip


5 2010

利用序列化实现Java对象深度clone

对于简单的对象,只要实现Cloneable接口,并且重写Object类的clone()方法即可。对于复杂的对象,必需将其中的复杂成员变量也进行clone,实现起来太繁琐。这里有一种简便方法,先将对象序列化到内存,然后再其反序列化。主要代码如下所示:

1
2
3
4
5
6
	ByteArrayOutputStream  byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        out.writeObject(obj);
        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
        ObjectInputStream in =new ObjectInputStream(byteIn);
        Object newObj=in.readObject();

参照:java clone方法使用详解


2 2010

Google Reader订阅排行榜-关于Java

在google reader中,读者可以搜索自己喜欢的供稿,遗憾的是搜索出来的题目并没有按照rss的订阅数量进行排序。这几天写了个小程序,抓取某个关键词下的所有rss,然后按照订阅数量从大到小排序输出。

下面是关于java的前50名rss:

Java | Define Java at Dictionary.com 3637754

Make: Online : Run Java apps on Android 335208

Java – Search Slashdot 328170

HowStuffWorks “How Java Works” 158790

AppleInsider | Apple’s iPhone 4 SDK license bans ported Flash … 129276

The Perils of JavaSchools – Joel on Software 96237

Java: A Retrospective 84413

Official Google Blog: New features and an early look at Java for … 83452

Gmail Mobile, Java Application 68802

Ajaxian » Java in JavaScript 55355

Close the Java security hole in many browsers | Security | Editors … 52197

Java Destruction – The Daily WTF 47230

Woopra: Free Java-based Site Analytics Application Launches At … 35155

Gosling gusher sinks Oracle’s Java cred • The Register 28771

Java Portable | PortableApps.com – Portable software for USB drives 24367

Google: Java is running “rudderless” « Boy Genius Report 23765

ongoing by Tim Bray · Dynamic Java 22443

Java Design Patterns 22421

Java Article Contest – CodeProject 21792

NASA – Science@NASA J-Track 3D 18907

Google App Engine With Java 17810

Stevey’s Blog Rants: Blogger’s Block #4: Ruby and Java and Stuff 15555

How To Remove Old Versions Of Java Runtime from Your PC 14681

Powell’s Books – Component Development for the Java Platform … 14227

John Resig – Running Java in JavaScript 13330

Introduction to Scala for Java Developers 13234

yui4java: A New Java-to-JavaScript Translator Using YUI 2 » Yahoo … 13026

JAVA Developer’s Journal 12523

The Java Posse 9445

Java(TM) Boutique: The Java Source 7822

Jonathan Schwartz’s Blog: The Rise of JAVA – The Retirement of SUNW 7632

Free Online Games at FreeArcade.com – 3 New Games Added Daily 7538

IBM developerWorks : Java Technology : Technical library view 7519

Java travel guide – Wikitravel 7311

Download Java Runtime Environment 1.6.0.20 (32-bit) – FileHippo.com 7154

The Java Regex API Explained 6961

Slashdot IT Story | Sun Pushes Emergency Java Patch 6906

Good-Tutorials – Java Tutorials 6619

How To Remove The Java Deployment Toolkit From Firefox 6587

JavaScript Source: Free JavaScripts, Tutorials, Example Code … 6508

Ubuntu Linux Install Sun Java Development Kit ( JDK ) and Java … 6460

Oracle Java SE and Java for Business Critical Patch Update Advisory 5561

Speed Test – dslreports.com 5084

Download Sun Java JRE 6 Update 20 – This runtime environment … 4674

C2Call – New browser-based Java VoIP app 4598

‘Java Man’ Takes Age To Extremes – Science News 4537

Google App Engine Blog: Seriously this time, the new language on … 4441

The Artima Developer Community 4366

Paul Buchheit: Java running faster than C 4179

Installing Sun’s Java environment on Debian systems 4064


25 2010

HashSet中是如何判断元素是否重复的

今天工作中遇到一个问题,虽然在Employee中重写了equals方法,但是往HashSet中存放Employee对象的时候还是出现了重复值。

于是查看了JDK源码,发现HashSet竟然是借助HashMap来实现的,利用HashMap中Key的唯一性,来保证HashSet中不出现重复值。具体参见代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    private transient HashMap<E,Object> map;
 
    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
 
    public HashSet() {
	map = new HashMap<E,Object>();
    }
 
    public boolean contains(Object o) {
	return map.containsKey(o);
    }
 
    public boolean add(E e) {
	return map.put(e, PRESENT)==null;
    }
}

由此可见,HashSet中的元素实际上是作为HashMap中的Key存放在HashMap中的。下面是HashMap类中的put方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

从这段代码中可以看出,HashMap中的Key是根据对象的hashCode() 和 euqals()来判断是否唯一的。

结论:为了保证HashSet中的对象不会出现重复值,在被存放元素的类中必须要重写hashCode()和equals()这两个方法。


6 2010

Java集合排序方法

前一段时间写过的一个集合排序的方法,可以按照集合中存放Bean的任意属性进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
 * 按照指定属性,对List集合进行排序。
 * 
 * @param list bean集合
 * @param sortBy 要进行排序的bean中的属性
 * @param sort 升序或降序
 */
public static <T> void sort(List<T> list, final String sortBy,final String sort)  {
	if (list == null || sortBy == null ||sortBy.equals("")|| list.isEmpty())
		return;
	Collections.sort(list, new Comparator<T>() {
		@SuppressWarnings("unchecked")
		public int compare(T t1, T t2) {
			Object o1 = null;
			Object o2 = null;
			try {
				o1 = ReflexUtil.getObjFieldValue(t1, sortBy);
				o2 = ReflexUtil.getObjFieldValue(t2, sortBy);
			} catch (Exception e) {
				e.printStackTrace();
			}
			int result = 0;
			if(o1==null){
				result=-1;
			}
			else if(o2==null){
				result=1;
			}
			//字符串按照拼音排序
			else if (o1 instanceof String) {
				result = Collator.getInstance(Locale.CHINA).compare(o1, o2);
			} else {
				result = ((Comparable) o1).compareTo(o2);
			}
 
			if(DESC.equalsIgnoreCase(sort)){
				result=0-result;
			}
			return result;
 
		}
	});
 
}

注:ReflexUtil.getObjFieldValue(t1, sortBy) 用反射技术获取对象t1中sortBy属性的值。


3 2009

Java持久层框架

Java持久层框架:http://www.ibm.com/developerworks/cn/opensource/os-icu4c/os-lightweight6/


13 2009

Java Properties中文乱码问题解决

用Properties读取Java属性文件的时候,会出现中文乱码的情况,这时就需要用JDK Bin目录下小工具native2ascii.exe了,native2ascii 转换实用程序允许进行源码编码,生成以 ISO 8859-1 编码的输出。在命令提示符下执行:

native2ascii -encoding gb2312 source.properties object.properties

另外也可以用UltralEdit另存为Unicode-ASCII Escaped格式进行转换。

为什么要进行转换呢?

Properties的输入/输出流采用的 ISO 8859-1 字符编码的格式,所以就用到了Unicode转义,来处理此编码中无法直接表示的字符。


9 2009

Google App Engine支持Java了!

Google App Engine开始支持Java了,一个振奋人心的消息,以后可以将自己写得Java Web程序放到GAE上了。

如何在Google App Engine上开发、部署Java程序:http://code.google.com/appengine/docs/java/gettingstarted/

刚刚下载完Google Plugin for Eclipse ,对于开发部署过程还需要仔细研究一下。


23 2009

Java多线程学习指南

Java多线程学习指南:http://www.blogjava.net/nokiaguy/archive/2009/03/07/258358.html

Java多线程学习的好文章


18 2009

[转]Java面试题目1.0版本

1、作用域public,private,protected,以及不写时的区别?
答:区别如下:
作用域  当前类 同一packag 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly

2、char型变量中能不能存贮一个中文汉字?为什么?
答:是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文字符是没问题的。

3、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
答:匿名的内部类是没有名字的内部类,不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。

4、Static Nested Class 和Inner Class的不同?
答:Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象。

5、&和&&的区别?
答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。

6、Collection 和Collections的区别?
答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List。
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

Continue reading