2014年11月24日 星期一
class.getResource 取得 class 目錄相對的資源
標籤:
java
利用 XXClass.class.getResource("fileName"); 可以取得 相對XXClass 目錄的檔案
這點在設計 config 檔 來控制程式方面還蠻實用的
大致有兩種路徑
absolute 絕對路徑
ex. XXClass.class.getResource("/fileName.txt");
relative 相對路徑
ex .XXClass.class.getResource("fileName.txt");
ex. XXClass.class.getResource("myConfig/fileName.txt");
參考:
http://www.java2s.com/Code/JavaAPI/java.lang/ClassgetResourceStringnamerelativetotheclasslocation.htm
2014年10月15日 星期三
心得 java.net.MalformedURLException: unknown protocol: rsrc 解決方式
標籤:
java
出現狀況: 是在client 端測試 JMS 訂閱時發生,
原因:是 使用 eclipse 編譯出可執行 jar ,
解決方式: 直接使用 java compiler 編譯執行就可以~
參考: RMI - unknown protocol: rsrc
原因:是 使用 eclipse 編譯出可執行 jar ,
解決方式: 直接使用 java compiler 編譯執行就可以~
參考: RMI - unknown protocol: rsrc
2014年5月17日 星期六
2013年7月18日 星期四
心得- Memcached 儲存 1M 空間限制
- memached 限制每筆資料設定在 1M 大小, 但 1.4.2版之後 多了一個參數可以設定 到 1k 到 128M [1]
如
memcached -I 10m
- 在 window 安裝方面 可以參考下載 [2] 所提供包好的 windows exe ,
不過要使用 Memcached 1.4.5 這個版本, 以我的經驗使用 1.4.4 版的 超過 1M 的資料儲存 服務就會終止
- 但是 1.4.5 版 有一個問題就是不能 用 sc create 的方式建立服務,
不過還好有找到 工具 ServiceEx 可以解決這個問題
- 此外 API 也要做設定
這裡我採用 xmemcached [3] , 在程式裡加上敘述
xmemcached MemcachedClient client=new XMemcachedClient("127.0.0.1",11211);
client.setTranscoder(new SerializingTranscoder(10*1024*1024)); // 10M 看大小多少這裡就要設多少
參考:
[1] https://code.google.com/p/memcached/wiki/ReleaseNotes142
[2] http://blog.elijaa.org/index.php?post/2010/10/15/Memcached-for-Windows&similar
[3] https://code.google.com/p/xmemcached/
2013年7月10日 星期三
筆記 jsp 多國語言 使用 ResourceBundle
出現錯誤 : org.apache.jasper.JasperException: Can't find bundle for base name XXX , locale XX_XX
解決方式
吧資源檔 xxx.properties 放到
WEB-INF/classes 下
參考 : 在 JSP 中使用 ResourceBundle , JAVA world 文章
2013年4月26日 星期五
心得- Memcached in java
簡介
摘要官方網站的介紹
特色有
- 免費
- open source
- 高效率
- 分散式
- 使用記憶體儲存
- 以 key value 物件的方式存取資料
- 安全性較低,所以建議放在防火牆後面的機器
Server 安裝
原始Lib 並不支援windows 系統, 若是使用linux 等系統的話去官方網站下載就可以
要額外安裝 memcached for win
我是參考 [2] 的步驟
- 將jar 解壓縮到資料夾如D:\Appserv\memcached
- 配置服務
- D:\Appserv\memcached>sc create memcached binPath= "D:\Appserv\memcached\memcached.exe -p 9999 -l 127.0.0.1 -m 128 -d runservice" DisplayName= "memcached server" start= auto depend= TCPIP
- 其中 -p 9999 是指透過 port 9999 監聽請求 (預設為 11211 ) , -l 127.0.0.1 是指伺服器指定的 IP 位址 (預設為 INDRR_ANY) , -m 128 是指 memcached 最大可用的記憶體為 128 MB (預設 64 MB) ,最後 -d runservice 就是啟動為 Windows 服務。
- 再去工作管理員開啟服務
重要議題
參考[3] ,摘要幾個重點
撰寫使用 memcached 程式的基本模式就是,先查看有沒有 key-value,有就把快取資料讀出來,沒有就運算結果後存到 memcached sever。這部份算是簡單的。真正困難的事情有兩件:
- 一是清除過期的快取資料(expire)
- 二是Key的命名
兩種方式清除快取資料:
一是在新增/刪除資料時,順便刪掉這個快取 key-value,這樣下次 request 來時便會重新 快取。
二是在有更新的時候直接重設快取資料(Reset)。要注意的是如果您有不同的程式會直接更新資料庫(也就是不只是透過主應用程式,還有別的背景程式),就會有可能 memcachd 裡面的資料沒有被更新到,
解法有
1. 清空所有資料
2. 有一隻程式可以重建 memcached 裡面的資料
3. 統一用一套知道 memcached 機制的介面操作
Key的命名
為了 Security 避免被人猜到 Key 和避免超過 255 bytes 的 key 長度限制,建議你將 Key hash 過
Client API
我是使用 JAVA 的API Memcached-Java-Client
摘錄 MemcachedBench.java 的說明 並加上註釋
/**
* Copyright (c) 2008 Greg Whalin
* All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the BSD license
*
* This library is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE.
*
* You should have received a copy of the BSD License along with this
* library.
*
* @author Greg Whalin
*/
package com.meetup.memcached.test;
import cht.batchevent.show.EventList;
import com.meetup.memcached.*;
import java.util.*;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
/*
*
*
*
*/
public class MemcachedBench2 {
// logger
private static Logger log =
Logger.getLogger( MemcachedBench2.class.getName() );
public static void main(String[] args) {
BasicConfigurator.configure();
org.apache.log4j.Logger.getRootLogger().setLevel( Level.OFF );
int runs = Integer.parseInt(args[0]);
int start = Integer.parseInt(args[1]);
//伺服器位址清單
String[] serverlist = { "127.0.0.1:9999" };
// initialize the pool for memcache servers
SockIOPool pool = SockIOPool.getInstance( "test" );
pool.setServers(serverlist);
pool.setInitConn( 100 );
pool.setMinConn( 100 );
pool.setMaxConn( 500 );
pool.setMaintSleep( 20 );
pool.setNagle( false );
pool.initialize();
// get client instance
MemcachedClient mc = new MemcachedClient( "test" ); // 要和pool 的名稱一樣
mc.setCompressEnable( false );
String keyBase = "testKey";
//String object = "This is a test of an object blah blah es, serialization does not seem to slow things down so much. The gzip compression is horrible horrible performance, so we only use it for very large objects. I have not done any heavy benchmarking recently";
long begin = System.currentTimeMillis();
long end = System.currentTimeMillis();
long time = end - begin;
begin = System.currentTimeMillis();
for (int i = start; i < start+runs; i++) {
String str = (String) mc.get(keyBase + i);
// 沒有資料時和資料庫要資料, 取得後放入 memcatch
if(str == null){
System.out.println(i+" is null ");
OBJ_obj = new OBJ();
StringBuffer _theobj = new StringBuffer();
_theobj = _obj.getDataFromDB();
String object =_theobj .toString();
mc.set(keyBase + i, object);
}
System.out.println(i+" : " + str);
}
end = System.currentTimeMillis();
time = end - begin;
System.out.println(runs + " gets: " + time + "ms");
// 取得多筆
String[] keys = new String[ runs ];
int j = 0;
for (int i = start; i < start+runs; i++) {
keys[ j ] = keyBase + i;
j++;
}
begin = System.currentTimeMillis();
Map vals = mc.getMulti( keys );
end = System.currentTimeMillis();
time = end - begin;
System.out.println(runs + " getMulti: " + time + "ms");
/*
* //刪除的語法
* begin = System.currentTimeMillis();
for (int i = start; i < start+runs; i++) {
mc.delete( keyBase + i );
}
end = System.currentTimeMillis();
time = end - begin;
System.out.println(runs + " deletes: " + time + "ms");*/
SockIOPool.getInstance( "test" ).shutDown();
}
}
參考:
[1] 官方網站
2013年3月5日 星期二
Hibernate心得2 in eclipse 資源檔位置
一不小心 就配置錯誤 導致 org.apache.jasper.JasperException: /hibernate.cfg.xml not found
在此紀錄一下位置
------解决方法--------------------------------------------------------
没有hibernate.cfg.xml 写一个丢到classes下去
------解决方法--------------------------------------------------------
你用的hibernate.cfg.xml还是hibernate.properties
------解决方法--------------------------------------------------------
没有hibernate.cfg.xml
=====================================
以下是我在 eclipse 放的成功 位置
實際部屬在Tomcat的路徑

參考來源 : http://www.myexception.cn/java%20exception/264.html
在此紀錄一下位置
------解决方法--------------------------------------------------------
没有hibernate.cfg.xml 写一个丢到classes下去
------解决方法--------------------------------------------------------
你用的hibernate.cfg.xml还是hibernate.properties
------解决方法--------------------------------------------------------
没有hibernate.cfg.xml
=====================================
以下是我在 eclipse 放的成功 位置
實際部屬在Tomcat的路徑

參考來源 : http://www.myexception.cn/java%20exception/264.html
2013年3月1日 星期五
Hibernate心得
前幾天上了一下 Hibernate 的課程,在此作一個摘要,
Hibernate 網站 (http://www.hibernate.org/)
- 簡單的說 Hibernate 有一個好處可以當個接口,讓資料庫找到的資料直接轉成定義好得物件。
- 而資料庫的連結定義,試用組態的XML來定義的,要抽換更改比較有彈性
- 除了可以使用HQL的方式查詢,也可以利用 criteria 查詢, criteria 簡單的說定一種查詢的function 而不需使用SQL 類似的查詢語句
Hibernate 網站 (http://www.hibernate.org/)
2012年11月14日 星期三
轉貼 java ssh jar
標籤:
java
當使用者要透過遠端SSH連接遠端機器時,若使用JAVA 的話 ,可以透過 JSch.jar 提供的API 來達成目的。
實際參考的範例,可以參考[2], 或查詢 "java sftp example jsch"
參考 :
[1] JSch, http://www.jcraft.com/jsch/
[2] Java 實現SFTP實例,http://www.xfok.net/2009/10/124485.html
2012年8月16日 星期四
心得 java 建立檔案
標籤:
java
舉例來說要建立一個檔案 "C:/a/b/test.txt"
java 的指令如下:
但有可能 資料夾 "C:/a/b/" 不存在, 所以就要先確認資料夾是否存在,不存在的話要建立資料夾,就改寫為
參考: How to create a file in a directory in java? , stackoverflow.com
java 的指令如下:
File f = new File("C:/a/b/test.txt");
f.createNewFile();
但有可能 資料夾 "C:/a/b/" 不存在, 所以就要先確認資料夾是否存在,不存在的話要建立資料夾,就改寫為
File f = new File("C:\\a\\b\\test.txt");
f.getParentFile().mkdirs(); // 要退到上一層在建立資料夾
f.createNewFile();
參考: How to create a file in a directory in java? , stackoverflow.com
2012年7月13日 星期五
摘要: Java 取得 執行cmd 程式 後的文字,以 dir 為例
標籤:
java
以下紀錄一下 :
利用 java Application 執行 cmd 的語法
這個範例是呼叫 dir C:\\windows, 也就是列出 c:\\windows 下的所有檔案
我稍微修正一下列印每行的回傳值,參考來源是列印每個字元
參考:Execute DOS Commands from a Java Program
利用 java Application 執行 cmd 的語法
這個範例是呼叫 dir C:\\windows, 也就是列出 c:\\windows 下的所有檔案
我稍微修正一下列印每行的回傳值,參考來源是列印每個字元
import java.io.IOException;
import java.io.InputStream;
public class ExecuteDOSCommand {
public static void main(String[] args) {
final String dosCommand = "cmd /c dir /s";
final String location = "C:\\WINDOWS";
try {
final Process process = Runtime.getRuntime().exec(
dosCommand + " " + location);
final InputStream in = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
//Read File Line By Line
while ((strLine = br.readLine()) != null){
System.out.print(strLine);
}
} catch (IOException e) {
e.printStackTrace();
}
} // end main
} // end class
參考:Execute DOS Commands from a Java Program
2012年4月17日 星期二
轉貼 WSDL CLient in JAVA
WSDL 是一種網路服務傳送接收的方法,以XML 樣視為基礎的溝通方式[1],
關於建立的方式這裡就不介紹了,以client 端為主, 詳細流程不多說,
搜尋 wsdl eclipse clinet 就能找到相關的資料了,值得提醒的地方就是大部分都是用 AXIS2 來搭配解析[2], 在 eclipse 中要使用的話要先下載後在設定路徑 , Windows->Preference->Web Services, AXIS2 載點(http://axis.apache.org/axis2/java/core/download.cgi)。

圖一,設定AXIS
此外還有,
a. 在有限制的環境下,要套用proxy.
b. 也可以使用 AXIS 的方式取得 WSDL, AXIS 至少在 eclipse3.6 是內建的
以下簡介使用的步驟:
圖二,新增WSDL Client
圖三,選擇輸入WSDL 服務的網址,設定APACHE 和 AXIS2 的server
補充 , 若要將產生的class 檔 在 client 端程式使用,必須使用 AXIS2 的lib ,不過查詢一下找到精簡的jar 清單[3], 清單如下:
參考:
[1] WSDL,wiki
[2] AXIS2
[3] Minimum set of jar files for Apache Axis2 1.6.1
關於建立的方式這裡就不介紹了,以client 端為主, 詳細流程不多說,
搜尋 wsdl eclipse clinet 就能找到相關的資料了,值得提醒的地方就是大部分都是用 AXIS2 來搭配解析[2], 在 eclipse 中要使用的話要先下載後在設定路徑 , Windows->Preference->Web Services, AXIS2 載點(http://axis.apache.org/axis2/java/core/download.cgi)。

圖一,設定AXIS
此外還有,
a. 在有限制的環境下,要套用proxy.
b. 也可以使用 AXIS 的方式取得 WSDL, AXIS 至少在 eclipse3.6 是內建的
以下簡介使用的步驟:
- 新增web專案TEST_WSDL_Client,我是使用 Dynamic Web Project, static project 應該也可以吧。
- 在TEST_WSDL_Client專案下新增 Web Service Client 如圖二。
- 設定 Web Service Client,Service definition 輸入 WSDL 的網址, Configuration 設定AXIS2,預設是AXIS,設定畫面如圖三。
- 若是在有proxy 的環境下記得設定proxy,接者按下一步應該就可以產生相關的java class 了
圖二,新增WSDL Client
圖三,選擇輸入WSDL 服務的網址,設定APACHE 和 AXIS2 的server
補充 , 若要將產生的class 檔 在 client 端程式使用,必須使用 AXIS2 的lib ,不過查詢一下找到精簡的jar 清單[3], 清單如下:
- axiom-api-1.2.12.jar
- axiom-impl-1.2.12.jar
- axis2-adb-1.6.1.jar
- axis2-kernel-1.6.1.jar
- axis2-transport-http-1.6.1.jar
- axis2-transport-local-1.6.1.jar
- axis2-xmlbeans-1.6.1.jar (optional)
- commons-codec-1.3.jar
- commons-httpclient-3.1.jar
- commons-logging-1.1.1.jar
- httpcore-4.0.jar
- mail-1.4.jar
- neethi-3.0.1.jar
- woden-api-1.0M9.jar
- woden-impl-dom-1.0M9.jar
- wsdl4j-1.6.2.jar
- wstx-asl-3.2.9.jar
- xmlbeans-2.3.0.jar (optional)
- XmlSchema-1.4.7.jar
參考:
[1] WSDL,wiki
[2] AXIS2
[3] Minimum set of jar files for Apache Axis2 1.6.1
2012年4月3日 星期二
2012年3月28日 星期三
心得, java 取得音樂撥放時間長度
標籤:
java
取得 音效檔的長度,
Wav:
可以是用[1] 的方式,計算出音效檔的長度,程式碼:
private Void GetLength(String filename) { // ex "C:\\Documents and Settings\\Administrator\\My Documents\\My Music\\my.wav"
File file = new File(filename);
AudioInputStream audioInputStream;
try {
audioInputStream = AudioSystem.getAudioInputStream(file);
AudioFormat format = audioInputStream.getFormat();
long audioFileLength = file.length();
int frameSize = format.getFrameSize();
float frameRate = format.getFrameRate();
float durationInSeconds = (audioFileLength / (frameSize * frameRate));
System.out.println( " Length :"+durationInSeconds);
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
MP3:
利用 MP3SPI[2],這個LGPL 的 函式取得 mp3 檔案的標籤,其中就有音效檔的長度
參考:
[1]: How do I get a mp3 file's total time in Java?, http://stackoverflow.com
[2]: MP3SPI
2012年3月19日 星期一
轉貼 - java 批次 SQL 處理
此篇作一個紀錄,方便以後好查詢
下面的範例,包含 oracle, mysql 和 JDBC 的用法
個人認為的關鍵字 addBatch,DriverManager,executeBatch
參考網頁:
2012年3月15日 星期四
心得 , JNDI 存取 Oracle 錯誤 ORA-01861
小心得,使用 JNDI 寫入 Oracle 資料庫時,出現了 ORA-01861 錯誤訊息,查證了一下, 原來是日期時間的問題, 吧 日期時間的輸入欄位換成 : to_date('2003/05/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss')
之類的就可以
參考: Oracle/PLSQL: Insert a date/time value into an Oracle table
之類的就可以
參考: Oracle/PLSQL: Insert a date/time value into an Oracle table
2012年2月21日 星期二
轉貼 Java Excel API
標籤:
java
Excel 是常見的資料格式,透過 Java Excel API 可以透過java 運算或撈資料庫的東西,再把資料存取在Excel 上,或取出 Excel 的資料來作運算。
存取的格式是 .xls 得格式, 像 xlsx 的格式沒試過不過應該不行吧。
以下是他的相關連結
Licence: 是GPL的喔
存取的格式是 .xls 得格式, 像 xlsx 的格式沒試過不過應該不行吧。
以下是他的相關連結
- 介紹: http://www.andykhan.com/jexcelapi/
- 載點:http://www.andykhan.com/jexcelapi/download.html
- 範例:http://www.andykhan.com/jexcelapi/tutorial.html
Licence: 是GPL的喔
2011年7月5日 星期二
心得 Google app engine deletePersistentAll
標籤:
google api,
java
JDO 中,可以利用 deletePersistentAll 來刪除符合條件的資料
例如.
不過若因為符合資料太多 則會造成 java.lang.OutOfMemoryError: Java heap space 的錯誤(heap 空間不夠),
可以考慮其他方式, 因為 google app enigne 的查詢只允許 1 個範圍的過濾查詢[2], 目前想到的方式是用order 後 取出前幾位,之後在將每個屬性判斷否符合條件在刪除, 用起來還真不方便....
參考
例如.
javax.jdo.Query query = pm.newQuery(Person.class);
query.setFilter("height > 100");
query.deletePersistentAll();
不過若因為符合資料太多 則會造成 java.lang.OutOfMemoryError: Java heap space 的錯誤(heap 空間不夠),
可以考慮其他方式, 因為 google app enigne 的查詢只允許 1 個範圍的過濾查詢[2], 目前想到的方式是用order 後 取出前幾位,之後在將每個屬性判斷否符合條件在刪除, 用起來還真不方便....
參考
2011年5月24日 星期二
心得 JCache in Google App Engine
標籤:
google api,
java
App Engine 提供了 JCache API 的方法, 目前可以想到的用法就是吧 常用的 靜態資料 存到 catche 裡 在加速讀取速度
詳細的用法在 [1],[2] 有說明了,這裡就不再贅述,
使用 CacheFactory 取得 Cache 實例 , 可以將 CacheFactory 取得的資料定義一個static 或全域的物件,我個人是認為這樣比較方便 存取 JCache
不過要注意的是 存到 catch 的值 必須是 Serializable 的物件 所以要自訂物件的話就要 implement
Serializable 這個 interface 先
順道一題 google app engine 不允許 FileOutputStream 這個方法
[3] 這篇文章 是將 JCache 的方法定義到 ServletContextListener, 來加速首頁讀取的速度
參考
[1] Google 應用服務引擎, 使用 JCache
[2] Google App Engine, Using JCache
[3] GAppEngine中使用JCache来提高网站的性能
詳細的用法在 [1],[2] 有說明了,這裡就不再贅述,
使用 CacheFactory 取得 Cache 實例 , 可以將 CacheFactory 取得的資料定義一個static 或全域的物件,我個人是認為這樣比較方便 存取 JCache
不過要注意的是 存到 catch 的值 必須是 Serializable 的物件 所以要自訂物件的話就要 implement
Serializable 這個 interface 先
順道一題 google app engine 不允許 FileOutputStream 這個方法
[3] 這篇文章 是將 JCache 的方法定義到 ServletContextListener, 來加速首頁讀取的速度
參考
[1] Google 應用服務引擎, 使用 JCache
[2] Google App Engine, Using JCache
[3] GAppEngine中使用JCache来提高网站的性能
心得 Object Serialization Java
標籤:
java
Serialization 簡單的說就是可以將java 物件(object) 儲存成一個位元組起來,下次在讀取的時候在將位元組轉成物件使用
若要 Serialization 在物件必須 implements Serializable 這個 Interface
如以下的 code
呼叫的範例可以參考, 範例簡單的說是將 這個物件存到 obj.dat 的檔案 ,之後再取出來( obj.dat 也可以換成指定的路徑 如 c:/obj.dat )
參考:
[1]:Object serialization with Serializable interface, ObjectOutputStream and ObjectInputStream.
[2]:http://home.so-net.net.tw/idealist/Java/IO.html
若要 Serialization 在物件必須 implements Serializable 這個 Interface
如以下的 code
import java.io.Serializable;
class MyClass implements Serializable {
String str;
double[] vals;
File fn;
public MyClass(String s, double[] nums, String fname) {
str = s;
vals = nums;
fn = new File(fname);
}
public String toString() {
String data = " str: " + str + "\n vals: ";
for (double d : vals)
data += d + " ";
data += "\n fn: " + fn.getName();
return data;
}
}
呼叫的範例可以參考, 範例簡單的說是將 這個物件存到 obj.dat 的檔案 ,之後再取出來( obj.dat 也可以換成指定的路徑 如 c:/obj.dat )
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Main {
public static void main(String[] argv) throws Exception {
double v[] = { 1.1, 2.2, 3.3 };
double v2[] = { 9.0, 8.0, 7.7 };
MyClass obj1 = new MyClass("This is a test", v, "Test.txt");
MyClass obj2 = new MyClass("Alpha Beta Gamma", v2, "Sample.dat");
ObjectOutputStream fout = new ObjectOutputStream(new FileOutputStream("obj.dat"));
System.out.println("obj1:\n" + obj1);
fout.writeObject(obj1);
System.out.println("obj2:\n" + obj2);
fout.writeObject(obj2);
fout.close();
ObjectInputStream fin = new ObjectInputStream(new FileInputStream("obj.dat"));
MyClass inputObj;
inputObj = (MyClass) fin.readObject();
System.out.println("First object:\n" + inputObj);
inputObj = (MyClass) fin.readObject();
System.out.println("Second object:\n" + inputObj);
fin.close();
}
}
參考:
[1]:Object serialization with Serializable interface, ObjectOutputStream and ObjectInputStream.
[2]:http://home.so-net.net.tw/idealist/Java/IO.html
訂閱:
文章 (Atom)


