?? wordgroup.java
字號:
package org.zblog.zenghelper.dbtool;
import java.util.Hashtable;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.util.Enumeration;
import java.io.IOException;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
/**
* <br><strong>Z英語學習助手-RMS操作工具類</strong><br>
* <br>
* 該類映射為RMS中詞組記錄,詞組記錄主要記錄了一個Hashtabe中的數據,該Hashtable中key為
* 詞(En或Cn)的String,value為該詞在詞庫(En庫或Cn庫)中Recorrd ID,該類主要用于在查詢
* 時,能快速縮小循環遍歷的范圍,直接定位到該詞組,然后在從Hashtable中記錄的id快速定位到
* 詞的詳細信息.
* <br> 其中該類中的:enBaseNum和cnBaseNum分別記錄了En和Cn詞組的Rs ID開始Num,因為設備不同,
* 開始的Num可能不一樣,主要是用于計算Rs id時,將固定算法的Id+baseNum,從而得出詞組ID
*
* @author <a href="mailto:zcw@zblog.org">朱傳偉</a><br><a href="http://www.zblog.org">www.zblog.org</a></p>
* @version <strong>ZEnHelper</strong> Ver 1.0
*/
public class WordGroup {
private DbTool dbt=DbTool.getInstance();
private String rsName=null;
public int rsId=-1;
public boolean isen=true;
//記錄中 文字符串->id 集合
public Hashtable words=new Hashtable();
public byte[]bytes=null;
/**
* 根據傳遞的單詞,先通過固定算法定位RMS名字和RSId,然后再從RMS中獲取數據,
* 以構造WordGroup對象
* @param word String
*/
public WordGroup(String word){
word=word.toLowerCase();
if(word.charAt(0)>'z')
init(word,false);
else
init(word,true);
}
/**
* 直接傳遞RMS名字和id的方式進行初始化構造對象,該方法不再去判斷單詞
* 的類型en或cn,而是直接從RMS中load數據進行構造對象
* @param rsname String RMS名
* @param id int RSId
public WordGroup(String rsname,int id){
rsName=rsname;
rsId=id;
load();
}
*/
/**
* 根據word關鍵字,用固定算法計算RSid,用en是否英文標志來確定RMS名字.然后從RMS中load
* 數據來進行對象的構造
* @param word String
* @param en boolean
*/
public WordGroup(String word,boolean en){
init(word,en);
}
/**
* 初始化方法,從數據庫中獲取byte[]數據,還原個對象的屬性
* @param word String
* @param en boolean
*/
private void init(String word,boolean en){
isen=en;
NumGenerator ng=NumGenerator.getInstance();
rsId=ng.getWordNum(word,en);
if(en)
rsName=DbTool.EN_WORD_GROUP_DB;
else
rsName=DbTool.CN_WORD_GROUP_DB;
load();
}
/**
* 從RMS中加載字符數組來初始化對象
* @param fw String
*/
private void load(){
formByte(dbt.getRSByte(rsName,rsId));
}
/**
* 查詢英文或中文詞語,如果找到,則返回該詞的RMS id,
* 否則返回-1,表示沒有找到.
* @param word String
* @return int
*/
public int searchWord(String word){
String vi=(String)words.get(word);
if(vi!=null){
return Integer.parseInt(vi);
}
return -1;
}
/**
* 向詞組中添加詞語(英文單詞或中文詞語)
* @param word String
* @param rid int
*/
public void addWord(String word,int rid){
words.put(word,rid+"");
}
/**
* 保存對該詞組對象WordGroup的修改
*/
public void store() throws IOException {
toBytes();
dbt.update(rsName,bytes,rsId);
}
/**
* 將Hashtable中的值轉換為byte[],主要用于數據庫存儲
* @return byte[] 返回該組別的byte[]格式
*/
public void toBytes() throws IOException {
try{
ByteArrayOutputStream bos=new ByteArrayOutputStream();
DataOutputStream dos=new DataOutputStream(bos);
Enumeration enu=words.keys();
Object key=null;
Object value=null;
dos.writeInt(words.size());
while (enu.hasMoreElements()) {
key = enu.nextElement();
value = words.get(key);
dos.writeUTF((String) key);
dos.writeUTF((String) value);
}
bytes=bos.toByteArray();
dos.close();
bos.close();
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 從RMS中取出byte[],并恢復原格式
* @param data byte[]
*/
public void formByte(byte[]data){
bytes=data;
if(data==null||data.length<=0){
words.clear();
return;
}
try{
ByteArrayInputStream bis = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bis);
int count = dis.readInt();
words.clear();
while(count>0){
words.put(dis.readUTF(),dis.readUTF());
count--;
}
dis.close();
bis.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -