blog.Ring.idv.tw

Java

BOMKiller

底下是一個針對UTF-8編碼的BOMKiller程式~ 如果你開發程式時所採用的文字編輯器會自動為你加上BOM的話~ 那BOMKiller可以協助你更容易刪除這些BOM~

好久沒寫Java了~~ 趁這個機會再回味一下用UltraEdit純手工寫程式~

BOMKiller原始檔

/**
 * Date: 2008-02-18
 * Shen (http://blog.ring.idv.tw)
 **/
import java.io.*;  
import java.nio.channels.*;

public class BOMKiller
{  
	private String suffix = null;
	public BOMKiller(String suffix)
	{
		this.suffix = suffix;
	}
	
	public static void main(String arg[])
	{
		if(arg.length != 2 || (new File(arg[0])).isDirectory() == false)
		{
			System.out.println("Usage:java BOMKiller [directory_path] [suffix_name]");
			System.exit(0);
		}
		BOMKiller killer = new BOMKiller(arg[1]);
              	killer.listFiles(new File(arg[0]));
      	}
      	public void listFiles(File f)
      	{
		File[] filelist = f.listFiles(new FileFilter()
		{
			public boolean accept(File tempf)
			{
				if(tempf.isDirectory())
				{
					listFiles(tempf);
					return false;
				}
				return tempf.getName().endsWith(suffix);
			}
		});
		
          	int flength = filelist.length;
          	for(int i = 0; i < flength ; ++i)
		{  
              		killBOM(filelist[i]);
          	}
	}
	public void killBOM(File f)
	{
		try
		{
			FileInputStream fis = new FileInputStream(f);		
			if(fis.read() == 0xEF)
			{
				if(fis.read() == 0xBB)
				{
					if(fis.read()==0xBF)
					{
						String path = f.getPath();
						System.out.println("BOMKiller:"+path);
						
						File toFile = new File(path+".tmp");
						FileChannel fic = fis.getChannel();
						FileChannel foc = new FileOutputStream(toFile).getChannel();
						fic.transferTo(3, fic.size(),foc);
						fic.close();
						foc.close();
						f.delete();
						toFile.renameTo(new File(path));
					}
				}
			}
		}catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

用法

Usage:java BOMKiller [directory_path] [suffix_name]

e.g.

java BOMKiller C:\htdocs .php

相關文章

IE Bug? UTF-8 Encoding for Byte Order Mark(BOM)

2008-02-18 04:38:44 | Add Comment

Installing JDK6 & JBoss 4.2.2 on Debian 4.0

這裡先記錄下來安裝JDK6 & JBossDebian Linux的過程~ 如果你是用其它的Linux Distribution基本上都可以照著下述步驟安裝~

軟體取得

JDK6 - jdk-6u4-linux-i586.bin

JBoss Application Server Downloads - jboss-4.2.2.GA.zip

安裝JDK6

chmod +x jdk-6u4-linux-i586.bin
./jdk-6u4-linux-i586.bin #輸入yes開始安裝

接著會出現一個「jdk1.6.0_04」的目錄,這裡我將此目錄搬移至「/usr/local/」底下

mv jdk1.6.0_04 /usr/local/

最後設定一些環境變數,將下述設定寫在「/etc/profile」檔案中即可

export JAVA_HOME=/usr/local/jdk1.6.0_04
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.

安裝JBoss 4.2.2 GA

直接將「jboss-4.2.2.GA.zip」解壓縮即可

unzip jboss-4.2.2.GA.zip
mv jboss-4.2.2.GA /usr/local/

直接啟動JBoss

/usr/local/jboss-4.2.2.GA/bin/run.sh

接著開啟Browser來驗證一下~ 輸入「http://localhost:8080/jmx-console/」後~ 看到JBoss的管理畫面即成功。

2008-02-13 15:43:30 | Add Comment

Object Database - db4objects

db4objects - 是一個Open Source Object Database~ 它採用GPL License~ 那什麼是Object Database?和一般我們常見的Rational Database有什麼不同呢?

如果你熟悉Java領域中的ORM(Object-Relational Mapping)~ 那麼你一定聽過Hibernate~

這裡我直接用個簡單的例子來介紹一下~

一般我們要在程式中新增一筆資料到資料表,通常還是會下SQL語法來處理,例如:

insert into comment(name,email,content) values('王大明','[email protected]','你好')

那如果透過Object Database或ORM會是什麼情況呢?大致上是如下述的例子:

Comment comment = new Comment();
comment.setName("王大明");
comment.setEmail("[email protected]");
comment.setContent("你好");
.....

也就是說~ 操作資料庫的CRUD已經不需要再透過SQL語法了~ 直接利用物件導向的程式語言來撰寫即可~ 這樣最大的好處在於不需要再去搞懂SQL語法~

而Hibernate就是處理Rational Database和OOP之間的Middleware~

也就是說~ 如果採用db4o其實就不需要Hibernate了~ 不過這要看Object Database是否成熟才能斷定論~

有機會再來玩玩吧~ ^^

相關資源

joeyta備忘記: db4o(Object Database)備忘記

Enterprise Java Community: Inside db4o

Android与db4o的完美结合-Password Manager

Object-oriented database articles and products

Object-Oriented Databases - Integrating Programming and Databases

學術資源

底下是透過Google Scholar隨便找看到的~ 有空的話再來看看~

Teaching Java: using an object-oriented database and the BlueJ IDE

The object behavior of Java object-oriented database management systems

Embedding the db4o object-oriented database

2008-01-29 02:19:15 | Comments (3)

用遊戲控制器來玩互動~JInput

看到它~ 就想到以前都用它來玩N64模擬器的瑪莉歐賽車~

不過Flash可沒內建支援和遊戲控制器來互動的功能!~ 那如果要在Flash上用遊戲控制器來操作的話該如何?

最簡單的方式就是找個USB的手把然後接上USB轉PS2的轉接頭,直接將手把當滑鼠來用也是一種方式~

不然的話就從軟體來下手吧~ 寫一個ServerSocket + JInput 當作Adapter,然後在Flash中用Socket來連線並將回傳的KeyCode對應至特定的事件,如此又能簡單的達到跨平台的應用~ 目前只是一個構想~ 所以先行給它寫下來...

JInput - 相關資源

JInput

JInput Tutorials

Building a Game Pad Controller with JInput

Java 和遊戲控制器 (一)

2008-01-11 22:14:19 | Add Comment

用Java來和C做溝通的介面 - JNI

大約四、五年前吧~ 我記得當時為了將以前用VB寫的定時關機程式要移植到Java版時~ 遇到了一個需要呼叫Windows API的問題~ 這時候透過JNI(Java Native Interface)就不失為一種解決方式~ 當然這樣的方式也就等同於向跨平臺的優勢說bye bye嚕~ 底下是以前所記錄的一些流程步驟(以HelloWorld為範例):

寫一個 HelloWorld.java

class HelloWorld
{
    public native void helloworld();

    static {
        System.loadLibrary("jni");
    }

    public static void main(String[] args)
    {
        new HelloWorld().helloworld();
    }
}

編譯 HelloWorld.java

javac HelloWorld.java

產生 header file

javah -jni HelloWorld
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    helloworld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_helloworld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

寫一個 jni.c

#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL
Java_HelloWorld_helloworld(JNIEnv *env, jobject obj)
{
    printf("Hello world!\n");
    return;
}

編譯成DLL for Windows

gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -I "C:\Program Files\Java\jdk1.6.0\include" -I "C:\Program Files\Java\jdk1.6.0\include\win32" -shared -o jni.dll jni.c

編譯成SO for Linux

gcc -fPIC -Wall -I/usr/lib/jvm/java-6-sun/include/ -I/usr/lib/jvm/java-6-sun/include/linux -shared -o libjni.so jni.c

呼叫HelloWorld

java HelloWorld

成功!^^

Hello world!

2007-12-24 20:42:12 | Comments (3)

Next Posts~:::~Previous Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment