Create Project
This commit is contained in:
12
.classpath
Normal file
12
.classpath
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre1.8.0_60"/>
|
||||||
|
<classpathentry kind="lib" path="libs/jackson-annotations-2.2.3.jar"/>
|
||||||
|
<classpathentry kind="lib" path="libs/jackson-core-2.2.3.jar"/>
|
||||||
|
<classpathentry kind="lib" path="libs/jackson-databind-2.2.3.jar"/>
|
||||||
|
<classpathentry kind="lib" path="libs/jna-3.5.2.jar"/>
|
||||||
|
<classpathentry kind="lib" path="libs/zxing-r12937.jar"/>
|
||||||
|
<classpathentry kind="lib" path="libs/bcprov-jdk16-139.jar"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
||||||
2
.settings/org.eclipse.core.resources.prefs
Normal file
2
.settings/org.eclipse.core.resources.prefs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
encoding/<project>=UTF-8
|
||||||
11
.settings/org.eclipse.jdt.core.prefs
Normal file
11
.settings/org.eclipse.jdt.core.prefs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
||||||
BIN
libs/bcprov-jdk16-139.jar
Normal file
BIN
libs/bcprov-jdk16-139.jar
Normal file
Binary file not shown.
BIN
libs/jackson-annotations-2.2.3.jar
Normal file
BIN
libs/jackson-annotations-2.2.3.jar
Normal file
Binary file not shown.
BIN
libs/jackson-core-2.2.3.jar
Normal file
BIN
libs/jackson-core-2.2.3.jar
Normal file
Binary file not shown.
BIN
libs/jackson-databind-2.2.3.jar
Normal file
BIN
libs/jackson-databind-2.2.3.jar
Normal file
Binary file not shown.
BIN
libs/jna-3.5.2.jar
Normal file
BIN
libs/jna-3.5.2.jar
Normal file
Binary file not shown.
BIN
libs/zxing-r12937.jar
Normal file
BIN
libs/zxing-r12937.jar
Normal file
Binary file not shown.
14
src/com/light/hard/center/HardCenter.java
Normal file
14
src/com/light/hard/center/HardCenter.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package com.light.hard.center;
|
||||||
|
|
||||||
|
public class HardCenter {
|
||||||
|
private static HardServiceInfo m_serviceInfo = null;
|
||||||
|
|
||||||
|
public static HardServiceInfo GetInfo() {
|
||||||
|
if (m_serviceInfo == null) {
|
||||||
|
m_serviceInfo = new HardServiceInfo();
|
||||||
|
m_serviceInfo.IsKey = true;
|
||||||
|
m_serviceInfo.IsCamera = true;
|
||||||
|
}
|
||||||
|
return m_serviceInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
51
src/com/light/hard/center/HardServiceInfo.java
Normal file
51
src/com/light/hard/center/HardServiceInfo.java
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
package com.light.hard.center;
|
||||||
|
|
||||||
|
import com.light.hard.scan.HardScanBase;
|
||||||
|
|
||||||
|
public class HardServiceInfo {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否开启点击摄像机
|
||||||
|
*/
|
||||||
|
public boolean IsCamera = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否显示按钮
|
||||||
|
*/
|
||||||
|
public boolean IsKey = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否显示左边自定义按键
|
||||||
|
*/
|
||||||
|
public boolean IsKeyLeft = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否开启摄像头
|
||||||
|
*/
|
||||||
|
public int OpenCameraKey = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否自动开启IC卡
|
||||||
|
*/
|
||||||
|
public int OpenICKey = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否自动开启扫描
|
||||||
|
*/
|
||||||
|
public int OpenCodeKey = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 二维码扫描驱动
|
||||||
|
*/
|
||||||
|
public HardScanBase ScanCode = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IC卡扫描驱动
|
||||||
|
*/
|
||||||
|
public HardScanBase ScanIC = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 照相驱动
|
||||||
|
*/
|
||||||
|
public HardScanBase ScanCamera = null;
|
||||||
|
}
|
||||||
166
src/com/light/hard/center/ScanCenter.java
Normal file
166
src/com/light/hard/center/ScanCenter.java
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
package com.light.hard.center;
|
||||||
|
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
import com.light.util.*;
|
||||||
|
import com.light.hard.scan.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扫描中心,最主要进行权限的控制和扫描功能的转接
|
||||||
|
*
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ScanCenter implements DelegateScan {
|
||||||
|
private HardServiceInfo m_ServiceInfo = null;
|
||||||
|
private Event<DelegateScan> m_OnRead = new Event<DelegateScan>();
|
||||||
|
private Stack<Event<DelegateScan>> m_OnReadChche = new Stack<Event<DelegateScan>>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造函数
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
*/
|
||||||
|
public ScanCenter() {
|
||||||
|
this.m_ServiceInfo = HardCenter.GetInfo();
|
||||||
|
this.Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化
|
||||||
|
*/
|
||||||
|
public void Init() {
|
||||||
|
if (this.m_ServiceInfo.ScanCode != null) {
|
||||||
|
this.m_ServiceInfo.ScanCode.getOnRead().Add(this);
|
||||||
|
if (this.m_ServiceInfo.OpenCodeKey == 0) {
|
||||||
|
this.m_ServiceInfo.ScanCode.Open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.m_ServiceInfo.ScanIC != null) {
|
||||||
|
this.m_ServiceInfo.ScanIC.getOnRead().Add(this);
|
||||||
|
if (this.m_ServiceInfo.OpenICKey == 0) {
|
||||||
|
this.m_ServiceInfo.ScanIC.Open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close() {
|
||||||
|
if (this.m_ServiceInfo.ScanCode != null) {
|
||||||
|
if (this.m_ServiceInfo.OpenCodeKey == 0) {
|
||||||
|
this.m_ServiceInfo.ScanCode.Close();
|
||||||
|
}
|
||||||
|
this.m_ServiceInfo.ScanCode.Dispose();
|
||||||
|
}
|
||||||
|
if (this.m_ServiceInfo.ScanIC != null) {
|
||||||
|
if (this.m_ServiceInfo.OpenICKey == 0) {
|
||||||
|
this.m_ServiceInfo.ScanIC.Close();
|
||||||
|
}
|
||||||
|
this.m_ServiceInfo.ScanIC.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前扫描按钮的事件
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Event<DelegateScan> getOnRead() {
|
||||||
|
return this.m_OnRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将扫描权限交给到当前对象
|
||||||
|
*
|
||||||
|
* @param vScan
|
||||||
|
* 需要获取到扫描权限的对象
|
||||||
|
*/
|
||||||
|
public void PushRead(DelegateScan vScan) {
|
||||||
|
this.m_OnReadChche.push(this.m_OnRead);
|
||||||
|
this.m_OnRead = new Event<DelegateScan>();
|
||||||
|
this.m_OnRead.Add(vScan);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将扫描对象的权限删除,当该权限是在最顶端的时候,会讲权限交给前一个
|
||||||
|
*
|
||||||
|
* @param vScan
|
||||||
|
*/
|
||||||
|
public void PopRead(DelegateScan vScan) {
|
||||||
|
boolean isRemove = this.m_OnRead.Remove(vScan);
|
||||||
|
if (isRemove) {
|
||||||
|
while (this.m_OnRead.size() == 0) {
|
||||||
|
if (this.m_OnReadChche.size() == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this.m_OnRead = this.m_OnReadChche.pop();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (Event<DelegateScan> vItem : this.m_OnReadChche) {
|
||||||
|
isRemove = vItem.Remove(vScan);
|
||||||
|
if (isRemove) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Execute(ScanData vData) throws Exception {
|
||||||
|
this.m_OnRead.Exeucte(new DelegateScanExecute(vData));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按键按下时
|
||||||
|
*
|
||||||
|
* @param keyCode
|
||||||
|
* 键盘按键
|
||||||
|
* @param event
|
||||||
|
* 事件
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public boolean OnKeyDown(int keyCode, KeyEvent event) throws Exception {
|
||||||
|
int vCount = 0;
|
||||||
|
boolean ret = false;
|
||||||
|
if (vCount == 0) {
|
||||||
|
if (keyCode == this.m_ServiceInfo.OpenCodeKey && this.m_ServiceInfo.ScanCode != null) {
|
||||||
|
this.m_ServiceInfo.ScanCode.Open();
|
||||||
|
ret = true;
|
||||||
|
} else if (keyCode == this.m_ServiceInfo.OpenICKey && this.m_ServiceInfo.ScanIC != null) {
|
||||||
|
this.m_ServiceInfo.ScanIC.Open();
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当按钮松开时
|
||||||
|
*
|
||||||
|
* @param vContext
|
||||||
|
* 上下文
|
||||||
|
* @param keyCode
|
||||||
|
* 键盘按键
|
||||||
|
* @param event
|
||||||
|
* 事件
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public boolean OnKeyUp(int keyCode, KeyEvent event) throws Exception {
|
||||||
|
int vCount = 0;
|
||||||
|
boolean ret = false;
|
||||||
|
|
||||||
|
if (vCount == 0) {
|
||||||
|
if (keyCode == this.m_ServiceInfo.OpenCodeKey && this.m_ServiceInfo.ScanCode != null) {
|
||||||
|
this.m_ServiceInfo.ScanCode.Close();
|
||||||
|
ret = true;
|
||||||
|
} else if (keyCode == this.m_ServiceInfo.OpenICKey && this.m_ServiceInfo.ScanIC != null) {
|
||||||
|
this.m_ServiceInfo.ScanIC.Close();
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/com/light/hard/common/DelegateCommon.java
Normal file
13
src/com/light/hard/common/DelegateCommon.java
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package com.light.hard.common;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当设备常规事件触发时
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface DelegateCommon {
|
||||||
|
/**
|
||||||
|
* 常规方法
|
||||||
|
*/
|
||||||
|
void Execute();
|
||||||
|
}
|
||||||
20
src/com/light/hard/common/DelegateCommonExecute.java
Normal file
20
src/com/light/hard/common/DelegateCommonExecute.java
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package com.light.hard.common;
|
||||||
|
|
||||||
|
import com.light.util.IEventExecute;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 常规方法触发执行类
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DelegateCommonExecute implements IEventExecute<DelegateCommon> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行的函数
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void Execute(DelegateCommon t) throws Exception {
|
||||||
|
t.Execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
14
src/com/light/hard/common/DelegateDebug.java
Normal file
14
src/com/light/hard/common/DelegateDebug.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package com.light.hard.common;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调试设备时触发的事件的接口
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface DelegateDebug {
|
||||||
|
/**
|
||||||
|
* 执行的方法
|
||||||
|
* @param paras 事件时候的参数
|
||||||
|
*/
|
||||||
|
void Execute(Object ... paras);
|
||||||
|
}
|
||||||
29
src/com/light/hard/common/DelegateDebugExecute.java
Normal file
29
src/com/light/hard/common/DelegateDebugExecute.java
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package com.light.hard.common;
|
||||||
|
|
||||||
|
import com.light.util.IEventExecute;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调试时候的事件执行类
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DelegateDebugExecute implements IEventExecute<DelegateDebug> {
|
||||||
|
private Object[] m_object;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造函数
|
||||||
|
* @param objects 参数信息
|
||||||
|
*/
|
||||||
|
public DelegateDebugExecute( Object... objects) {
|
||||||
|
m_object = objects;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件执行的实现主体
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void Execute(DelegateDebug t) throws Exception {
|
||||||
|
t.Execute(m_object);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
6
src/com/light/hard/common/DelegateError.java
Normal file
6
src/com/light/hard/common/DelegateError.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package com.light.hard.common;
|
||||||
|
|
||||||
|
public interface DelegateError
|
||||||
|
{
|
||||||
|
void Execute(Exception ex);
|
||||||
|
}
|
||||||
28
src/com/light/hard/common/DelegateErrorExecute.java
Normal file
28
src/com/light/hard/common/DelegateErrorExecute.java
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package com.light.hard.common;
|
||||||
|
|
||||||
|
import com.light.util.IEventExecute;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异常事件处理类
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DelegateErrorExecute implements IEventExecute<DelegateError> {
|
||||||
|
private Exception m_exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造函数
|
||||||
|
* @param ex 错误异常信息
|
||||||
|
*/
|
||||||
|
public DelegateErrorExecute(Exception ex) {
|
||||||
|
m_exception = ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行的主体函数
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void Execute(DelegateError t) throws Exception {
|
||||||
|
t.Execute(m_exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
77
src/com/light/hard/common/HardStatus.java
Normal file
77
src/com/light/hard/common/HardStatus.java
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
package com.light.hard.common;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @类描述:当前硬件的状态
|
||||||
|
* @项目名称:ScanDemo
|
||||||
|
* @包名: piaost.client.hard
|
||||||
|
* @类名称:HardStatus
|
||||||
|
* @创建人:Administrator
|
||||||
|
* @创建时间:2016-5-26下午2:04:08
|
||||||
|
*/
|
||||||
|
public enum HardStatus {
|
||||||
|
/**
|
||||||
|
* 关闭
|
||||||
|
*/
|
||||||
|
Close(0),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打开,但是还没有连接上
|
||||||
|
*/
|
||||||
|
Open(1),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 已经连接上硬件,一般不直接使用,用于和Open组合使用
|
||||||
|
*/
|
||||||
|
Connection(2),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭中
|
||||||
|
*/
|
||||||
|
Closeing(4),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打开连接中
|
||||||
|
*/
|
||||||
|
OpenConnection(3),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打开关闭中
|
||||||
|
*/
|
||||||
|
OpenCloseint(5),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 已连接,正在关闭(未打开,错误状态)
|
||||||
|
*/
|
||||||
|
ConnectionCloseint(6),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打开连接,并正在关闭
|
||||||
|
*/
|
||||||
|
OpenConnectionCloseint(7);
|
||||||
|
|
||||||
|
private int intValue;
|
||||||
|
private static HashMap<Integer, HardStatus> mappings;
|
||||||
|
|
||||||
|
private synchronized static HashMap<Integer, HardStatus> getMappings() {
|
||||||
|
if (mappings == null) {
|
||||||
|
mappings = new HashMap<Integer, HardStatus>();
|
||||||
|
}
|
||||||
|
return mappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
private HardStatus(int value) {
|
||||||
|
intValue = value;
|
||||||
|
HardStatus.getMappings().put(value, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return intValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HardStatus forValue(int value) {
|
||||||
|
return getMappings().get(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
11
src/com/light/hard/common/IDisposable.java
Normal file
11
src/com/light/hard/common/IDisposable.java
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package com.light.hard.common;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 摘要:定义一种释放分配的资源的方法。
|
||||||
|
*/
|
||||||
|
public interface IDisposable {
|
||||||
|
/**
|
||||||
|
* 摘要: 执行与释放或重置非托管资源相关的应用程序定义的任务。
|
||||||
|
*/
|
||||||
|
void Dispose();
|
||||||
|
}
|
||||||
86
src/com/light/hard/common/IHardBase.java
Normal file
86
src/com/light/hard/common/IHardBase.java
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
package com.light.hard.common;
|
||||||
|
|
||||||
|
import com.light.util.Event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @类描述:当前设备状态事件
|
||||||
|
* @项目名称:ScanDemo
|
||||||
|
* @包名: piaost.client.hard
|
||||||
|
* @类名称:IHardBase
|
||||||
|
* @创建人:Administrator
|
||||||
|
* @创建时间:2016-5-26下午2:04:39
|
||||||
|
*/
|
||||||
|
public interface IHardBase extends IDisposable
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 当前连接的状态
|
||||||
|
*/
|
||||||
|
HardStatus getStatus();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否已经打开
|
||||||
|
*/
|
||||||
|
boolean getIsOpen();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否已经连接上
|
||||||
|
*/
|
||||||
|
boolean getIsConnection();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否关闭中
|
||||||
|
*/
|
||||||
|
boolean getIsCloseing();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否正在读取中
|
||||||
|
*/
|
||||||
|
boolean getIsRun();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打开硬件,包含硬件搜索,并且打开硬件连接。
|
||||||
|
*/
|
||||||
|
void Open();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭硬件
|
||||||
|
*/
|
||||||
|
void Close();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调试时用于获取内部数据的状态事件
|
||||||
|
*/
|
||||||
|
Event<DelegateDebug> getOnDebug();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当触发异常时,执行该函数
|
||||||
|
*/
|
||||||
|
Event<DelegateError> getOnError();
|
||||||
|
|
||||||
|
//常规事件
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当执行ScanOpen时会触发该事件
|
||||||
|
*/
|
||||||
|
Event<DelegateCommon> getOnOpen();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当硬件连接上的时候会触发该事件
|
||||||
|
*/
|
||||||
|
Event<DelegateCommon> getOnConnection();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当硬件连接断开时触发该事件
|
||||||
|
*/
|
||||||
|
Event<DelegateCommon> getOnDisConnection();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当执行ScanClose时,确定关闭前会触发该事件
|
||||||
|
*/
|
||||||
|
Event<DelegateCommon> getOnClosing();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当执行ScanClose时,完全关闭后会触发该事件
|
||||||
|
*/
|
||||||
|
Event<DelegateCommon> getClosed();
|
||||||
|
}
|
||||||
70
src/com/light/hard/print/FontStyle.java
Normal file
70
src/com/light/hard/print/FontStyle.java
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
package com.light.hard.print;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @类描述:字体类型
|
||||||
|
* @项目名称:ScanDemo
|
||||||
|
* @包名: piaost.client.hard
|
||||||
|
* @类名称:FontStyle
|
||||||
|
* @创建人:Administrator
|
||||||
|
* @创建时间:2016-5-26下午1:26:51
|
||||||
|
*/
|
||||||
|
public enum FontStyle {
|
||||||
|
|
||||||
|
Regular(0),
|
||||||
|
/**
|
||||||
|
* 黑体
|
||||||
|
*/
|
||||||
|
Bold(1),
|
||||||
|
/**
|
||||||
|
* 斜体
|
||||||
|
*/
|
||||||
|
Italic(2),
|
||||||
|
/**
|
||||||
|
* 下划线
|
||||||
|
*/
|
||||||
|
Underline (4),
|
||||||
|
/**
|
||||||
|
* 加删除线
|
||||||
|
*/
|
||||||
|
Strikeout(8);
|
||||||
|
|
||||||
|
private int value = 0;
|
||||||
|
private FontStyle(int value){
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static FontStyle ofValue(int value){
|
||||||
|
switch (value) {
|
||||||
|
case 0:
|
||||||
|
return Regular;
|
||||||
|
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
return Bold;
|
||||||
|
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
|
||||||
|
return Italic;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
|
||||||
|
return Underline;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
|
||||||
|
return Strikeout;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int value(){
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
89
src/com/light/hard/scan/CodeType.java
Normal file
89
src/com/light/hard/scan/CodeType.java
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
package com.light.hard.scan;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @类描述: 条码类型
|
||||||
|
* @项目名称:ScanDemo
|
||||||
|
* @包名: piaost.client.hard
|
||||||
|
* @类名称:CodeType
|
||||||
|
* @创建人:Administrator
|
||||||
|
* @创建时间:2016-5-26下午1:25:35
|
||||||
|
*/
|
||||||
|
public enum CodeType {
|
||||||
|
None(0),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 条形码
|
||||||
|
*/
|
||||||
|
Code(0x0001),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 二维码
|
||||||
|
*/
|
||||||
|
QrCode(0x0002),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有的条码
|
||||||
|
*/
|
||||||
|
AllCode(0x0001 | 0x0002),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IC卡
|
||||||
|
*/
|
||||||
|
ICCard(0x0004),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ID卡、身份证
|
||||||
|
*/
|
||||||
|
IDCard(0x0008),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有卡
|
||||||
|
*/
|
||||||
|
AllCard(0x0004 | 0x0008),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 指纹扫描
|
||||||
|
*/
|
||||||
|
Finger(0x0010),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 磁卡
|
||||||
|
*/
|
||||||
|
CiKa(0x0020),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手机号
|
||||||
|
*/
|
||||||
|
Mobile(0x0080),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有
|
||||||
|
*/
|
||||||
|
All(0x003F);
|
||||||
|
|
||||||
|
private int intValue;
|
||||||
|
private static HashMap<Integer, CodeType> mappings;
|
||||||
|
|
||||||
|
private synchronized static HashMap<Integer, CodeType> getMappings() {
|
||||||
|
if (mappings == null) {
|
||||||
|
mappings = new HashMap<Integer, CodeType>();
|
||||||
|
}
|
||||||
|
return mappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
private CodeType(int value) {
|
||||||
|
intValue = value;
|
||||||
|
CodeType.getMappings().put(value, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return intValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CodeType forValue(int value) {
|
||||||
|
return getMappings().get(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
20
src/com/light/hard/scan/DelegateScan.java
Normal file
20
src/com/light/hard/scan/DelegateScan.java
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package com.light.hard.scan;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扫描触发时的接口
|
||||||
|
*
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface DelegateScan {
|
||||||
|
/**
|
||||||
|
* 当扫描触发时的执行方法
|
||||||
|
*
|
||||||
|
* @param vData
|
||||||
|
* 扫描到的数据
|
||||||
|
* @throws Exception
|
||||||
|
* 异常信息
|
||||||
|
*/
|
||||||
|
void Execute(ScanData vData) throws Exception;
|
||||||
|
}
|
||||||
31
src/com/light/hard/scan/DelegateScanExecute.java
Normal file
31
src/com/light/hard/scan/DelegateScanExecute.java
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package com.light.hard.scan;
|
||||||
|
|
||||||
|
import com.light.util.IEventExecute;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扫描的执行类
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DelegateScanExecute implements IEventExecute<DelegateScan>
|
||||||
|
{
|
||||||
|
private ScanData m_data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造函数
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
public DelegateScanExecute(ScanData data)
|
||||||
|
{
|
||||||
|
m_data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行处理
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void Execute(DelegateScan t) throws Exception
|
||||||
|
{
|
||||||
|
t.Execute(m_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
570
src/com/light/hard/scan/HardScanBase.java
Normal file
570
src/com/light/hard/scan/HardScanBase.java
Normal file
@@ -0,0 +1,570 @@
|
|||||||
|
package com.light.hard.scan;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import com.light.util.*;
|
||||||
|
import com.light.hard.common.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @类描述:IC卡设备基本操作类
|
||||||
|
* @项目名称:ScanDemo
|
||||||
|
* @包名: piaost.client.hard
|
||||||
|
* @类名称:HardScanBase
|
||||||
|
* @创建人:Administrator
|
||||||
|
* @创建时间:2016-5-26下午1:55:19
|
||||||
|
*/
|
||||||
|
public abstract class HardScanBase implements IHardScan {
|
||||||
|
protected static HashMap<Class<?>, Integer> m_OpenCount = new HashMap<Class<?>, Integer>();
|
||||||
|
protected static Object m_Lock = new Object();
|
||||||
|
protected HardStatus Status = HardStatus.Close;
|
||||||
|
protected CodeType ReadType = CodeType.All;
|
||||||
|
protected int ErrorTimeout;
|
||||||
|
protected int SuccuessTimeout;
|
||||||
|
protected boolean AutoConnection;
|
||||||
|
protected int AutoConnectionTimeout;
|
||||||
|
|
||||||
|
private Thread m_Thread = null;
|
||||||
|
protected boolean m_IsThread = false;
|
||||||
|
|
||||||
|
public HardScanBase() {
|
||||||
|
this.SetStatus(HardStatus.Close);
|
||||||
|
this.ReadType = CodeType.All;
|
||||||
|
this.m_IsThread = this.GetIsThread();
|
||||||
|
this.ErrorTimeout = 500;
|
||||||
|
this.SuccuessTimeout = 1000;
|
||||||
|
this.AutoConnectionTimeout = 1000;
|
||||||
|
this.AutoConnection = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HardStatus getStatus() {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void SetStatus(HardStatus vStatus) {
|
||||||
|
synchronized (this) {
|
||||||
|
this.Status = vStatus;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CodeType getReadType() {
|
||||||
|
return ReadType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setReadType(CodeType value) {
|
||||||
|
ReadType = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getIsOpen() {
|
||||||
|
return (this.Status.getValue() & HardStatus.Open.getValue()) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getIsConnection() {
|
||||||
|
return (this.Status.getValue() & HardStatus.Connection.getValue()) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getIsCloseing() {
|
||||||
|
return (this.Status.getValue() & HardStatus.Closeing.getValue()) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getIsRun() {
|
||||||
|
synchronized (this) {
|
||||||
|
boolean isConn = this.getIsConnection();
|
||||||
|
boolean isCloseing = this.getIsCloseing();
|
||||||
|
return isConn && !isCloseing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扫描失败等待下一次扫描的时间
|
||||||
|
*/
|
||||||
|
protected int getErrorTimeout() {
|
||||||
|
return ErrorTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setErrorTimeout(int value) {
|
||||||
|
ErrorTimeout = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扫描成功等待下一次扫描的时间
|
||||||
|
*/
|
||||||
|
protected int getSuccuessTimeout() {
|
||||||
|
return SuccuessTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setSuccuessTimeout(int value) {
|
||||||
|
SuccuessTimeout = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动连接硬件
|
||||||
|
*/
|
||||||
|
public boolean getAutoConnection() {
|
||||||
|
return AutoConnection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAutoConnection(boolean value) {
|
||||||
|
AutoConnection = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动重连硬件的时间
|
||||||
|
*/
|
||||||
|
protected int getAutoConnectionTimeout() {
|
||||||
|
return AutoConnectionTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setAutoConnectionTimeout(int value) {
|
||||||
|
AutoConnectionTimeout = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调试时用于获取内部数据的状态事件
|
||||||
|
*/
|
||||||
|
protected Event<DelegateDebug> OnDebug = new Event<DelegateDebug>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当触发异常时,执行该函数
|
||||||
|
*/
|
||||||
|
protected Event<DelegateError> OnError = new Event<DelegateError>();
|
||||||
|
|
||||||
|
// 常规事件
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当执行ScanOpen时会触发该事件
|
||||||
|
*/
|
||||||
|
protected Event<DelegateCommon> OnOpen = new Event<DelegateCommon>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当硬件连接上的时候会触发该事件
|
||||||
|
*/
|
||||||
|
protected Event<DelegateCommon> OnConnection = new Event<DelegateCommon>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当硬件连接断开时触发该事件
|
||||||
|
*/
|
||||||
|
protected Event<DelegateCommon> OnDisConnection = new Event<DelegateCommon>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当执行ScanClose时,确定关闭前会触发该事件
|
||||||
|
*/
|
||||||
|
protected Event<DelegateCommon> OnClosing = new Event<DelegateCommon>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当执行ScanClose时,完全关闭后会触发该事件
|
||||||
|
*/
|
||||||
|
protected Event<DelegateCommon> OnClosed = new Event<DelegateCommon>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当扫描到数据的时候会触发该事件
|
||||||
|
*/
|
||||||
|
protected Event<DelegateScan> OnRead = new Event<DelegateScan>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event<DelegateDebug> getOnDebug() {
|
||||||
|
return OnDebug;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event<DelegateError> getOnError() {
|
||||||
|
return OnError;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event<DelegateCommon> getOnOpen() {
|
||||||
|
return OnOpen;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event<DelegateCommon> getOnConnection() {
|
||||||
|
return OnConnection;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event<DelegateCommon> getOnDisConnection() {
|
||||||
|
return OnDisConnection;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event<DelegateCommon> getOnClosing() {
|
||||||
|
return OnClosing;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event<DelegateCommon> getClosed() {
|
||||||
|
return OnClosed;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event<DelegateScan> getOnRead() {
|
||||||
|
return OnRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void TriggerOnConnection() {
|
||||||
|
this.ExecuteEvent(this.OnConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void TriggerOnDisConnection() {
|
||||||
|
this.ExecuteEvent(this.OnDisConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void TriggerOnDebug(Object... arrs) {
|
||||||
|
this.ExecuteDebug(this.OnDebug, arrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void TriggerOnError(Exception ex) {
|
||||||
|
this.ExecuteEvent(this.OnError, ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final boolean TriggerOnRead(ScanData vData) throws InterruptedException {
|
||||||
|
return this.ExecuteEvent(this.OnRead, vData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 事件处理
|
||||||
|
* @方法名: ExecuteEvent
|
||||||
|
* @param common
|
||||||
|
* @返回类型 void
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-26下午1:59:10
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-26下午1:59:10
|
||||||
|
*/
|
||||||
|
private void ExecuteEvent(Event<DelegateCommon> common) {
|
||||||
|
try {
|
||||||
|
common.Exeucte(new DelegateCommonExecute());
|
||||||
|
} catch (Exception ex) {
|
||||||
|
this.ExecuteEvent(this.OnError, ex);
|
||||||
|
this.ExecuteDebug(this.OnDebug, ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 异常处理
|
||||||
|
* @方法名: ExecuteEvent
|
||||||
|
* @param common
|
||||||
|
* @param ex
|
||||||
|
* @返回类型 void
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-26下午2:00:00
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-26下午2:00:00
|
||||||
|
*/
|
||||||
|
private void ExecuteEvent(Event<DelegateError> common, Exception ex) {
|
||||||
|
try {
|
||||||
|
if (ex != null) {
|
||||||
|
common.Exeucte(new DelegateErrorExecute(ex));
|
||||||
|
}
|
||||||
|
} catch (Exception ex1) {
|
||||||
|
LogHelper.WriteLog(ex1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ExecuteDebug(Event<DelegateDebug> debug, Object... paras) {
|
||||||
|
try {
|
||||||
|
debug.Exeucte(new DelegateDebugExecute(paras));
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Date m_ReadDate = new Date();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 扫描到数据后触发的事件
|
||||||
|
* @方法名: ExecuteEvent
|
||||||
|
* @param common
|
||||||
|
* @param data
|
||||||
|
* @return
|
||||||
|
* @throws InterruptedException
|
||||||
|
* @返回类型 boolean
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-26下午2:00:36
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-26下午2:00:36
|
||||||
|
*/
|
||||||
|
private boolean ExecuteEvent(final Event<DelegateScan> common, final ScanData data) throws InterruptedException {
|
||||||
|
if (!this.getIsRun()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (data != null && common != null) {
|
||||||
|
ThreadHelper.RunThread(new ThreadDelegateCode() {
|
||||||
|
@Override
|
||||||
|
public void Execute() throws Exception {
|
||||||
|
HardScanBase that = HardScanBase.this;
|
||||||
|
try {
|
||||||
|
that.m_ReadDate = new Date();
|
||||||
|
common.Exeucte(new DelegateScanExecute(data));
|
||||||
|
} catch (Exception ex) {
|
||||||
|
that.ExecuteEvent(that.OnError, ex);
|
||||||
|
that.ExecuteDebug(that.OnDebug, ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final boolean Sleep(int vMillSecond) throws InterruptedException {
|
||||||
|
if (vMillSecond == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
LogDate dc = new LogDate();
|
||||||
|
dc.Clear();
|
||||||
|
do {
|
||||||
|
ThreadHelper.sleep(5);
|
||||||
|
if (!this.getIsRun()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
dc.Commit();
|
||||||
|
} while (dc.TotalSecond < vMillSecond);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Dispose() {
|
||||||
|
this.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Open() {
|
||||||
|
synchronized (this) {
|
||||||
|
if (!this.getIsOpen()) {
|
||||||
|
this.SetStatus(HardStatus.Open);
|
||||||
|
this.ExecuteEvent(this.OnOpen);
|
||||||
|
|
||||||
|
if (this.m_IsThread) {
|
||||||
|
|
||||||
|
if (this.m_Thread == null) {
|
||||||
|
this.m_Thread = ThreadHelper.RunThread(new ThreadDelegateCode() {
|
||||||
|
@Override
|
||||||
|
public void Execute() throws Exception {
|
||||||
|
HardScanBase.this.ScanStart();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.OpenPort();
|
||||||
|
if (!this.getIsConnection()) {
|
||||||
|
this.OpenAutoConnnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 打开设备
|
||||||
|
* @方法名: OpenPort
|
||||||
|
* @创建人:Administrator
|
||||||
|
* @创建时间:2016-5-26下午1:56:33
|
||||||
|
* @修改人:Administrator
|
||||||
|
* @修改时间:2016-5-26下午1:56:33
|
||||||
|
* @修改备注:
|
||||||
|
*/
|
||||||
|
protected boolean OpenPort() {
|
||||||
|
boolean isOpenHard = false;
|
||||||
|
if (this.getIsOpen() && !this.getIsConnection()) {
|
||||||
|
synchronized (m_Lock) {
|
||||||
|
try {
|
||||||
|
if (this.HandleLock(1)) {
|
||||||
|
isOpenHard = this.OpenHard();
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
this.TriggerOnError(ex);
|
||||||
|
} finally {
|
||||||
|
if (!isOpenHard) {
|
||||||
|
this.HandleLock(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isOpenHard) {
|
||||||
|
this.SetStatus(HardStatus.forValue(this.Status.getValue() | HardStatus.Connection.getValue()));
|
||||||
|
this.TriggerOnConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return isOpenHard;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 设备重连
|
||||||
|
* @方法名: OpenAutoConnnection
|
||||||
|
* @返回类型 void
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-26下午1:57:16
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-26下午1:57:16
|
||||||
|
*/
|
||||||
|
protected void OpenAutoConnnection() {
|
||||||
|
ThreadHelper.RunThread(new ThreadDelegateCode() {
|
||||||
|
@Override
|
||||||
|
public void Execute() throws Exception {
|
||||||
|
HardScanBase.this.Reconnection();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重新连接设备,直接打开或者关闭设备
|
||||||
|
*
|
||||||
|
* @throws InterruptedException
|
||||||
|
*/
|
||||||
|
private void Reconnection() throws InterruptedException {
|
||||||
|
do {
|
||||||
|
this.OpenPort();
|
||||||
|
if (this.getIsConnection() || !this.AutoConnection) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this.Sleep(this.AutoConnectionTimeout);
|
||||||
|
} while (this.getIsOpen() && !this.getIsCloseing());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始扫描
|
||||||
|
*
|
||||||
|
* @throws InterruptedException
|
||||||
|
*/
|
||||||
|
protected void ScanStart() throws InterruptedException {
|
||||||
|
this.Reconnection();
|
||||||
|
|
||||||
|
while (this.getIsRun()) {
|
||||||
|
try {
|
||||||
|
ScanData vData = this.ReadData();
|
||||||
|
boolean isRead = this.TriggerOnRead(vData);
|
||||||
|
if (!isRead) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
this.TriggerOnError(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.CloseExecute();
|
||||||
|
|
||||||
|
this.m_Thread = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭设备
|
||||||
|
*/
|
||||||
|
protected void CloseExecute() {
|
||||||
|
try {
|
||||||
|
this.ClosePort();
|
||||||
|
|
||||||
|
if (this.Status != HardStatus.Close) {
|
||||||
|
this.SetStatus(HardStatus.Close);
|
||||||
|
this.ExecuteEvent(this.OnClosed);
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
this.TriggerOnError(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 关闭设备端口
|
||||||
|
* @方法名: ClosePort
|
||||||
|
* @返回类型 void
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-26下午1:58:01
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-26下午1:58:01
|
||||||
|
*/
|
||||||
|
protected void ClosePort() {
|
||||||
|
if (this.getIsConnection()) {
|
||||||
|
this.SetStatus(HardStatus.forValue(this.Status.getValue() & (~HardStatus.Connection.getValue())));
|
||||||
|
|
||||||
|
synchronized (m_Lock) {
|
||||||
|
this.HandleLock(-1);
|
||||||
|
try {
|
||||||
|
this.CloseHard();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
this.TriggerOnError(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.TriggerOnDisConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Class<?> m_Type = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 触发设备锁
|
||||||
|
*
|
||||||
|
* @param vNum
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean HandleLock(int vNum) {
|
||||||
|
boolean vFlag = false;
|
||||||
|
if (this.m_Type == null) {
|
||||||
|
this.m_Type = this.getClass();
|
||||||
|
}
|
||||||
|
if (!m_OpenCount.containsKey(this.m_Type)) {
|
||||||
|
m_OpenCount.put(this.m_Type, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vNum < 0) {
|
||||||
|
if (m_OpenCount.get(this.m_Type) + vNum >= 0) {
|
||||||
|
vFlag = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (m_OpenCount.get(this.m_Type) == 0) {
|
||||||
|
vFlag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_OpenCount.put(this.m_Type, Math.max(0, m_OpenCount.get(this.m_Type) + vNum));
|
||||||
|
|
||||||
|
return vFlag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Close() {
|
||||||
|
synchronized (this) {
|
||||||
|
this.ExecuteEvent(this.OnClosing);
|
||||||
|
|
||||||
|
if (this.getIsOpen()) {
|
||||||
|
this.SetStatus(HardStatus.forValue((this.Status.getValue() | HardStatus.Closeing.getValue())));
|
||||||
|
if (!this.m_IsThread) {
|
||||||
|
this.CloseExecute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否通过线程启动
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected abstract boolean GetIsThread();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打开硬件
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
protected abstract boolean OpenHard() throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭硬件
|
||||||
|
*/
|
||||||
|
protected abstract boolean CloseHard() throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取数据
|
||||||
|
*
|
||||||
|
* @return 读取到数据
|
||||||
|
*/
|
||||||
|
protected abstract ScanData ReadData() throws Exception;
|
||||||
|
|
||||||
|
}
|
||||||
39
src/com/light/hard/scan/IHardScan.java
Normal file
39
src/com/light/hard/scan/IHardScan.java
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package com.light.hard.scan;
|
||||||
|
|
||||||
|
import com.light.hard.common.IHardBase;
|
||||||
|
import com.light.util.Event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扫描的实现接口
|
||||||
|
*
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface IHardScan extends IHardBase {
|
||||||
|
/**
|
||||||
|
* 打开之后自动连接
|
||||||
|
*/
|
||||||
|
boolean getAutoConnection();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置自动连接时间
|
||||||
|
*/
|
||||||
|
void setAutoConnection(boolean value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 码类型
|
||||||
|
*/
|
||||||
|
CodeType getReadType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置扫描类型,必须得支持
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
void setReadType(CodeType value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当扫描到数据的时候会触发该事件
|
||||||
|
*/
|
||||||
|
Event<DelegateScan> getOnRead();
|
||||||
|
}
|
||||||
28
src/com/light/hard/scan/IHardScanWrite.java
Normal file
28
src/com/light/hard/scan/IHardScanWrite.java
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package com.light.hard.scan;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扫描数据并写入数据的接口
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface IHardScanWrite extends IHardScan
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
是否允许写入数据
|
||||||
|
*/
|
||||||
|
boolean getIsWrite();
|
||||||
|
|
||||||
|
/**
|
||||||
|
写入数据
|
||||||
|
|
||||||
|
@param vData 需要写入的数据
|
||||||
|
*/
|
||||||
|
boolean Write(String vData);
|
||||||
|
|
||||||
|
/**
|
||||||
|
停止写入
|
||||||
|
|
||||||
|
@return 是否停止成功
|
||||||
|
*/
|
||||||
|
boolean StopWrite();
|
||||||
|
}
|
||||||
42
src/com/light/hard/scan/ScanData.java
Normal file
42
src/com/light/hard/scan/ScanData.java
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
package com.light.hard.scan;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @类描述: 扫描到的信息,如二维码、条码、IC卡卡号、身份证、磁卡
|
||||||
|
* @项目名称:ScanDemo
|
||||||
|
* @包名: piaost.client.hard
|
||||||
|
* @类名称:ScanData
|
||||||
|
* @创建人:Administrator
|
||||||
|
* @创建时间:2016-5-26下午2:15:08
|
||||||
|
*/
|
||||||
|
public class ScanData
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
是否已经处理
|
||||||
|
|
||||||
|
*/
|
||||||
|
public boolean IsHandle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
数据类型
|
||||||
|
|
||||||
|
*/
|
||||||
|
public CodeType ReadType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
卡号
|
||||||
|
|
||||||
|
*/
|
||||||
|
public String Content;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片信息
|
||||||
|
*/
|
||||||
|
public Object Bitmap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
扩展信息,如身份证的的其他信息
|
||||||
|
*/
|
||||||
|
public Object Extend;
|
||||||
|
}
|
||||||
435
src/com/light/util/ByteConvertHelper.java
Normal file
435
src/com/light/util/ByteConvertHelper.java
Normal file
@@ -0,0 +1,435 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通信格式转换
|
||||||
|
*
|
||||||
|
* Java和一些windows编程语言如c、c++、delphi所写的网络程序进行通讯时,需要进行相应的转换 高、低字节之间的转换
|
||||||
|
* windows的字节序为低字节开头 linux,unix的字节序为高字节开头 java则无论平台变化,都是高字节开头
|
||||||
|
*/
|
||||||
|
public class ByteConvertHelper {
|
||||||
|
|
||||||
|
public static byte[] toLH(long n, int max) {
|
||||||
|
byte[] b = new byte[max];
|
||||||
|
for (int i = 0; i < max; i++) {
|
||||||
|
int offset = i * 8;
|
||||||
|
b[i] = (byte) (n >> offset & 0xff);
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] toHH(long n, int max) {
|
||||||
|
byte[] b = new byte[max];
|
||||||
|
for (int i = 0; i < max; i++) {
|
||||||
|
int offset = (max - 1 - i) * 8;
|
||||||
|
b[i] = (byte) (n >> offset & 0xff);
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] toLH(long n) {
|
||||||
|
return toLH(n, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] toHH(long n) {
|
||||||
|
return toHH(n, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将int转为低字节在前,高字节在后的byte数组
|
||||||
|
*
|
||||||
|
* @param n
|
||||||
|
* int
|
||||||
|
* @return byte[]
|
||||||
|
*/
|
||||||
|
public static byte[] toLH(int n) {
|
||||||
|
return toLH(n, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将int转为高字节在前,低字节在后的byte数组
|
||||||
|
*
|
||||||
|
* @param n
|
||||||
|
* int
|
||||||
|
* @return byte[]
|
||||||
|
*/
|
||||||
|
public static byte[] toHH(int n) {
|
||||||
|
return toHH(n, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将short转为低字节在前,高字节在后的byte数组
|
||||||
|
*
|
||||||
|
* @param n
|
||||||
|
* short
|
||||||
|
* @return byte[]
|
||||||
|
*/
|
||||||
|
public static byte[] toLH(short n) {
|
||||||
|
return toLH(n, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将short转为高字节在前,低字节在后的byte数组
|
||||||
|
*
|
||||||
|
* @param n
|
||||||
|
* short
|
||||||
|
* @return byte[]
|
||||||
|
*/
|
||||||
|
public static byte[] toHH(short n) {
|
||||||
|
return toHH(n, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将float转为低字节在前,高字节在后的byte数组
|
||||||
|
*/
|
||||||
|
public static byte[] toLH(float f) {
|
||||||
|
return toLH(Float.floatToRawIntBits(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将float转为高字节在前,低字节在后的byte数组
|
||||||
|
*/
|
||||||
|
public static byte[] toHH(float f) {
|
||||||
|
return toHH(Float.floatToRawIntBits(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将低字节转换为长整形
|
||||||
|
*
|
||||||
|
* @param bytes
|
||||||
|
* 字节
|
||||||
|
* @param off
|
||||||
|
* 开始位置
|
||||||
|
* @param max
|
||||||
|
* 最大位置
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static long lBytesToLong(byte[] bytes, int off, int max) {
|
||||||
|
long ret = 0;
|
||||||
|
for (int i = 0; i < max; i++) {
|
||||||
|
int b = bytes[off + i] & 0xFF;
|
||||||
|
int offset = i * 8;
|
||||||
|
ret |= (b << offset);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将高字节转换为长整型
|
||||||
|
*
|
||||||
|
* @param bytes
|
||||||
|
* 字节
|
||||||
|
* @param off
|
||||||
|
* 开始位置
|
||||||
|
* @param max
|
||||||
|
* 最大位置
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static long hBytesToLong(byte[] bytes, int off, int max) {
|
||||||
|
long ret = 0;
|
||||||
|
for (int i = 0; i < max; i++) {
|
||||||
|
int b = bytes[off + i] & 0xFF;
|
||||||
|
int offset = (max - 1 - i) * 8;
|
||||||
|
ret |= (b << offset);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将高字节数组转换为long
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static long hBytesToLong(byte[] b) {
|
||||||
|
return hBytesToLong(b, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将高字节数组转换为long
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* byte[]
|
||||||
|
* @param offset
|
||||||
|
* long
|
||||||
|
* @return long
|
||||||
|
*/
|
||||||
|
public static long hBytesToLong(byte[] b, int off) {
|
||||||
|
return hBytesToLong(b, off, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将低字节数组转换为long
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* byte[]
|
||||||
|
* @return long
|
||||||
|
*/
|
||||||
|
public static long lBytesToLong(byte[] b) {
|
||||||
|
return lBytesToLong(b, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将低字节数组转换为long
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* @param off
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static long lBytesToLong(byte[] b, int off) {
|
||||||
|
return lBytesToLong(b, off, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将高字节数组转换为int
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static int hBytesToInt(byte[] b) {
|
||||||
|
return hBytesToInt(b, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将高字节数组转换为int
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* byte[]
|
||||||
|
* @param offset
|
||||||
|
* int
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public static int hBytesToInt(byte[] b, int off) {
|
||||||
|
return (int) hBytesToLong(b, off, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将低字节数组转换为int
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* byte[]
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public static int lBytesToInt(byte[] b) {
|
||||||
|
return lBytesToInt(b, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将低字节数组转换为int
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* @param off
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static int lBytesToInt(byte[] b, int off) {
|
||||||
|
return (int) lBytesToLong(b, off, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高字节数组到short的转换
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* @param off
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static short hBytesToShort(byte[] b) {
|
||||||
|
return hBytesToShort(b, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高字节数组到short的转换
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* @param off
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static short hBytesToShort(byte[] b, int off) {
|
||||||
|
return (short) hBytesToLong(b, off, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 低字节数组到short的转换
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* @param off
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static short lBytesToShort(byte[] b) {
|
||||||
|
return lBytesToShort(b, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 低字节数组到short的转换
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* @param off
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static short lBytesToShort(byte[] b, int off) {
|
||||||
|
return (short) lBytesToLong(b, off, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高字节数组转换为float
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* byte[]
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public static float hBytesToFloat(byte[] b) {
|
||||||
|
int i = hBytesToInt(b);
|
||||||
|
return Float.intBitsToFloat(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 低字节数组转换为float
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* byte[]
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public static float lBytesToFloat(byte[] b) {
|
||||||
|
int i = lBytesToInt(b);
|
||||||
|
return Float.intBitsToFloat(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将byte数组中的元素倒序排列
|
||||||
|
*/
|
||||||
|
public static byte[] bytesReverseOrder(byte[] b) {
|
||||||
|
int length = b.length;
|
||||||
|
byte[] result = new byte[length];
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
result[length - i - 1] = b[i];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将int类型的值转换为字节序颠倒过来对应的int值
|
||||||
|
*
|
||||||
|
* @param i
|
||||||
|
* int
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public static int reverseInt(int i) {
|
||||||
|
int result = hBytesToInt(toLH(i));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将short类型的值转换为字节序颠倒过来对应的short值
|
||||||
|
*
|
||||||
|
* @param s
|
||||||
|
* short
|
||||||
|
* @return short
|
||||||
|
*/
|
||||||
|
public static short reverseShort(short s) {
|
||||||
|
short result = hBytesToShort(toLH(s));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] GetBytes(short value) {
|
||||||
|
return toHH(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] GetBytes(int value) {
|
||||||
|
return toHH(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] GetBytes(long value) {
|
||||||
|
return toHH(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将float类型的值转换为字节序颠倒过来对应的float值
|
||||||
|
*
|
||||||
|
* @param f
|
||||||
|
* float
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public static float reverseFloat(float f) {
|
||||||
|
float result = hBytesToFloat(toLH(f));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static short HostToNetworkOrder(short vFrom) {
|
||||||
|
return hBytesToShort(toLH(vFrom));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int HostToNetworkOrder(int vFrom) {
|
||||||
|
return hBytesToInt(toLH(vFrom));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long HostToNetworkOrder(long vFrom) {
|
||||||
|
return hBytesToLong(toLH(vFrom));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static short NetworkToHostOrder(short vFrom) {
|
||||||
|
return lBytesToShort(toHH(vFrom));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int NetworkToHostOrder(int vFrom) {
|
||||||
|
return lBytesToInt(toHH(vFrom));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long NetworkToHostOrder(long vFrom) {
|
||||||
|
return lBytesToLong(toHH(vFrom));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将String转为byte数组
|
||||||
|
*/
|
||||||
|
public static byte[] stringToBytes(String s, int length) {
|
||||||
|
while (s.getBytes().length < length) {
|
||||||
|
s += " ";
|
||||||
|
}
|
||||||
|
return s.getBytes();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字节数组转换为String
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* byte[]
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public static String bytesToString(byte[] b) {
|
||||||
|
StringBuffer result = new StringBuffer("");
|
||||||
|
int length = b.length;
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
result.append((char) (b[i] & 0xff));
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串转换为byte数组
|
||||||
|
*
|
||||||
|
* @param s
|
||||||
|
* String
|
||||||
|
* @return byte[]
|
||||||
|
*/
|
||||||
|
public static byte[] stringToBytes(String s) {
|
||||||
|
return s.getBytes();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打印byte数组
|
||||||
|
*/
|
||||||
|
public static void printBytes(byte[] bb) {
|
||||||
|
int length = bb.length;
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
System.out.print(bb + " ");
|
||||||
|
}
|
||||||
|
System.out.println("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void logBytes(byte[] bb) {
|
||||||
|
int length = bb.length;
|
||||||
|
String out = "";
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
out = out + bb + " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
6
src/com/light/util/DelegateCode.java
Normal file
6
src/com/light/util/DelegateCode.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
public interface DelegateCode
|
||||||
|
{
|
||||||
|
void Execute() throws Exception;
|
||||||
|
}
|
||||||
10
src/com/light/util/DelegateCodeExecute.java
Normal file
10
src/com/light/util/DelegateCodeExecute.java
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
public class DelegateCodeExecute implements IEventExecute<DelegateCode>
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void Execute(DelegateCode t) throws Exception
|
||||||
|
{
|
||||||
|
t.Execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
17
src/com/light/util/DelegateNow.java
Normal file
17
src/com/light/util/DelegateNow.java
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前时间的接口,有些设备不支持直接获取当前时间,需要调用API接口
|
||||||
|
*
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface DelegateNow {
|
||||||
|
/**
|
||||||
|
* 返回当前时间
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Date Execute();
|
||||||
|
}
|
||||||
5
src/com/light/util/DelegateString.java
Normal file
5
src/com/light/util/DelegateString.java
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
public interface DelegateString {
|
||||||
|
void Execute(String str) throws Exception;
|
||||||
|
}
|
||||||
5
src/com/light/util/DelegateWriteLog.java
Normal file
5
src/com/light/util/DelegateWriteLog.java
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
public interface DelegateWriteLog{
|
||||||
|
void Execute(String vMsg) throws Exception;
|
||||||
|
}
|
||||||
38
src/com/light/util/DesHelper.java
Normal file
38
src/com/light/util/DesHelper.java
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.security.Key;
|
||||||
|
import java.security.spec.AlgorithmParameterSpec;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.SecretKeyFactory;
|
||||||
|
import javax.crypto.spec.DESKeySpec;
|
||||||
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
|
|
||||||
|
import com.sun.org.apache.xml.internal.security.utils.Base64;
|
||||||
|
|
||||||
|
public class DesHelper {
|
||||||
|
|
||||||
|
public static String encode(byte[] siv, String data, String skey)
|
||||||
|
throws Exception {
|
||||||
|
DESKeySpec keySpec = new DESKeySpec(skey.getBytes());// 设置密钥参数
|
||||||
|
AlgorithmParameterSpec iv = new IvParameterSpec(siv);// 设置向量 , 加密算法的参数接口,IvParameterSpec是它的一个实现
|
||||||
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 获得密钥工厂
|
||||||
|
Key key = keyFactory.generateSecret(keySpec);// 得到密钥对象
|
||||||
|
Cipher enCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");// 得到加密对象Cipher
|
||||||
|
enCipher.init(Cipher.ENCRYPT_MODE, key, iv);// 设置工作模式为加密模式,给出密钥和向量
|
||||||
|
byte[] pasByte = enCipher.doFinal(data.getBytes("utf-8"));
|
||||||
|
return Base64.encode(pasByte);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String decode(byte[] siv, String data, String skey)
|
||||||
|
throws Exception {
|
||||||
|
DESKeySpec keySpec = new DESKeySpec(skey.getBytes());// 设置密钥参数
|
||||||
|
AlgorithmParameterSpec iv = new IvParameterSpec(siv);// 设置向量, 加密算法的参数接口,IvParameterSpec是它的一个实现
|
||||||
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 获得密钥工厂
|
||||||
|
Key key = keyFactory.generateSecret(keySpec);// 得到密钥对象
|
||||||
|
Cipher deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
|
||||||
|
deCipher.init(Cipher.DECRYPT_MODE, key, iv);
|
||||||
|
byte[] pasByte = deCipher.doFinal(Base64.decode(data));
|
||||||
|
return new String(pasByte, "UTF-8");
|
||||||
|
}
|
||||||
|
}
|
||||||
40
src/com/light/util/DictionaryHelper.java
Normal file
40
src/com/light/util/DictionaryHelper.java
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.node.*;
|
||||||
|
|
||||||
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||||
|
public class DictionaryHelper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 将对象转map
|
||||||
|
* @方法名: ConvertDictionary
|
||||||
|
* @param item
|
||||||
|
* @return
|
||||||
|
* @返回类型 HashMap
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午6:41:36
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午6:41:36
|
||||||
|
*/
|
||||||
|
public static HashMap ConvertDictionary(Object item) {
|
||||||
|
HashMap data = null;
|
||||||
|
if (item instanceof HashMap) {
|
||||||
|
data = (HashMap) item;
|
||||||
|
} else if (data == null && item instanceof ObjectNode) {
|
||||||
|
data = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
ObjectNode jObject = (ObjectNode) item;
|
||||||
|
|
||||||
|
Iterator<String> keys = jObject.fieldNames();
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
String fieldName = keys.next();
|
||||||
|
data.put(fieldName, jObject.get(fieldName).textValue());
|
||||||
|
}
|
||||||
|
} else if (data == null) {
|
||||||
|
data = new HashMap<String, Object>();
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
72
src/com/light/util/EnumHelper.java
Normal file
72
src/com/light/util/EnumHelper.java
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class EnumHelper {
|
||||||
|
|
||||||
|
public static <T extends Enum<T>> T ConvertEnum(String vStr, T vDefault) {
|
||||||
|
Class<T> vType = (Class<T>) vDefault.getClass();
|
||||||
|
T result = vDefault;
|
||||||
|
try {
|
||||||
|
if (!StringHelper.IsEmpty(vStr)) {
|
||||||
|
result = Enum.valueOf(vType, vStr);
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex, vStr);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T ConvertEnum(Class<T> vType, String vStr) {
|
||||||
|
return ConvertEnum(vType, vStr, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T> T ConvertEnum(Class<T> vType, String vStr, T vDefault) {
|
||||||
|
T result = vDefault;
|
||||||
|
try {
|
||||||
|
if (StringHelper.isInteger(vStr)) {
|
||||||
|
result = ConvertEnum(vType, StringHelper.GetInt(vStr));
|
||||||
|
} else if (!StringHelper.IsEmpty(vStr)) {
|
||||||
|
result = (T) Enum.valueOf((Class) vType, vStr);
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex, vStr);
|
||||||
|
}
|
||||||
|
if (result == null && vDefault == null) {
|
||||||
|
result = ConvertEnum(vType, 0);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HashMap<Class, Method> CacheMethod = new HashMap<Class, Method>();
|
||||||
|
|
||||||
|
public static <T> T ConvertEnum(Class<T> vType, int i) {
|
||||||
|
T result = null;
|
||||||
|
try {
|
||||||
|
if (CacheMethod.containsKey(vType)) {
|
||||||
|
Method met = CacheMethod.get(vType);
|
||||||
|
result = (T) met.invoke(null, i);
|
||||||
|
} else {
|
||||||
|
Method[] vMets = vType.getMethods();
|
||||||
|
for (Method vMet : vMets) {
|
||||||
|
String vName = vMet.getName();
|
||||||
|
if (vName.equals("forValue")
|
||||||
|
&& vMet.getParameterTypes().length == 1) {
|
||||||
|
Class vTempType = vMet.getParameterTypes()[0];
|
||||||
|
Object obj = vMet.invoke(null, i);
|
||||||
|
result = (T) obj;
|
||||||
|
CacheMethod.put(vType, vMet);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex, "0");
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
59
src/com/light/util/Event.java
Normal file
59
src/com/light/util/Event.java
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
/**
|
||||||
|
* @绫绘弿杩帮細浜嬩欢瀵硅薄闆嗕腑澶勭悊浠ュ強浜嬩欢鐨勭Щ闄や笌娣诲姞
|
||||||
|
* @椤圭洰鍚嶇О锛歋canDemo
|
||||||
|
* @鍖呭悕锛<E68295> piaost.base
|
||||||
|
* @绫诲悕绉帮細Event
|
||||||
|
* @鍒涘缓浜猴細Administrator
|
||||||
|
* @鍒涘缓鏃堕棿锛<E6A3BF>2016-5-25涓嬪崍4:18:02
|
||||||
|
*/
|
||||||
|
public class Event<T>
|
||||||
|
{
|
||||||
|
private List<T> m_List = new ArrayList<T>();
|
||||||
|
|
||||||
|
public void Add(T t)
|
||||||
|
{
|
||||||
|
if (t != null)
|
||||||
|
{
|
||||||
|
m_List.add(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public <M extends IEventExecute<T>> void Exeucte(M m) throws Exception
|
||||||
|
{
|
||||||
|
for (T item : m_List)
|
||||||
|
{
|
||||||
|
m.Execute(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean Remove(T t)
|
||||||
|
{
|
||||||
|
if (t != null)
|
||||||
|
{
|
||||||
|
return m_List.remove(t);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
m_List.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean Contants(T t)
|
||||||
|
{
|
||||||
|
if (t != null)
|
||||||
|
{
|
||||||
|
return m_List.contains(t);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int size()
|
||||||
|
{
|
||||||
|
return m_List.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
307
src/com/light/util/FileHelper.java
Normal file
307
src/com/light/util/FileHelper.java
Normal file
@@ -0,0 +1,307 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class FileHelper {
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
m_BasePath = getApplicatoinPath();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String m_BasePath;
|
||||||
|
|
||||||
|
public static String GetBasePath() {
|
||||||
|
return m_BasePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetBasePath(String path) {
|
||||||
|
m_BasePath = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File[] getFiles(String path) {
|
||||||
|
File root = new File(path);
|
||||||
|
if (root.exists()) {
|
||||||
|
return root.listFiles();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件删除
|
||||||
|
*
|
||||||
|
* @param day1
|
||||||
|
* @param day3
|
||||||
|
* @param size
|
||||||
|
* @param path
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static void deleteFile(long day1, long day3, long size, String path) throws Exception {
|
||||||
|
File[] files = getFiles(path);
|
||||||
|
if (files == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (File file : files) {
|
||||||
|
if (file.isDirectory()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (System.currentTimeMillis() - new SimpleDateFormat("yyyyMMdd").parse(file.getName().replaceAll("[.][^.]*$", "")).getTime() > day3) {
|
||||||
|
file.delete();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (file.length() > size) {
|
||||||
|
file.delete();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 递归删除文件和文件夹
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* 要删除的根目录
|
||||||
|
*/
|
||||||
|
public static void deleteFile(File file) {
|
||||||
|
if (!file.exists()) {
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (file.isFile()) {
|
||||||
|
if (System.currentTimeMillis() - file.lastModified() > 2 * 24 * 60 * 60 * 1000) {
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (file.isDirectory()) {
|
||||||
|
File[] childFile = file.listFiles();
|
||||||
|
if (childFile == null || childFile.length == 0) {
|
||||||
|
file.delete();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (File f : childFile) {
|
||||||
|
deleteFile(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String combine(String path1, String path2) {
|
||||||
|
File file1 = new File(path1);
|
||||||
|
File file2 = new File(file1, path2);
|
||||||
|
return file2.getPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUrl(String url) throws Exception {
|
||||||
|
if (url.startsWith("~")) {
|
||||||
|
url = StringHelper.trimStart(url, '\\', '/', '~');
|
||||||
|
try {
|
||||||
|
url = getApplicatoinPath() + "//" + url;
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
url = url.replace('\\', '/');
|
||||||
|
if (url.indexOf(":") == -1) {
|
||||||
|
url = combine(getApplicatoinPath(), url);
|
||||||
|
}
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUrl(String url, String defUrl) throws Exception {
|
||||||
|
if (StringHelper.IsEmpty(url)) {
|
||||||
|
url = defUrl;
|
||||||
|
}
|
||||||
|
return getUrl(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
// / <summary>
|
||||||
|
// / 程序运行起始路径
|
||||||
|
// / </summary>
|
||||||
|
public static String getApplicatoinPath() throws Exception {
|
||||||
|
File directory = new File(".");
|
||||||
|
String vPath = directory.getCanonicalPath();
|
||||||
|
return vPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Write(String vPath, String vName, HashMap<String, Object> vDic) throws Exception {
|
||||||
|
if (StringHelper.IsEmpty(vName)) {
|
||||||
|
vName = String.format(" {0:yyyy-MM-dd HH-mm-ss-ffff}.js", new Date());
|
||||||
|
}
|
||||||
|
String filePath = FileHelper.GetFilePath(vPath, vName);
|
||||||
|
|
||||||
|
String vJson = JSONHelper.SerializeObject(vDic);
|
||||||
|
WriteText(filePath, vJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HashMap<String, Object> Read(String vPath, String vName) throws Exception {
|
||||||
|
String filePath = FileHelper.GetFilePath(vPath, vName);
|
||||||
|
String json = ReadText(filePath);
|
||||||
|
HashMap<String, Object> result = null;
|
||||||
|
try {
|
||||||
|
result = JSONHelper.DeserializeObject(json, HashMap.class);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
throw new Exception("文件" + filePath + "格式不正确!");
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] ReadList(String vPath) {
|
||||||
|
File file = new File(vPath);
|
||||||
|
if (file.exists()) {
|
||||||
|
return new String[0];
|
||||||
|
}
|
||||||
|
List<String> list = new ArrayList<String>();
|
||||||
|
File[] array = file.listFiles();
|
||||||
|
for (int i = 0; i < array.length; i++) {
|
||||||
|
File fileInfo = array[i];
|
||||||
|
list.add(fileInfo.getName());
|
||||||
|
}
|
||||||
|
return (String[]) list.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Clear(String vPath) {
|
||||||
|
String[] array = FileHelper.ReadList(vPath);
|
||||||
|
String[] array2 = array;
|
||||||
|
for (int i = 0; i < array2.length; i++) {
|
||||||
|
String vName = array2[i];
|
||||||
|
Delete(vPath, vName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Delete(String vPath, String vName) {
|
||||||
|
String filePath = FileHelper.GetFilePath(vPath, vName);
|
||||||
|
Delete(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Delete(String path) {
|
||||||
|
try {
|
||||||
|
File file = new File(path);
|
||||||
|
if (file.exists()) {
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetFilePath(String vPath, String vName) {
|
||||||
|
vPath = vPath.replace("/", "\\");
|
||||||
|
if (!vPath.endsWith("\\")) {
|
||||||
|
vPath += "\\";
|
||||||
|
}
|
||||||
|
return vPath + vName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetPath(String vFrontPath, String vPath) {
|
||||||
|
String separator = "[\\/\\\\]";
|
||||||
|
String[] array = vFrontPath.split(separator);
|
||||||
|
String[] array2 = vPath.split(separator);
|
||||||
|
List<String> list = new ArrayList<String>();
|
||||||
|
String[] array3 = array;
|
||||||
|
for (int i = 0; i < array3.length; i++) {
|
||||||
|
String vStr = array3[i];
|
||||||
|
FileHelper.HandlePath(list, vStr);
|
||||||
|
}
|
||||||
|
if (!vFrontPath.endsWith("/") && !vFrontPath.endsWith("\\")) {
|
||||||
|
list.remove(list.size() - 1);
|
||||||
|
}
|
||||||
|
String[] array4 = array2;
|
||||||
|
for (int j = 0; j < array4.length; j++) {
|
||||||
|
String vStr2 = array4[j];
|
||||||
|
FileHelper.HandlePath(list, vStr2);
|
||||||
|
}
|
||||||
|
String[] vStrs = (String[]) list.toArray();
|
||||||
|
return StringHelper.join("/", vStrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void HandlePath(List<String> vList, String vStr) {
|
||||||
|
String text = vStr.trim();
|
||||||
|
if (text == ".") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (text == "..") {
|
||||||
|
vList.remove(vList.size() - 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
vList.add(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String ReadText(String path) throws Exception {
|
||||||
|
File file = new File(path);
|
||||||
|
if (!file.exists()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
BufferedReader br = null;
|
||||||
|
try {
|
||||||
|
br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8"));// 构造一个BufferedReader类来读取文件
|
||||||
|
String s = null;
|
||||||
|
while ((s = br.readLine()) != null) { // 使用readLine方法,一次读一行
|
||||||
|
// sb.append("\n");
|
||||||
|
sb.append(s);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (br != null) {
|
||||||
|
br.close();
|
||||||
|
br = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteText(String path, String vText) throws Exception {
|
||||||
|
|
||||||
|
File file = new File(path);
|
||||||
|
if (!file.exists()) {
|
||||||
|
File f = file.getParentFile();
|
||||||
|
if (f.mkdir() || f.mkdirs()) {
|
||||||
|
file.createNewFile();
|
||||||
|
} else
|
||||||
|
file.createNewFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
FileOutputStream fos = null;
|
||||||
|
try {
|
||||||
|
fos = new FileOutputStream(path, false);
|
||||||
|
fos.write(vText.getBytes("utf-8"));
|
||||||
|
} finally {
|
||||||
|
if (fos != null) {
|
||||||
|
fos.close();
|
||||||
|
fos = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean IsFileInUse(String fileName) {
|
||||||
|
boolean inUse = true;
|
||||||
|
FileInputStream fs = null;
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
fs = new FileInputStream(fileName);
|
||||||
|
inUse = false;
|
||||||
|
} catch (Exception ex) {
|
||||||
|
inUse = true;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (fs != null)
|
||||||
|
try {
|
||||||
|
fs.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
LogHelper.WriteLog(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return inUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean Exists(String vPath) {
|
||||||
|
File vFile = new File(vPath);
|
||||||
|
return vFile.exists();
|
||||||
|
}
|
||||||
|
}
|
||||||
16
src/com/light/util/IEventExecute.java
Normal file
16
src/com/light/util/IEventExecute.java
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行的时候得事件处理类
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
* @param <T> 接口
|
||||||
|
*/
|
||||||
|
public interface IEventExecute<T> {
|
||||||
|
/**
|
||||||
|
* 事件的执行主体
|
||||||
|
* @param t 接口
|
||||||
|
* @throws Exception 异常错误
|
||||||
|
*/
|
||||||
|
void Execute(T t) throws Exception;
|
||||||
|
}
|
||||||
47
src/com/light/util/JSONHelper.java
Normal file
47
src/com/light/util/JSONHelper.java
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.*;
|
||||||
|
|
||||||
|
public class JSONHelper
|
||||||
|
{
|
||||||
|
private static ObjectMapper mapper = new ObjectMapper();
|
||||||
|
static
|
||||||
|
{
|
||||||
|
mapper.setPropertyNamingStrategy(new MyNameStrategy());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取泛型的Collection Type
|
||||||
|
*
|
||||||
|
* @param collectionClass
|
||||||
|
* 泛型的Collection
|
||||||
|
* @param elementClasses
|
||||||
|
* 元素类
|
||||||
|
* @return JavaType Java类型
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses)
|
||||||
|
{
|
||||||
|
return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T DeserializeObject(String value, Class<T> type) throws Exception
|
||||||
|
{
|
||||||
|
return mapper.readValue(value, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T DeserializeObject(String vJson, JavaType type) throws Exception
|
||||||
|
{
|
||||||
|
return (T) mapper.readValue(vJson, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String SerializeObject(Object value) throws Exception
|
||||||
|
{
|
||||||
|
return mapper.writeValueAsString(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String SerializeObject(Object value, boolean isLine) throws Exception
|
||||||
|
{
|
||||||
|
return mapper.writeValueAsString(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
115
src/com/light/util/LogDate.java
Normal file
115
src/com/light/util/LogDate.java
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日志追踪器
|
||||||
|
*
|
||||||
|
* @author Light
|
||||||
|
*/
|
||||||
|
public class LogDate {
|
||||||
|
public static DelegateNow GetNow = null;
|
||||||
|
public static int MinMillSecond = 1;
|
||||||
|
|
||||||
|
static {
|
||||||
|
GetNow = new DelegateNow() {
|
||||||
|
@Override
|
||||||
|
public Date Execute() {
|
||||||
|
return new Date();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public LogDate() {
|
||||||
|
this("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public LogDate(String vTitle) {
|
||||||
|
this.Clear();
|
||||||
|
|
||||||
|
if (!StringHelper.IsEmpty(vTitle)) {
|
||||||
|
this.Begin(vTitle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringBuilder Log = null;
|
||||||
|
private Date Start = new Date();
|
||||||
|
private Date End = new Date();
|
||||||
|
public double LastSecond = 0;
|
||||||
|
public double TotalSecond = 0;
|
||||||
|
public int Level = 1;
|
||||||
|
|
||||||
|
public int getLevel() {
|
||||||
|
return Level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLevel(int level) {
|
||||||
|
Level = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringBuilder getLog() {
|
||||||
|
return Log;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getStart() {
|
||||||
|
return Start;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getEnd() {
|
||||||
|
return End;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getLastSecond() {
|
||||||
|
return LastSecond;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getTotalSecond() {
|
||||||
|
return TotalSecond;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Begin() {
|
||||||
|
this.Start = GetNow.Execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Begin(String vTitle) {
|
||||||
|
this.Begin();
|
||||||
|
this.Log.append(vTitle);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Commit() {
|
||||||
|
this.End = GetNow.Execute();
|
||||||
|
double vTotal = this.End.getTime() - this.Start.getTime();
|
||||||
|
this.LastSecond = vTotal - this.TotalSecond;
|
||||||
|
this.TotalSecond = vTotal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Commit(String vTag, Object... args) {
|
||||||
|
this.Commit();
|
||||||
|
if (!StringHelper.isNullOrEmpty(vTag)) {
|
||||||
|
String vLog = String.format("\r\n%s: %f ms 总共: %f ms ", String.format(vTag, args), this.LastSecond, this.TotalSecond);
|
||||||
|
this.Log.append(vLog);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear() {
|
||||||
|
this.Start = GetNow.Execute();
|
||||||
|
this.End = GetNow.Execute();
|
||||||
|
this.LastSecond = 0;
|
||||||
|
this.TotalSecond = 0;
|
||||||
|
this.Log = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteLog() {
|
||||||
|
// 执行时间为0的不显示日志
|
||||||
|
if (this.TotalSecond >= MinMillSecond) {
|
||||||
|
String vLog = this.Log.toString();
|
||||||
|
if (!StringHelper.IsEmpty(vLog)) {
|
||||||
|
if (this.Level > 0) {
|
||||||
|
this.Level = LogHelper.LogLevel.Big.getValue();
|
||||||
|
}
|
||||||
|
LogHelper.WriteLog(this.Start, this.Level, vLog);
|
||||||
|
}
|
||||||
|
this.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
275
src/com/light/util/LogHelper.java
Normal file
275
src/com/light/util/LogHelper.java
Normal file
@@ -0,0 +1,275 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
public class LogHelper {
|
||||||
|
public enum LogLevel {
|
||||||
|
None(0), Common(1), BigCommon(2), Exception(3), Big(99);
|
||||||
|
|
||||||
|
private int Value;
|
||||||
|
private static HashMap<Integer, LogLevel> mappings;
|
||||||
|
|
||||||
|
private synchronized static HashMap<Integer, LogLevel> getMappings() {
|
||||||
|
if (mappings == null) {
|
||||||
|
mappings = new HashMap<Integer, LogLevel>();
|
||||||
|
}
|
||||||
|
return mappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
private LogLevel(int value) {
|
||||||
|
Value = value;
|
||||||
|
LogLevel.getMappings().put(value, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LogLevel forValue(int value) {
|
||||||
|
return getMappings().get(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static DelegateWriteLog OnWriteLog;
|
||||||
|
|
||||||
|
public static DelegateWriteLog getOnWriteLog() {
|
||||||
|
return OnWriteLog;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setOnWriteLog(DelegateWriteLog value) {
|
||||||
|
OnWriteLog = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int Level;
|
||||||
|
|
||||||
|
public static int getLevel() {
|
||||||
|
return Level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setLevel(int value) {
|
||||||
|
Level = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean IsConsole;
|
||||||
|
|
||||||
|
public static boolean getIsConsole() {
|
||||||
|
return IsConsole;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setIsConsole(boolean value) {
|
||||||
|
IsConsole = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean IsFile;
|
||||||
|
|
||||||
|
public static boolean getIsFile() {
|
||||||
|
return IsFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setIsFile(boolean value) {
|
||||||
|
IsFile = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LinkedList<LogInfo> m_Log = new LinkedList<LogInfo>();
|
||||||
|
|
||||||
|
private static class LogInfo {
|
||||||
|
public Date Now = new Date();
|
||||||
|
public int Count;
|
||||||
|
public String Message;
|
||||||
|
public Exception Exception;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public LogInfo(Date dateTime, Exception ex) {
|
||||||
|
this(dateTime, ex, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public LogInfo(Date dateTime, String vMsg) {
|
||||||
|
this(dateTime, null, vMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public LogInfo(Date dateTime, Exception ex, String vMsg) {
|
||||||
|
this.Now = dateTime;
|
||||||
|
this.Exception = ex;
|
||||||
|
this.Message = vMsg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
setLevel(2);
|
||||||
|
setIsConsole(false);
|
||||||
|
setIsFile(true);
|
||||||
|
StartLog();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void StartLog() {
|
||||||
|
RunInterval ri = new RunInterval();
|
||||||
|
ri.setTime(100);
|
||||||
|
ri.setCode(new ThreadDelegateCode() {
|
||||||
|
@Override
|
||||||
|
public void Execute() throws Exception {
|
||||||
|
WriteFile();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ThreadHelper.RunThread(ri);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HashMap<String, LogInfo> m_CacheException = new HashMap<String, LogHelper.LogInfo>();
|
||||||
|
|
||||||
|
private static void WriteFile() throws Exception {
|
||||||
|
LinkedList<LogInfo> vQueue = m_Log;
|
||||||
|
|
||||||
|
if (vQueue.size() < 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String vPath = FileHelper.GetBasePath() + "/Temp/Log/";
|
||||||
|
String vUrl = FileHelper.getUrl(vPath, vPath);
|
||||||
|
/*** 有问题 **/
|
||||||
|
StreamWriter sw = null;
|
||||||
|
/*** 有问题 **/
|
||||||
|
|
||||||
|
// 当需要将日志写入文件时,打开文件流
|
||||||
|
if (getIsFile()) {
|
||||||
|
try {
|
||||||
|
Date vNow = new Date();
|
||||||
|
|
||||||
|
String vFile = String.format("%s/%s.log", vUrl, new SimpleDateFormat("yyyyMMdd").format(vNow));
|
||||||
|
File file = new File(vFile);
|
||||||
|
// String vDic = file.getParent();
|
||||||
|
if (!file.exists()) {
|
||||||
|
File f = file.getParentFile();
|
||||||
|
if (f.mkdirs()) {
|
||||||
|
file.createNewFile();
|
||||||
|
} else {
|
||||||
|
file.createNewFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sw = new StreamWriter(vFile, true, "UTF-8");
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 循环处理日志
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
|
||||||
|
LogInfo vInfo = null;
|
||||||
|
|
||||||
|
if (vQueue.isEmpty()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vInfo = vQueue.poll();
|
||||||
|
|
||||||
|
if (vInfo == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vInfo.Exception != null) {
|
||||||
|
if (StringHelper.isNullOrEmpty(vInfo.Message)) {
|
||||||
|
vInfo.Message = String.format("%s:\r\n%s", vInfo.Exception.getMessage(), vInfo.Exception);
|
||||||
|
} else {
|
||||||
|
vInfo.Message = String.format("%s:\r\n%s\r\n异常参数:%s", vInfo.Exception.getMessage(), vInfo.Exception, vInfo.Message);
|
||||||
|
}
|
||||||
|
String vkey = StringHelper.md5(vInfo.Message);
|
||||||
|
LogInfo vHis = m_CacheException.get(vkey);
|
||||||
|
if (vHis == null) {
|
||||||
|
m_CacheException.put(vkey, vInfo);
|
||||||
|
} else {
|
||||||
|
vHis.Count++;
|
||||||
|
if ((vInfo.Now.getTime() - vHis.Now.getTime()) < 15 * 60 * 1000) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
vInfo.Message = String.format("(%d次) %s", vHis.Count, vInfo.Message);
|
||||||
|
vHis.Count = 0;
|
||||||
|
vHis.Now = vInfo.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringHelper.isNullOrEmpty(vInfo.Message)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
final String vResult = String.format("\r\n%s\t%s", new SimpleDateFormat("HH:mm:ss.SSS").format(vInfo.Now), vInfo.Message);
|
||||||
|
if (sw != null) {
|
||||||
|
sw.WriteLine(vResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将日志写入控制台
|
||||||
|
if (getIsConsole() && getOnWriteLog() != null) {
|
||||||
|
OnWriteLog.Execute(vResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sw != null && vQueue.isEmpty()) {
|
||||||
|
Thread.sleep(100); // 等待100毫秒,防止文件打开关闭消耗资源
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
System.out.println(ex.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (sw != null) {
|
||||||
|
sw.Close();
|
||||||
|
sw = null;
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
System.out.println(ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteLog(Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
WriteLog(ex, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteLog(Exception ex, String vMessage) {
|
||||||
|
AddEnqueue(LogLevel.Exception.getValue(), new LogInfo(new Date(), ex, vMessage));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteLog(StackTraceElement... items) {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
for (StackTraceElement item : items) {
|
||||||
|
sb.append(item.toString());
|
||||||
|
sb.append("\r\n");
|
||||||
|
}
|
||||||
|
WriteLog(sb.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteLog(String vMsg, Object... objs) {
|
||||||
|
WriteLog(LogLevel.None, vMsg, objs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteLog(LogLevel vLevel, String vMsg, Object... objs) {
|
||||||
|
WriteLog(vLevel.getValue(), vMsg, objs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteLog(int vLevel, String vMsg, Object... objs) {
|
||||||
|
WriteLog(new Date(), vLevel, vMsg, objs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteLog(Date vNow, int vLevel, String vMsg, Object... objs) {
|
||||||
|
if (objs != null && objs.length > 0) {
|
||||||
|
try {
|
||||||
|
vMsg = String.format(vMsg, objs);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
System.out.println(ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AddEnqueue(vLevel, new LogInfo(vNow, vMsg));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddEnqueue(int vLevel, LogInfo vInfo) {
|
||||||
|
if (vLevel < getLevel()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_Log.offer(vInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
35
src/com/light/util/MyNameStrategy.java
Normal file
35
src/com/light/util/MyNameStrategy.java
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
|
||||||
|
import com.fasterxml.jackson.databind.cfg.MapperConfig;
|
||||||
|
import com.fasterxml.jackson.databind.introspect.AnnotatedField;
|
||||||
|
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
|
||||||
|
|
||||||
|
public class MyNameStrategy extends PropertyNamingStrategy {
|
||||||
|
@Override
|
||||||
|
public String nameForField(MapperConfig config, AnnotatedField field,
|
||||||
|
String defaultName) {
|
||||||
|
String vName = field.getName();
|
||||||
|
return vName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String nameForGetterMethod(MapperConfig config,
|
||||||
|
AnnotatedMethod method, String defaultName) {
|
||||||
|
String vName = method.getName();
|
||||||
|
if (vName.startsWith("get")) {
|
||||||
|
return vName.substring(3);
|
||||||
|
}
|
||||||
|
return vName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String nameForSetterMethod(MapperConfig config,
|
||||||
|
AnnotatedMethod method, String defaultName) {
|
||||||
|
String vName = method.getName();
|
||||||
|
if (vName.startsWith("set")) {
|
||||||
|
return vName.substring(3);
|
||||||
|
}
|
||||||
|
return vName;
|
||||||
|
}
|
||||||
|
}
|
||||||
472
src/com/light/util/ObjectHelper.java
Normal file
472
src/com/light/util/ObjectHelper.java
Normal file
@@ -0,0 +1,472 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.math.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.*;
|
||||||
|
import com.fasterxml.jackson.databind.node.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @类描述:对象操作类
|
||||||
|
* @项目名称:ScanDemo
|
||||||
|
* @包名: piaost.util
|
||||||
|
* @类名称:ObjectHelper
|
||||||
|
* @创建人:Administrator
|
||||||
|
* @创建时间:2016-5-25下午5:37:06
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
public class ObjectHelper {
|
||||||
|
/**
|
||||||
|
* @描述: json输出结果转意,输结果不带“”
|
||||||
|
* @方法名: Get
|
||||||
|
* @param obj
|
||||||
|
* json对象
|
||||||
|
* @return
|
||||||
|
* @返回类型 Object
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午5:37:37
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午5:37:37
|
||||||
|
*/
|
||||||
|
public static Object Get(Object obj) {
|
||||||
|
Object ret = obj;
|
||||||
|
if (obj instanceof JsonNode) {
|
||||||
|
JsonNode vToken = (JsonNode) obj;
|
||||||
|
if (vToken instanceof ValueNode) {
|
||||||
|
ret = ((ValueNode) vToken).asText();
|
||||||
|
} else {
|
||||||
|
ret = vToken;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 根据不同对象输出结果
|
||||||
|
* @方法名: GetValue
|
||||||
|
* @param obj
|
||||||
|
* @param vName
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
* @返回类型 Object
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午5:39:59
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午5:39:59
|
||||||
|
*/
|
||||||
|
public static Object GetValue(Object obj, String vName) throws Exception {
|
||||||
|
Object ret = null;
|
||||||
|
if (obj == null) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
Class vType = obj.getClass();
|
||||||
|
if (obj instanceof Number || vType.isEnum()) {
|
||||||
|
ret = null;
|
||||||
|
} else if (obj instanceof Map) {
|
||||||
|
ret = ((Map) obj).get(vName);
|
||||||
|
} else if (obj instanceof ObjectNode) {
|
||||||
|
return ((ObjectNode) obj).get(vName);
|
||||||
|
} else {
|
||||||
|
ret = GetTypeValue(obj.getClass(), obj, vName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 根据不同类型设置不同值
|
||||||
|
* @方法名: Set
|
||||||
|
* @param obj
|
||||||
|
* @param vName
|
||||||
|
* @param value
|
||||||
|
* @throws Exception
|
||||||
|
* @返回类型 void
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午5:46:59
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午5:46:59
|
||||||
|
*/
|
||||||
|
public static void Set(Object obj, String vName, Object value) throws Exception {
|
||||||
|
if (obj == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Class vType = obj.getClass();
|
||||||
|
if (obj instanceof Number || vType.isEnum()) {
|
||||||
|
return;
|
||||||
|
} else if (obj instanceof Map) {
|
||||||
|
((Map) obj).put(vName, value);
|
||||||
|
} else if (obj instanceof ObjectNode) {
|
||||||
|
((ObjectNode) obj).put(vName, (JsonNode) value);
|
||||||
|
} else {
|
||||||
|
SetTypeValue(vType, obj, vName, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 设置对象的值
|
||||||
|
* @方法名: SetTypeValue
|
||||||
|
* @param vType
|
||||||
|
* 要赋值的对象
|
||||||
|
* @param obj
|
||||||
|
* @param vName
|
||||||
|
* 要赋值的方法
|
||||||
|
* @param value
|
||||||
|
* 值
|
||||||
|
* @throws Exception
|
||||||
|
* @返回类型 void
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午5:48:30
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午5:48:30
|
||||||
|
*/
|
||||||
|
public static void SetTypeValue(Class<?> vType, Object obj, String vName, Object value) throws Exception {
|
||||||
|
|
||||||
|
try {
|
||||||
|
Field fie = vType.getField(vName);
|
||||||
|
|
||||||
|
int flag = fie.getModifiers();
|
||||||
|
boolean isAcc = (Modifier.PUBLIC & flag) > 0;
|
||||||
|
if (fie != null && isAcc) {
|
||||||
|
Class<?> vProType = fie.getType();
|
||||||
|
Object vTypeValue = StringHelper.Get(vProType, value);
|
||||||
|
fie.set(obj, vTypeValue);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (NoSuchFieldException pe) {
|
||||||
|
String metName = "set" + vName;
|
||||||
|
Method met = null;
|
||||||
|
try {
|
||||||
|
if (value != null) {
|
||||||
|
met = vType.getMethod(metName, value.getClass());
|
||||||
|
}
|
||||||
|
} catch (NoSuchMethodException ex) {
|
||||||
|
Method[] mets = vType.getMethods();
|
||||||
|
for (Method item : mets) {
|
||||||
|
if (!(item.getName().equals(metName) && item.getParameterTypes().length == 1)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
met = item;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (met != null) {
|
||||||
|
Class vProType = met.getParameterTypes()[0];
|
||||||
|
Object vTypeValue = StringHelper.Get(vProType, value);
|
||||||
|
met.invoke(obj, vTypeValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 获取对象的值(从obj中获取关键词为vName的值)
|
||||||
|
* @方法名: GetTypeValue
|
||||||
|
* @param vType
|
||||||
|
* 要获取的对象的Class类型
|
||||||
|
* @param obj
|
||||||
|
* 要获取的对象
|
||||||
|
* @param vName
|
||||||
|
* 要获取的对象的关键词
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
* @返回类型 Object
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午5:53:57
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午5:53:57
|
||||||
|
*/
|
||||||
|
public static Object GetTypeValue(Class<?> vType, Object obj, String vName) throws Exception {
|
||||||
|
try {
|
||||||
|
Field fie = vType.getField(vName);
|
||||||
|
if (fie != null) {
|
||||||
|
int flag = fie.getModifiers();
|
||||||
|
boolean isAcc = (Modifier.PUBLIC & flag) > 0;
|
||||||
|
if (isAcc) {
|
||||||
|
}
|
||||||
|
return fie.get(obj);
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
String metName = "get" + vName;
|
||||||
|
Method met = vType.getMethod(metName);
|
||||||
|
if (met != null) {
|
||||||
|
boolean isReturn = met.getReturnType() != null;
|
||||||
|
int flag = met.getModifiers();
|
||||||
|
boolean isAcc = (Modifier.PUBLIC & flag) > 0;
|
||||||
|
if (isReturn && isAcc) {
|
||||||
|
return met.invoke(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int GetInt(Object obj, String vName) throws Exception {
|
||||||
|
return Get(Integer.class, obj, vName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetString(Object obj, String vName) throws Exception {
|
||||||
|
return Get(String.class, obj, vName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BigDecimal GetDecimal(Object obj, String vName) throws Exception {
|
||||||
|
return Get(BigDecimal.class, obj, vName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 类型转换(从obj中取出关键词为vName的值,转换为cls类型)
|
||||||
|
* @方法名: Get
|
||||||
|
* @param cls
|
||||||
|
* 转换后的类型
|
||||||
|
* @param obj
|
||||||
|
* 要转换对象
|
||||||
|
* @param vName
|
||||||
|
* 要转换对象的关键词
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
* @返回类型 T
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午5:57:10
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午5:57:10
|
||||||
|
*/
|
||||||
|
public static <T> T Get(Class<T> cls, Object obj, String vName) throws Exception {
|
||||||
|
Object val = GetValue(obj, vName);
|
||||||
|
return StringHelper.Get(cls, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 将集合的类容转换为对象
|
||||||
|
* @方法名: AddList
|
||||||
|
* @param vToClass
|
||||||
|
* 转换后的对象
|
||||||
|
* @param vTo
|
||||||
|
* 转换后的对象的集合
|
||||||
|
* @param vFrom
|
||||||
|
* 要转换的对象
|
||||||
|
* @param vField
|
||||||
|
* 关键词
|
||||||
|
* @throws Exception
|
||||||
|
* @返回类型 void
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午6:26:52
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午6:26:52
|
||||||
|
*/
|
||||||
|
public static <T> void AddList(Class<T> vToClass, ArrayList<T> vTo, Object vFrom, String vField) throws Exception {
|
||||||
|
List vFroms = ObjectHelper.Get(List.class, vFrom, vField);
|
||||||
|
if (vFroms == null || vTo == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Object vFromItem : vFroms) {
|
||||||
|
T vToItem = ObjectHelper.Convert(vToClass, vFromItem);
|
||||||
|
vTo.add(vToItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T Convert(T vTo, Object vFrom) throws Exception {
|
||||||
|
if (vTo == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
WriteWithToClass(vTo, vFrom);
|
||||||
|
return vTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T Convert(Class<T> vToClass, Object vFrom) throws Exception {
|
||||||
|
T vTo = vToClass.newInstance();
|
||||||
|
return Convert(vTo, vFrom);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 对象转换(一般将map转为javabean)
|
||||||
|
* @方法名: WriteWithToClass
|
||||||
|
* @param vTo
|
||||||
|
* 转换后的对象
|
||||||
|
* @param vFrom
|
||||||
|
* 要转换的对象
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
* @返回类型 Object
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午6:31:09
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午6:31:09
|
||||||
|
*/
|
||||||
|
public static Object WriteWithToClass(Object vTo, Object vFrom) throws Exception {
|
||||||
|
if (vTo == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Class vToType = vTo.getClass();
|
||||||
|
Method[] vMets = vToType.getMethods();
|
||||||
|
for (Method vItem : vMets) {
|
||||||
|
int flag = vItem.getModifiers();
|
||||||
|
boolean isStatic = (Modifier.FINAL & flag) > 0 || (Modifier.STATIC & flag) > 0;
|
||||||
|
boolean isAcc = (Modifier.PUBLIC & flag) > 0;
|
||||||
|
if (!isAcc || isStatic) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!(vItem.getName().startsWith("set") && vItem.getParameterTypes().length == 1)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Class<?> vType = vItem.getParameterTypes()[0];
|
||||||
|
String vName = vItem.getName().substring(3);
|
||||||
|
Object vValue = ObjectHelper.Get(vType, vFrom, vName);
|
||||||
|
try {
|
||||||
|
if (IsWriteType(vType, vValue)) {
|
||||||
|
vItem.invoke(vTo, vValue);
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Field[] vFields = vToType.getFields();
|
||||||
|
for (Field vItem : vFields) {
|
||||||
|
int flag = vItem.getModifiers();
|
||||||
|
boolean isStatic = (Modifier.FINAL & flag) > 0 || (Modifier.STATIC & flag) > 0;
|
||||||
|
boolean isAcc = (Modifier.PUBLIC & flag) > 0;
|
||||||
|
if (!isAcc || isStatic) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Object vValue = ObjectHelper.Get(vItem.getType(), vFrom, vItem.getName());
|
||||||
|
try {
|
||||||
|
if (IsWriteType(vItem.getType(), vValue)) {
|
||||||
|
vItem.set(vTo, vValue);
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return vTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述: 对象转换(一般是javabean转map)
|
||||||
|
* @方法名: WriteWithFromClass
|
||||||
|
* @param vTo
|
||||||
|
* @param vFrom
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
* @返回类型 Object
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午6:35:37
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午6:35:37
|
||||||
|
*/
|
||||||
|
public static Object WriteWithFromClass(Object vTo, Object vFrom) throws Exception {
|
||||||
|
if (vFrom == null) {
|
||||||
|
return vTo;
|
||||||
|
}
|
||||||
|
Class vFromType = vFrom.getClass();
|
||||||
|
|
||||||
|
Method[] vMets = vFromType.getMethods();
|
||||||
|
for (Method vItem : vMets) {
|
||||||
|
int flag = vItem.getModifiers();
|
||||||
|
boolean isStatic = (Modifier.FINAL & flag) > 0 || (Modifier.STATIC & flag) > 0;
|
||||||
|
boolean isAcc = (Modifier.PUBLIC & flag) > 0;
|
||||||
|
if (!isAcc || isStatic) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!(vItem.getName().startsWith("get") && vItem.getReturnType() != null)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object vValue = vItem.invoke(vFrom);
|
||||||
|
String vName = vItem.getName().substring(3);
|
||||||
|
try {
|
||||||
|
ObjectHelper.Set(vTo, vName, vValue);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Field[] vFields = vFromType.getFields();
|
||||||
|
for (Field vItem : vFields) {
|
||||||
|
int flag = vItem.getModifiers();
|
||||||
|
boolean isStatic = (Modifier.FINAL & flag) > 0 || (Modifier.STATIC & flag) > 0;
|
||||||
|
boolean isAcc = (Modifier.PUBLIC & flag) > 0;
|
||||||
|
if (!isAcc || isStatic) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Object vValue = vItem.get(vFrom);
|
||||||
|
try {
|
||||||
|
ObjectHelper.Set(vTo, vItem.getName(), vValue);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @描述:对象转换
|
||||||
|
* @方法名: ConvertList
|
||||||
|
* @param obj
|
||||||
|
* @return
|
||||||
|
* @返回类型 List
|
||||||
|
* @创建人 Administrator
|
||||||
|
* @创建时间 2016-5-25下午6:43:04
|
||||||
|
* @修改人 Administrator
|
||||||
|
* @修改时间 2016-5-25下午6:43:04
|
||||||
|
*/
|
||||||
|
public static List ConvertList(List obj) {
|
||||||
|
List<Object> vList = new ArrayList<Object>();
|
||||||
|
for (Object item : obj) {
|
||||||
|
if (item instanceof JsonNode) {
|
||||||
|
vList.add(DictionaryHelper.ConvertDictionary(item));
|
||||||
|
} else {
|
||||||
|
vList.add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> ArrayList<T> GetList(Class<T> cls, Object obj) throws Exception {
|
||||||
|
ArrayList<T> vTo = new ArrayList<T>();
|
||||||
|
|
||||||
|
if (obj instanceof List) {
|
||||||
|
List vCodeFrom = (List) ((obj instanceof List) ? obj : null);
|
||||||
|
for (Object vItem : vCodeFrom) {
|
||||||
|
if (StringHelper.IsEmpty(vItem)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
T vToItem = StringHelper.Get(cls, vItem);
|
||||||
|
vTo.add(vToItem);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!StringHelper.IsEmpty(obj)) {
|
||||||
|
T vToItem = StringHelper.Get(cls, obj);
|
||||||
|
vTo.add(vToItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return vTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean IsWriteType(Class<?> a, Object b) {
|
||||||
|
if (a.isEnum() || a.isAssignableFrom(Number.class)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (a == String.class || a == int.class || a == boolean.class || a == double.class || a == float.class) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
boolean isEmpty = StringHelper.IsEmpty(b);
|
||||||
|
if (isEmpty) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return a.isAssignableFrom(b.getClass());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean IsAutoConvert(Class vToType, Class vFromType) {
|
||||||
|
return vFromType != vToType && (Number.class.isAssignableFrom(vToType) || vToType.isEnum() || vToType == String.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
35
src/com/light/util/QrHelper.java
Normal file
35
src/com/light/util/QrHelper.java
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.util.Hashtable;
|
||||||
|
|
||||||
|
import com.google.zxing.BarcodeFormat;
|
||||||
|
import com.google.zxing.EncodeHintType;
|
||||||
|
|
||||||
|
import com.google.zxing.common.BitMatrix;
|
||||||
|
import com.google.zxing.qrcode.QRCodeWriter;
|
||||||
|
|
||||||
|
public class QrHelper {
|
||||||
|
public static BitMatrix Write(String url, int width, int heigth) throws Exception {
|
||||||
|
// 判断URL合法性
|
||||||
|
if (url == null || "".equals(url) || url.length() < 1) {
|
||||||
|
throw new Exception("生成二维码时,需要生成的字符串不能为空!");
|
||||||
|
}
|
||||||
|
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
|
||||||
|
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
|
||||||
|
// 图像数据转换,使用了矩阵转换
|
||||||
|
BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, width, heigth, hints);
|
||||||
|
int[] pixels = new int[width * heigth];
|
||||||
|
// 下面这里按照二维码的算法,逐个生成二维码的图片,
|
||||||
|
// 两个for循环是图片横列扫描的结果
|
||||||
|
for (int y = 0; y < heigth; y++) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
if (bitMatrix.get(x, y)) {
|
||||||
|
pixels[y * width + x] = 0xff000000;
|
||||||
|
} else {
|
||||||
|
pixels[y * width + x] = 0xffffffff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bitMatrix;
|
||||||
|
}
|
||||||
|
}
|
||||||
60
src/com/light/util/RunInterval.java
Normal file
60
src/com/light/util/RunInterval.java
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
|
||||||
|
public class RunInterval
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
当前线程
|
||||||
|
|
||||||
|
*/
|
||||||
|
private Thread Thread;
|
||||||
|
public Thread getThread()
|
||||||
|
{
|
||||||
|
return Thread;
|
||||||
|
}
|
||||||
|
public void setThread(Thread value)
|
||||||
|
{
|
||||||
|
Thread = value;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
间隔时间,毫秒
|
||||||
|
|
||||||
|
*/
|
||||||
|
private int Time;
|
||||||
|
public int getTime()
|
||||||
|
{
|
||||||
|
return Time;
|
||||||
|
}
|
||||||
|
public void setTime(int value)
|
||||||
|
{
|
||||||
|
Time = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
执行的代码
|
||||||
|
|
||||||
|
*/
|
||||||
|
private ThreadDelegateCode Code;
|
||||||
|
public ThreadDelegateCode getCode()
|
||||||
|
{
|
||||||
|
return Code;
|
||||||
|
}
|
||||||
|
public void setCode(ThreadDelegateCode value)
|
||||||
|
{
|
||||||
|
Code = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
是否终端
|
||||||
|
|
||||||
|
*/
|
||||||
|
private boolean Break;
|
||||||
|
public boolean getBreak()
|
||||||
|
{
|
||||||
|
return Break;
|
||||||
|
}
|
||||||
|
public void setBreak(boolean value)
|
||||||
|
{
|
||||||
|
Break = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
46
src/com/light/util/StreamWriter.java
Normal file
46
src/com/light/util/StreamWriter.java
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
|
public class StreamWriter {
|
||||||
|
|
||||||
|
private PrintWriter pw;
|
||||||
|
private FileOutputStream fos;
|
||||||
|
private OutputStreamWriter osw;
|
||||||
|
|
||||||
|
public StreamWriter(String vFile, boolean b, String encoding) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
fos = new FileOutputStream(vFile,true);
|
||||||
|
osw=new OutputStreamWriter(fos, encoding);
|
||||||
|
if(pw==null){
|
||||||
|
pw=new PrintWriter(osw,b);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteLine(String vResult) {
|
||||||
|
pw.println(vResult);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close() {
|
||||||
|
try {
|
||||||
|
if(fos!=null||osw!=null||pw!=null){
|
||||||
|
fos.close();
|
||||||
|
osw.close();
|
||||||
|
pw.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
870
src/com/light/util/StringHelper.java
Normal file
870
src/com/light/util/StringHelper.java
Normal file
@@ -0,0 +1,870 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.io.*;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.text.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串操作帮助类,传入很多字符串,获取第一个非空的字符串
|
||||||
|
*/
|
||||||
|
public class StringHelper {
|
||||||
|
/**
|
||||||
|
* MD5加密
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* 源字符串
|
||||||
|
* @return 加密后的字符串
|
||||||
|
*/
|
||||||
|
public static String md5(String string) {
|
||||||
|
byte[] hash = null;
|
||||||
|
try {
|
||||||
|
hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder hex = new StringBuilder(hash.length * 2);
|
||||||
|
for (byte b : hash) {
|
||||||
|
if ((b & 0xFF) < 0x10)
|
||||||
|
hex.append("0");
|
||||||
|
hex.append(Integer.toHexString(b & 0xFF));
|
||||||
|
}
|
||||||
|
return hex.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串转换为 bool ,当不能转换时,则默认为false
|
||||||
|
*
|
||||||
|
* @param vValue
|
||||||
|
* 需要转换的字符串
|
||||||
|
* @param vDefault
|
||||||
|
* 默认值
|
||||||
|
* @return 转换成功后的值
|
||||||
|
*/
|
||||||
|
public static Boolean GetBoolean(Object vValue, boolean vDefault) {
|
||||||
|
boolean result = vDefault;
|
||||||
|
try {
|
||||||
|
if (!StringHelper.IsEmpty(vValue)) {
|
||||||
|
result = (!StringHelper.SafeCompare(vValue, "0", true) && !StringHelper.SafeCompare(vValue, "false", true)
|
||||||
|
&& !StringHelper.SafeCompare(vValue, "no", true) && !StringHelper.IsEmpty(vValue));
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串转换为 bool ,当不能转换时,则默认为false
|
||||||
|
*
|
||||||
|
* @param vValue
|
||||||
|
* 需要转换的字符串
|
||||||
|
* @return 转换成功后的值
|
||||||
|
*/
|
||||||
|
public static Boolean GetBoolean(Object vValue) {
|
||||||
|
return GetBoolean(vValue, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串转换为 Int,当不能转换时,则默认为0
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* 需要转换的字符串
|
||||||
|
* @return 转换成功后的值
|
||||||
|
*/
|
||||||
|
public static short GetShort(Object vValue) {
|
||||||
|
short result = 0;
|
||||||
|
try {
|
||||||
|
if (!StringHelper.IsEmpty(vValue)) {
|
||||||
|
result = Short.parseShort(vValue.toString());
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex, StringHelper.GetString(vValue));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串转换为 Int,当不能转换时,则默认为0
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* 需要转换的字符串
|
||||||
|
* @return 转换成功后的值
|
||||||
|
*/
|
||||||
|
public static Integer GetInt(Object vValue) {
|
||||||
|
int result = 0;
|
||||||
|
try {
|
||||||
|
if (!StringHelper.IsEmpty(vValue)) {
|
||||||
|
// String类型的小数转int会出错
|
||||||
|
// double d = Double.parseDouble(vValue.toString());
|
||||||
|
// int i = (int) d;
|
||||||
|
// result = Integer.parseInt(String.valueOf(i));
|
||||||
|
result = Integer.parseInt(vValue.toString());
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
try {
|
||||||
|
double d = Double.parseDouble(vValue.toString());
|
||||||
|
int i = (int) d;
|
||||||
|
result = Integer.parseInt(String.valueOf(i));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LogHelper.WriteLog(e, StringHelper.GetString(vValue));
|
||||||
|
}
|
||||||
|
LogHelper.WriteLog(ex, StringHelper.GetString(vValue));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Long GetLong(Object vValue) {
|
||||||
|
long result = 0;
|
||||||
|
try {
|
||||||
|
if (!StringHelper.IsEmpty(vValue)) {
|
||||||
|
result = Long.parseLong(vValue.toString());
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex, StringHelper.GetString(vValue));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long GetLong(byte[] bytes) {
|
||||||
|
if (bytes.length > 0) {
|
||||||
|
return ByteConvertHelper.lBytesToLong(bytes, 0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetPrice(Object obj) {
|
||||||
|
String str = "-";
|
||||||
|
if (!IsEmpty(obj) && GetDouble(obj) != 0) {
|
||||||
|
str = "" + GetDouble(obj);
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串转换为 Float,当不能转换时,则默认为0
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* 需要转换的字符串
|
||||||
|
* @return 转换成功后的值
|
||||||
|
*/
|
||||||
|
public static float GetFloat(Object vValue) {
|
||||||
|
float result = 0;
|
||||||
|
try {
|
||||||
|
if (!StringHelper.IsEmpty(vValue)) {
|
||||||
|
result = Float.parseFloat(vValue.toString());
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex, StringHelper.GetString(vValue));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串转换为 Double,当不能转换时,则默认为0
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* 需要转换的字符串
|
||||||
|
* @return 转换成功后的值
|
||||||
|
*/
|
||||||
|
public static Double GetDouble(Object vValue) {
|
||||||
|
double result = 0.0;
|
||||||
|
try {
|
||||||
|
if (!StringHelper.IsEmpty(vValue)) {
|
||||||
|
result = Double.parseDouble(vValue.toString());
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex, StringHelper.GetString(vValue));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串转换为Decimal,当不能转换时,则默认值为0
|
||||||
|
*
|
||||||
|
* @param vValue
|
||||||
|
* 需要转换的字符串
|
||||||
|
* @return 转换成功后的值
|
||||||
|
*/
|
||||||
|
public static java.math.BigDecimal GetDecimal(Object vValue) {
|
||||||
|
java.math.BigDecimal result = new java.math.BigDecimal(0);
|
||||||
|
try {
|
||||||
|
if (!StringHelper.IsEmpty(vValue)) {
|
||||||
|
result = new BigDecimal(vValue.toString());
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex, StringHelper.GetString(vValue));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将 object 转换为String
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* 需要转换的object
|
||||||
|
* @return 转换成功的字符串
|
||||||
|
*/
|
||||||
|
public static String GetString(Object obj) {
|
||||||
|
obj = ObjectHelper.Get(obj);
|
||||||
|
return obj == null ? null : obj.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] m_formats = new String[] { "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd" };
|
||||||
|
|
||||||
|
public static Date GetDateTime(Object s) throws ParseException {
|
||||||
|
if (s == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (s instanceof Date) {
|
||||||
|
return (Date) (s);
|
||||||
|
} else if (s instanceof Date) {
|
||||||
|
return (Date) ((s instanceof Date) ? s : null);
|
||||||
|
}
|
||||||
|
String strValue = StringHelper.GetString(s).replace("T", " ");
|
||||||
|
Date date = null;
|
||||||
|
if (!isNullOrEmpty(strValue)) {
|
||||||
|
// 第一次处理
|
||||||
|
try {
|
||||||
|
date = new Date(Date.parse(strValue));
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex, strValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 采用格式处理
|
||||||
|
if (date == null) {
|
||||||
|
for (int i = 0; i < m_formats.length; i++) {
|
||||||
|
try {
|
||||||
|
date = new SimpleDateFormat(m_formats[i]).parse(strValue);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex, strValue);
|
||||||
|
}
|
||||||
|
if (date != null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据类型来获取值
|
||||||
|
*
|
||||||
|
* @param vType
|
||||||
|
* 类型
|
||||||
|
* @param fieldValue
|
||||||
|
* 对象
|
||||||
|
* @return 返回获取的值
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T> T Get(Class<T> vType, Object fieldValue) throws Exception {
|
||||||
|
String vName = vType.getName();
|
||||||
|
if (vType.isEnum()) {
|
||||||
|
String strValue = StringHelper.GetString(fieldValue);
|
||||||
|
return EnumHelper.ConvertEnum(vType, strValue);
|
||||||
|
} else if (IsType(vType, String.class)) {
|
||||||
|
return (T) StringHelper.GetString(fieldValue);
|
||||||
|
} else if ("boolean".equals(vName) || IsType(vType, Boolean.class)) {
|
||||||
|
String strValue = StringHelper.GetString(fieldValue);
|
||||||
|
return (T) StringHelper.GetBoolean(strValue);
|
||||||
|
} else if ("int".equals(vName) || IsType(vType, Integer.class)) {
|
||||||
|
return (T) StringHelper.GetInt(fieldValue);
|
||||||
|
} else if ("double".equals(vName) || IsType(vType, Double.class)) {
|
||||||
|
return (T) StringHelper.GetDouble(fieldValue);
|
||||||
|
} else if ("float".equals(vName) || IsType(vType, Float.class)) {
|
||||||
|
return (T) StringHelper.GetDouble(fieldValue);
|
||||||
|
} else if (IsType(vType, BigDecimal.class)) {
|
||||||
|
return (T) StringHelper.GetDecimal(fieldValue);
|
||||||
|
} else if (IsType(vType, Date.class)) {
|
||||||
|
return (T) StringHelper.GetDateTime(fieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T) fieldValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] GetByte(String str) {
|
||||||
|
byte[] bytes = new byte[str.length() / 2];
|
||||||
|
for (int i = 0; i < str.length() / 2; i++) {
|
||||||
|
int btvalue = Integer.parseInt(str.substring(i * 2, i * 2 + 2), 16);
|
||||||
|
bytes[i] = (byte) btvalue;
|
||||||
|
}
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte ToBCD(int p) throws Exception {
|
||||||
|
if (p >= 100) {
|
||||||
|
throw new Exception("整形转换成字节的PCD码必须小于100");
|
||||||
|
}
|
||||||
|
byte bt = (byte) ((p / 10 * 16) + p % 10);
|
||||||
|
return bt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int FromBCD(byte bt) {
|
||||||
|
return (bt / 16) * 10 + bt % 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetStringByte(byte[] bytes) {
|
||||||
|
return GetStringByte(bytes, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetStringByte(byte[] bytes, int len) {
|
||||||
|
if (len == 0) {
|
||||||
|
len = bytes.length;
|
||||||
|
}
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
byte by = bytes[i];
|
||||||
|
sb.append(String.format("%02X", by));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用Unicode转码
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String EncodingString(String str) {
|
||||||
|
return EncodingString("UTF-8", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串编码转换
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* 输入字符串
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String EncodingString(String encoding, String str) {
|
||||||
|
byte[] buff;
|
||||||
|
try {
|
||||||
|
buff = str.getBytes(encoding);
|
||||||
|
str = new String(buff); // 将字节流转换为字符串
|
||||||
|
str = str.replace("\0", "").replace("\n", "");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 传入很多字符串,获取第一个非空的字符串,至少需要两个参数
|
||||||
|
*
|
||||||
|
* @param obj0
|
||||||
|
* 第一个参数
|
||||||
|
* @param obj1
|
||||||
|
* 第二个参数
|
||||||
|
* @param obj2
|
||||||
|
* 参数列表
|
||||||
|
* @return 第一个非空字符串
|
||||||
|
*/
|
||||||
|
public static String GetLastString(String obj0, String obj1, String... obj2) {
|
||||||
|
if (!isNullOrEmpty(obj0)) {
|
||||||
|
return obj0;
|
||||||
|
}
|
||||||
|
if (!isNullOrEmpty(obj1)) {
|
||||||
|
return obj1;
|
||||||
|
}
|
||||||
|
for (String str : obj2) {
|
||||||
|
if (!isNullOrEmpty(str)) {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetTrim(String vCode) {
|
||||||
|
if (vCode == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return vCode.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取名称,当第一个值为空时,则返回第二个值,否则返回第一个值
|
||||||
|
*
|
||||||
|
* @param vName
|
||||||
|
* 第一个值
|
||||||
|
* @param vDefaultName
|
||||||
|
* 需要代替的值
|
||||||
|
* @return 返回不为空的值
|
||||||
|
*/
|
||||||
|
public static String GetDefaultName(String vName, String vDefaultName) {
|
||||||
|
if (isNullOrEmpty(vName)) {
|
||||||
|
return vDefaultName;
|
||||||
|
}
|
||||||
|
return vName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetDateTimeString(String p, Date vLastTime) {
|
||||||
|
String vEmpty = "";
|
||||||
|
if (vLastTime != null) {
|
||||||
|
vEmpty = new SimpleDateFormat(p).format(vLastTime);
|
||||||
|
}
|
||||||
|
return vEmpty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetStringLen(double data, int vLen) {
|
||||||
|
return GetStringLen(data, vLen, "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetStringLen(double data, int vLen, String c) {
|
||||||
|
String vIndex = data + "";// (new Double(data)).toString();
|
||||||
|
for (int i = vIndex.length(); i < vLen; i++) {
|
||||||
|
vIndex = c + vIndex;
|
||||||
|
}
|
||||||
|
return vIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetStringLenLast(double data, int vLen, String c) {
|
||||||
|
String vIndex = data + "";// (new Double(data)).toString();
|
||||||
|
for (int i = vIndex.length(); i < vLen; i++) {
|
||||||
|
vIndex = vIndex + c;
|
||||||
|
}
|
||||||
|
return vIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将数组转换为字符串
|
||||||
|
*
|
||||||
|
* @param vStrs
|
||||||
|
* 需要转换的数组
|
||||||
|
* @return 转换成功后的字符串
|
||||||
|
*/
|
||||||
|
public static String ArrayToString(String[] vStrs) {
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < vStrs.length - 1; i++) {
|
||||||
|
stringBuilder.append(vStrs[i].replace("@", "@@"));
|
||||||
|
stringBuilder.append("<@>");
|
||||||
|
}
|
||||||
|
stringBuilder.append(vStrs[i].replace("@", "@@"));
|
||||||
|
return stringBuilder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字符串转换为数组
|
||||||
|
*
|
||||||
|
* @param vStr
|
||||||
|
* 需要转换的字符串
|
||||||
|
* @return 转换成功后的数组
|
||||||
|
*/
|
||||||
|
public static String[] StringToArray(String vStr) {
|
||||||
|
String text = "<@>";
|
||||||
|
java.util.ArrayList<String> list = new java.util.ArrayList<String>();
|
||||||
|
int num = 0;
|
||||||
|
int num2;
|
||||||
|
while ((num2 = vStr.indexOf(text, num)) != -1) {
|
||||||
|
String item = vStr.substring(num, num2).replace("@@", "@");
|
||||||
|
list.add(item);
|
||||||
|
num = num2 + text.length();
|
||||||
|
}
|
||||||
|
String item2 = vStr.substring(num).replace("@@", "@");
|
||||||
|
list.add(item2);
|
||||||
|
return list.toArray(new String[] {});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 比较两个字符串是否相等
|
||||||
|
*
|
||||||
|
* @param string1
|
||||||
|
* 字符串1
|
||||||
|
* @param string2
|
||||||
|
* 字符串2
|
||||||
|
* @param ignoreCase
|
||||||
|
* 是否区分大小写
|
||||||
|
* @return 比较结果
|
||||||
|
*/
|
||||||
|
public static boolean SafeCompare(String string1, String string2, boolean ignoreCase) {
|
||||||
|
if (string1 == null && string2 == null) {
|
||||||
|
return true;
|
||||||
|
} else if (string1 == null || string2 == null) {
|
||||||
|
return false;
|
||||||
|
} else if (string1.length() != string2.length()) {
|
||||||
|
return false;
|
||||||
|
} else if (ignoreCase) {
|
||||||
|
return string1.compareToIgnoreCase(string2) == 0;
|
||||||
|
} else {
|
||||||
|
return string1.compareTo(string2) == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 比较两个对象转换为字符串是否相等
|
||||||
|
*
|
||||||
|
* @param a
|
||||||
|
* 字符串1
|
||||||
|
* @param b
|
||||||
|
* 字符串2
|
||||||
|
* @param ignoreCase
|
||||||
|
* 是否区分大小写
|
||||||
|
* @return 比较结果
|
||||||
|
*/
|
||||||
|
public static boolean SafeCompare(Object a, Object b, boolean ignoreCase) {
|
||||||
|
String aStr = "";
|
||||||
|
String bStr = "";
|
||||||
|
|
||||||
|
if (a != null) {
|
||||||
|
aStr = a.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b != null) {
|
||||||
|
bStr = b.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return SafeCompare(aStr, bStr, ignoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测字符是否为空
|
||||||
|
*
|
||||||
|
* @param p
|
||||||
|
* 需要检测的字符
|
||||||
|
* @return 检测结果
|
||||||
|
*/
|
||||||
|
public static boolean IsEmptyChar(char p) {
|
||||||
|
if (p == '\r' || p == '\n' || p == '\t' || p == ' ') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 类型匹配
|
||||||
|
*
|
||||||
|
* @param type
|
||||||
|
* 类型
|
||||||
|
* @param typeName
|
||||||
|
* 类型的名称
|
||||||
|
* @return 读取的结果
|
||||||
|
*/
|
||||||
|
public static boolean IsType(Class<?> type, Class<?> vBase) {
|
||||||
|
if (type == null) {
|
||||||
|
return false;
|
||||||
|
} else if (type.equals(vBase)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (type.toString().equals("System.Object")) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return IsType(type.getSuperclass(), vBase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean IsEmpty(Object vValue) {
|
||||||
|
return vValue == null || isNullOrEmpty(vValue.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 比较时间
|
||||||
|
*
|
||||||
|
* @param nullable
|
||||||
|
* @param vNow
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static int CompareDate(Date nullable, Date vNow) {
|
||||||
|
if (nullable == null || nullable == null) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
if (nullable.getTime() > vNow.getTime()) {
|
||||||
|
return 1;
|
||||||
|
} else if (nullable.getTime() < vNow.getTime()) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int GetPage(int p1, int p2) {
|
||||||
|
if (p2 != 0) {
|
||||||
|
return p1 / p2 + (p1 % p2 > 0 ? 1 : 0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetGo(String... args) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (String vStr : args) {
|
||||||
|
if (isNullOrEmpty(vStr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (sb.length() > 0) {
|
||||||
|
sb.append(" => ");
|
||||||
|
}
|
||||||
|
sb.append(vStr);
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DES加密字符串
|
||||||
|
*
|
||||||
|
* @param vKey
|
||||||
|
* 密匙
|
||||||
|
* @param encryptString
|
||||||
|
* 待加密的字符串
|
||||||
|
* @param encryptKey
|
||||||
|
* 加密密钥,要求为8位
|
||||||
|
* @return 加密成功返回加密后的字符串,失败返回源串
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String EncryptDES(byte[] vKey, String encryptString, String encryptKey) throws Exception {
|
||||||
|
if (!isNullOrEmpty(encryptString)) {
|
||||||
|
// byte[] rgbKey = encryptKey.substring(0,
|
||||||
|
// 8).getBytes("UTF-8");//Encoding.UTF8.GetBytes(encryptKey.substring(0,
|
||||||
|
// 8));
|
||||||
|
// byte[] rgbIV = vKey;
|
||||||
|
// byte[] inputByteArray =
|
||||||
|
// encryptString.getBytes("UTF-8");//Encoding.UTF8.GetBytes(encryptString);
|
||||||
|
// DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
|
||||||
|
// ByteArrayOutputStream mStream = new ByteArrayOutputStream();
|
||||||
|
// CryptoStream cStream = new CryptoStream(mStream,
|
||||||
|
// dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
|
||||||
|
// cStream.Write(inputByteArray, 0, inputByteArray.length);
|
||||||
|
// cStream.FlushFinalBlock();
|
||||||
|
String str = DesHelper.encode(vKey, encryptString, encryptKey);
|
||||||
|
return str;// Convert.ToBase64String(mStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DES解密字符串
|
||||||
|
*
|
||||||
|
* @param decryptString
|
||||||
|
* 待解密的字符串
|
||||||
|
* @param decryptKey
|
||||||
|
* 解密密钥,要求为8位,和加密密钥相同
|
||||||
|
* @return 解密成功返回解密后的字符串,失败返源串
|
||||||
|
* @throws Exception
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static String DecryptDES(byte[] vKey, String decryptString, String decryptKey) throws IOException, Exception {
|
||||||
|
if (!isNullOrEmpty(decryptString)) {
|
||||||
|
// byte[] rgbKey =
|
||||||
|
// decryptKey.getBytes("UTF-8");//Encoding.UTF8.GetBytes(decryptKey);
|
||||||
|
// byte[] rgbIV = vKey;
|
||||||
|
// byte[] inputByteArray = Base64.decode(decryptString,
|
||||||
|
// Base64.DEFAULT);//Convert.FromBase64String(decryptString);
|
||||||
|
// DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
|
||||||
|
// ByteArrayOutputStream mStream = new ByteArrayOutputStream();
|
||||||
|
// CryptoStream cStream = new CryptoStream(mStream,
|
||||||
|
// DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
|
||||||
|
// cStream.Write(inputByteArray, 0, inputByteArray.length);
|
||||||
|
// cStream.FlushFinalBlock();
|
||||||
|
// byte[] bytes = mStream.toByteArray();
|
||||||
|
String str = DesHelper.decode(vKey, decryptString, decryptKey);
|
||||||
|
return str;// Encoding.UTF8.GetString(bytes, 0, bytes.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
// This method replaces the .NET static string method 'IsNullOrEmpty'.
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
public static boolean isNullOrEmpty(String string) {
|
||||||
|
return string == null || string.equals("");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
// This method replaces the .NET static string method 'Join' (2 parameter
|
||||||
|
// version).
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
public static String join(String separator, String[] stringarray) {
|
||||||
|
if (stringarray == null)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return join(separator, stringarray, 0, stringarray.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
// This method replaces the .NET static string method 'Join' (4 parameter
|
||||||
|
// version).
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
public static String join(String separator, String[] stringarray, int startindex, int count) {
|
||||||
|
String result = "";
|
||||||
|
|
||||||
|
if (stringarray == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
for (int index = startindex; index < stringarray.length && index - startindex < count; index++) {
|
||||||
|
if (separator != null && index > startindex)
|
||||||
|
result += separator;
|
||||||
|
|
||||||
|
if (stringarray[index] != null)
|
||||||
|
result += stringarray[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
// This method replaces the .NET static string method 'TrimEnd'.
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
public static String trimEnd(String string, Character... charsToTrim) {
|
||||||
|
if (string == null || charsToTrim == null)
|
||||||
|
return string;
|
||||||
|
|
||||||
|
int lengthToKeep = string.length();
|
||||||
|
for (int index = string.length() - 1; index >= 0; index--) {
|
||||||
|
boolean removeChar = false;
|
||||||
|
if (charsToTrim.length == 0) {
|
||||||
|
if (Character.isWhitespace(string.charAt(index))) {
|
||||||
|
lengthToKeep = index;
|
||||||
|
removeChar = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int trimCharIndex = 0; trimCharIndex < charsToTrim.length; trimCharIndex++) {
|
||||||
|
if (string.charAt(index) == charsToTrim[trimCharIndex]) {
|
||||||
|
lengthToKeep = index;
|
||||||
|
removeChar = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!removeChar)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return string.substring(0, lengthToKeep);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
// This method replaces the .NET static string method 'TrimStart'.
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
public static String trimStart(String string, Character... charsToTrim) {
|
||||||
|
if (string == null || charsToTrim == null)
|
||||||
|
return string;
|
||||||
|
|
||||||
|
int startingIndex = 0;
|
||||||
|
for (int index = 0; index < string.length(); index++) {
|
||||||
|
boolean removeChar = false;
|
||||||
|
if (charsToTrim.length == 0) {
|
||||||
|
if (Character.isWhitespace(string.charAt(index))) {
|
||||||
|
startingIndex = index + 1;
|
||||||
|
removeChar = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int trimCharIndex = 0; trimCharIndex < charsToTrim.length; trimCharIndex++) {
|
||||||
|
if (string.charAt(index) == charsToTrim[trimCharIndex]) {
|
||||||
|
startingIndex = index + 1;
|
||||||
|
removeChar = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!removeChar)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return string.substring(startingIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
// This method replaces the .NET static string method 'Trim' when arguments
|
||||||
|
// are used.
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
public static String trim(String string, Character... charsToTrim) {
|
||||||
|
return trimEnd(trimStart(string, charsToTrim), charsToTrim);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
// This method is used for string equality comparisons when the option
|
||||||
|
// 'Use helper 'stringsEqual' method to handle null strings' is selected
|
||||||
|
// (The Java String 'equals' method can't be called on a null instance).
|
||||||
|
// ------------------------------------------------------------------------------------
|
||||||
|
public static boolean stringsEqual(String s1, String s2) {
|
||||||
|
if (s1 == null && s2 == null)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return s1 != null && s1.equals(s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] Split(String vStr, String regex) {
|
||||||
|
return vStr.split(regex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断字符串是否是整数
|
||||||
|
*/
|
||||||
|
public static boolean isInteger(String value) {
|
||||||
|
try {
|
||||||
|
Integer.parseInt(value);
|
||||||
|
return true;
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String GetGUID() {
|
||||||
|
return UUID.randomUUID().toString().trim().replaceAll("-", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void subStringException(String local, int start, int end, int allsize, String str) throws Exception {
|
||||||
|
String exception = local + "/n" + "开始:" + start + " 结束:" + end + "总长:" + allsize + "/n" + str;
|
||||||
|
throw new Exception(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取小时的时间
|
||||||
|
*
|
||||||
|
* @param dt
|
||||||
|
* @return
|
||||||
|
* @throws ParseException
|
||||||
|
*/
|
||||||
|
public static CharSequence GetHour(String sdt) throws ParseException {
|
||||||
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
|
||||||
|
Date dt = format.parse(sdt);
|
||||||
|
return format.format(dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取空字符串
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String GetEmpty(Object str) {
|
||||||
|
if (IsEmpty(str)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return str.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SimpleDateFormat formatday = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前日期
|
||||||
|
*
|
||||||
|
* @param date
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String GetDay(Date date) {
|
||||||
|
return formatday.format(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前日期
|
||||||
|
*
|
||||||
|
* @param date
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String GetDay(String date) {
|
||||||
|
try {
|
||||||
|
return formatday.format(formatday.parse(date));
|
||||||
|
} catch (ParseException e) {
|
||||||
|
LogHelper.WriteLog(e);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
168
src/com/light/util/SystemHard.java
Normal file
168
src/com/light/util/SystemHard.java
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.NetworkInterface;
|
||||||
|
import java.net.SocketException;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取设置信息
|
||||||
|
*
|
||||||
|
* @author Light
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SystemHard {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移动
|
||||||
|
*/
|
||||||
|
public static final int NetYidong = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联通
|
||||||
|
*/
|
||||||
|
public static final int NetLiantong = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 电信
|
||||||
|
*/
|
||||||
|
public static final int NetDianxin = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行底层命令
|
||||||
|
*
|
||||||
|
* @param cmd
|
||||||
|
* @return
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static String do_exec(String cmd) throws IOException {
|
||||||
|
String s = "";
|
||||||
|
Process p = Runtime.getRuntime().exec(cmd);
|
||||||
|
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
|
||||||
|
String line = null;
|
||||||
|
while ((line = in.readLine()) != null) {
|
||||||
|
s += line + "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取CPU编号
|
||||||
|
*
|
||||||
|
* @return @throws
|
||||||
|
*/
|
||||||
|
public static String GetCommandCPU() {
|
||||||
|
String ret = "";
|
||||||
|
try {
|
||||||
|
ret = do_exec("cat /proc/cpuinfo").trim();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取CPU编号
|
||||||
|
*
|
||||||
|
* @return @throws
|
||||||
|
*/
|
||||||
|
public static String GetCommandMac() {
|
||||||
|
String ret = "";
|
||||||
|
try {
|
||||||
|
ret = do_exec("cat /sys/class/net/wlan0/address").trim();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备编号
|
||||||
|
*
|
||||||
|
* @param loadActivity
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String GetHardID(Object act) {
|
||||||
|
String vFrom = act.getClass().getPackage().getName() + GetCommandCPU() + GetCommandMac() + GetWindowCPUID()
|
||||||
|
+ GetWiddowHardwardID() + GetWindowMac();
|
||||||
|
String vTo = StringHelper.md5(vFrom);
|
||||||
|
return vTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Windows CPU 编号
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String GetWindowCPUID() {
|
||||||
|
try {
|
||||||
|
// long start = System.currentTimeMillis();
|
||||||
|
Process process = Runtime.getRuntime().exec(new String[] { "wmic", "cpu", "get", "ProcessorId" });
|
||||||
|
process.getOutputStream().close();
|
||||||
|
Scanner sc = new Scanner(process.getInputStream());
|
||||||
|
String property = sc.next();
|
||||||
|
String serial = sc.next();
|
||||||
|
return serial;
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Windows 硬盘序列号
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String GetWiddowHardwardID() {
|
||||||
|
String line = "";
|
||||||
|
String HdSerial = "";// 记录硬盘序列号
|
||||||
|
try {
|
||||||
|
Process proces = Runtime.getRuntime().exec("cmd /c dir c:");// 获取命令行参数
|
||||||
|
BufferedReader buffreader = new BufferedReader(new InputStreamReader(proces.getInputStream()));
|
||||||
|
while ((line = buffreader.readLine()) != null) {
|
||||||
|
if (line.indexOf("卷的序列号是 ") != -1) { // 读取参数并获取硬盘序列号
|
||||||
|
HdSerial = line.substring(line.indexOf("卷的序列号是 ") + "卷的序列号是 ".length(), line.length());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
LogHelper.WriteLog(e);
|
||||||
|
}
|
||||||
|
return HdSerial; // 返回硬盘序列号
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Windows MAC地址
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @throws SocketException
|
||||||
|
*/
|
||||||
|
private static String GetWindowMac() {
|
||||||
|
try {
|
||||||
|
byte[] mac = NetworkInterface.getNetworkInterfaces().nextElement().getHardwareAddress();
|
||||||
|
StringBuffer sb = new StringBuffer("");
|
||||||
|
for (int i = 0; i < mac.length; i++) {
|
||||||
|
if (i != 0) {
|
||||||
|
sb.append("-");
|
||||||
|
}
|
||||||
|
// 字节转换为整数
|
||||||
|
int temp = mac[i] & 0xff;
|
||||||
|
String str = Integer.toHexString(temp);
|
||||||
|
if (str.length() == 1) {
|
||||||
|
sb.append("0" + str);
|
||||||
|
} else {
|
||||||
|
sb.append(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString().toUpperCase();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
5
src/com/light/util/ThreadDelegateCode.java
Normal file
5
src/com/light/util/ThreadDelegateCode.java
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
public interface ThreadDelegateCode {
|
||||||
|
void Execute() throws Exception;
|
||||||
|
}
|
||||||
12
src/com/light/util/ThreadDelegateCodeExecute.java
Normal file
12
src/com/light/util/ThreadDelegateCodeExecute.java
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
|
||||||
|
public class ThreadDelegateCodeExecute implements IEventExecute<ThreadDelegateCode>{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Execute(ThreadDelegateCode t) throws Exception {
|
||||||
|
|
||||||
|
t.Execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
465
src/com/light/util/ThreadHelper.java
Normal file
465
src/com/light/util/ThreadHelper.java
Normal file
@@ -0,0 +1,465 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class ThreadHelper {
|
||||||
|
private static Object _ThreadLock = new Object();
|
||||||
|
private static Thread _Thread = null;
|
||||||
|
private static Date _ThreadDate = null;
|
||||||
|
private static ExecuteRun Timeout;
|
||||||
|
private static ExecuteRun Interval;
|
||||||
|
|
||||||
|
private static void InitStatic() {
|
||||||
|
_ThreadDate = new Date("1987-11-04");
|
||||||
|
Timeout = new ExecuteRun();
|
||||||
|
Interval = new ExecuteRun();
|
||||||
|
ThreadDelegateCode vAdd = new ThreadDelegateCode() {
|
||||||
|
@Override
|
||||||
|
public void Execute() {
|
||||||
|
OnExecuteAdd();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ThreadDelegateCode vItemAdd = new ThreadDelegateCode() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Execute() {
|
||||||
|
OnItemExecuted();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Timeout.OnAdd.Add(vAdd);
|
||||||
|
Timeout.OnItemExecuted.Add(vItemAdd);
|
||||||
|
Interval.OnAdd.Add(vAdd);
|
||||||
|
Interval.OnItemExecuted.Add(vItemAdd);
|
||||||
|
StartMonitor();
|
||||||
|
}
|
||||||
|
|
||||||
|
// #region 内部累
|
||||||
|
private static class ExecuteData {
|
||||||
|
public Date Date;
|
||||||
|
public double ExecuteCount;
|
||||||
|
public double ExecuteError; // 调试变量
|
||||||
|
public String Flag;
|
||||||
|
public int Time;
|
||||||
|
public ThreadDelegateCode Execute;
|
||||||
|
|
||||||
|
public ExecuteData() {
|
||||||
|
this.Date = new java.util.Date();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ExecuteRun {
|
||||||
|
private Object m_Lock = new Object();
|
||||||
|
private java.util.ArrayList<ExecuteData> m_List = new java.util.ArrayList<ExecuteData>();
|
||||||
|
|
||||||
|
private Event<ThreadDelegateCode> OnAdd = new Event<ThreadDelegateCode>();
|
||||||
|
private Event<ThreadDelegateCode> OnRemove = new Event<ThreadDelegateCode>();
|
||||||
|
private Event<ThreadDelegateCode> OnItemExecuted = new Event<ThreadDelegateCode>();
|
||||||
|
private Event<ThreadDelegateCode> OnExecuted = new Event<ThreadDelegateCode>();
|
||||||
|
|
||||||
|
public Event<ThreadDelegateCode> GetOnAdd() {
|
||||||
|
return OnAdd;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Event<ThreadDelegateCode> GetOnRemove() {
|
||||||
|
return OnRemove;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Event<ThreadDelegateCode> GetOnItemExecuted() {
|
||||||
|
return OnItemExecuted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Event<ThreadDelegateCode> GetOnExecuted() {
|
||||||
|
return OnExecuted;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行完任务后,是否需要删除该任务,并且设置允许执行的最大错误
|
||||||
|
*
|
||||||
|
* @param vIsRemove
|
||||||
|
* @param vMaxError
|
||||||
|
*/
|
||||||
|
public final void Execute(boolean vIsRemove, int vMaxError) {
|
||||||
|
for (int i = m_List.size() - 1; i >= 0; i--) {
|
||||||
|
Date vNow = new Date();
|
||||||
|
ExecuteData vItem = null;
|
||||||
|
synchronized (this.m_Lock) {
|
||||||
|
vItem = m_List.size() > i ? m_List.get(i) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vItem == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double vMillseconds = 0;
|
||||||
|
|
||||||
|
// 在Window CE中时间相减可能会出错
|
||||||
|
try {
|
||||||
|
// 处理非法改动时间
|
||||||
|
if (vItem.Date.compareTo(vNow) > 0) {
|
||||||
|
vItem.Date = vNow;
|
||||||
|
}
|
||||||
|
|
||||||
|
vMillseconds = (vNow.getTime() - vItem.Date.getTime());
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 未到执行时间
|
||||||
|
if (vMillseconds <= vItem.Time) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vMaxError == -1 || vItem.ExecuteError < vMaxError) {
|
||||||
|
try {
|
||||||
|
vItem.ExecuteCount++;
|
||||||
|
vItem.ExecuteError++;
|
||||||
|
|
||||||
|
vItem.Execute.Execute();
|
||||||
|
|
||||||
|
vItem.ExecuteError = 0;
|
||||||
|
|
||||||
|
this.ExecuteEvent(this.OnItemExecuted);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
vItem.Date = new java.util.Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (vIsRemove) {
|
||||||
|
synchronized (this.m_Lock) {
|
||||||
|
this.m_List.remove(i);
|
||||||
|
this.ExecuteEvent(this.OnRemove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ExecuteEvent(this.OnExecuted);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置需要执行的任务
|
||||||
|
*
|
||||||
|
* @param vFrom
|
||||||
|
* 需要执行的窗体
|
||||||
|
* @param vExecute
|
||||||
|
* 需要执行的程序
|
||||||
|
* @param vTime
|
||||||
|
* 间隔时间
|
||||||
|
* @return 执行标志
|
||||||
|
*/
|
||||||
|
// public final String Set(Form vForm, ThreadDelegateCode vExecute, int
|
||||||
|
// vTime)
|
||||||
|
// {
|
||||||
|
// final String flag = Set(vExecute, vTime);
|
||||||
|
// vForm.getOnFinish().Add(new DelegateCode()
|
||||||
|
// {
|
||||||
|
// @Override
|
||||||
|
// public void Execute()
|
||||||
|
// {
|
||||||
|
// Clear(flag);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// return flag;
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置需要执行的任务
|
||||||
|
*
|
||||||
|
* @param vExecute
|
||||||
|
* 需要执行的程序
|
||||||
|
* @param vTime
|
||||||
|
* 间隔时间
|
||||||
|
* @return 执行标志
|
||||||
|
*/
|
||||||
|
public final String Set(ThreadDelegateCode vExecute, int vTime) {
|
||||||
|
ExecuteData tempVar = new ExecuteData();
|
||||||
|
tempVar.Flag = UUID.randomUUID().toString().replace("-", "");// Guid.NewGuid().ToString("N");
|
||||||
|
tempVar.Execute = vExecute;
|
||||||
|
tempVar.Time = vTime;
|
||||||
|
ExecuteData vData = tempVar;
|
||||||
|
|
||||||
|
synchronized (m_Lock) {
|
||||||
|
m_List.add(vData);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ExecuteEvent(this.OnAdd);
|
||||||
|
|
||||||
|
return vData.Flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清除需要执行的任务
|
||||||
|
*
|
||||||
|
* @param flag
|
||||||
|
* 执行标志
|
||||||
|
*/
|
||||||
|
public final void Clear(String flag) {
|
||||||
|
synchronized (m_Lock) {
|
||||||
|
for (ExecuteData item : this.m_List) {
|
||||||
|
if (item.Flag.equals(flag)) {
|
||||||
|
this.m_List.remove(item);
|
||||||
|
this.ExecuteEvent(this.OnRemove);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清除需要执行的任务
|
||||||
|
*
|
||||||
|
* @param vExecute
|
||||||
|
* 执行的方法,注意有多个同样的方法时,只会清除第一个
|
||||||
|
*/
|
||||||
|
public final void Clear(ThreadDelegateCode vExecute) {
|
||||||
|
synchronized (m_Lock) {
|
||||||
|
for (ExecuteData item : this.m_List) {
|
||||||
|
if (item.Execute == vExecute) {
|
||||||
|
this.m_List.remove(item);
|
||||||
|
this.ExecuteEvent(this.OnRemove);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ExecuteEvent(Event<ThreadDelegateCode> vExecute) {
|
||||||
|
try {
|
||||||
|
if (vExecute != null) {
|
||||||
|
vExecute.Exeucte(new ThreadDelegateCodeExecute());
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int getCount() {
|
||||||
|
return this.m_List.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void OnItemExecuted() {
|
||||||
|
_ThreadDate = new java.util.Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void OnExecuteAdd() {
|
||||||
|
StartThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void StartThread() {
|
||||||
|
synchronized (_ThreadLock) {
|
||||||
|
if (_Thread != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_Thread = ThreadHelper.RunThread(new ThreadDelegateCode() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Execute() throws Exception {
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
Timeout.Execute(true, -1);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Interval.Execute(false, -1);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
if (Timeout.getCount() == 0 && Interval.getCount() == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Thread.sleep(10);
|
||||||
|
}
|
||||||
|
_Thread = null;
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
// InitStatic();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监控线程的方法,防止线程执行死机
|
||||||
|
*/
|
||||||
|
private static void StartMonitor() {
|
||||||
|
ThreadHelper.RunThread(new ThreadDelegateCode() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Execute() throws Exception {
|
||||||
|
do {
|
||||||
|
if (_Thread != null && ((new java.util.Date().getTime() - _ThreadDate.getTime()) / 1000) > 5) {
|
||||||
|
try {
|
||||||
|
if (_Thread != null) {
|
||||||
|
_Thread.stop();
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
_Thread = null;
|
||||||
|
StartThread();
|
||||||
|
}
|
||||||
|
Thread.sleep(1000 * 60);
|
||||||
|
} while (true);
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多少毫秒后执行任务,适用于执行时间短,不需要单独开线程的程序
|
||||||
|
*
|
||||||
|
* @param vFrom
|
||||||
|
* 需要执行的窗体
|
||||||
|
* @param vExecute
|
||||||
|
* 需要执行的程序
|
||||||
|
* @param vTime
|
||||||
|
* 间隔时间
|
||||||
|
* @return 执行标志
|
||||||
|
*/
|
||||||
|
// public static String SetTimeout(Form vForm, ThreadDelegateCode vExecute,
|
||||||
|
// int vTime)
|
||||||
|
// {
|
||||||
|
// return Timeout.Set(vForm, vExecute, vTime);
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多少毫秒后执行任务,适用于执行时间短,不需要单独开线程的程序
|
||||||
|
*
|
||||||
|
* @param vExecute
|
||||||
|
* 需要执行的程序
|
||||||
|
* @param vTime
|
||||||
|
* 间隔时间
|
||||||
|
* @return 执行标志
|
||||||
|
*/
|
||||||
|
public static String SetTimeout(ThreadDelegateCode vExecute, int vTime) {
|
||||||
|
return Timeout.Set(vExecute, vTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清除需要执行的任务
|
||||||
|
*
|
||||||
|
* @param flag
|
||||||
|
* 执行标志
|
||||||
|
*/
|
||||||
|
public static void ClearTimeout(String flag) {
|
||||||
|
Timeout.Clear(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清除需要执行的任务
|
||||||
|
*
|
||||||
|
* @param vExecute
|
||||||
|
* 执行的方法,注意有多个同样的方法时,只会清除第一个
|
||||||
|
*/
|
||||||
|
public static void ClearTimeout(ThreadDelegateCode vExecute) {
|
||||||
|
Timeout.Clear(vExecute);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每隔多少毫秒执行任务,适用于执行时间短,不需要单独开线程的程序
|
||||||
|
*
|
||||||
|
* @param vFrom
|
||||||
|
* 需要执行的窗体
|
||||||
|
* @param vExecute
|
||||||
|
* 需要执行的程序
|
||||||
|
* @param vTime
|
||||||
|
* 间隔时间
|
||||||
|
* @return 执行标志
|
||||||
|
*/
|
||||||
|
// public static String SetInterval(Form vForm, ThreadDelegateCode vExecute,
|
||||||
|
// int vTime)
|
||||||
|
// {
|
||||||
|
// return Interval.Set(vForm, vExecute, vTime);
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每隔多少毫秒执行任务,适用于执行时间短,不需要单独开线程的程序
|
||||||
|
*
|
||||||
|
* @param vExecute
|
||||||
|
* 需要执行的程序
|
||||||
|
* @param vTime
|
||||||
|
* 间隔时间
|
||||||
|
* @return 执行标志
|
||||||
|
*/
|
||||||
|
public static String SetInterval(ThreadDelegateCode vExecute, int vTime) {
|
||||||
|
return Interval.Set(vExecute, vTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清除需要执行的任务
|
||||||
|
*
|
||||||
|
* @param flag
|
||||||
|
* 执行标志
|
||||||
|
*/
|
||||||
|
public static void ClearInterval(String flag) {
|
||||||
|
Interval.Clear(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清除需要执行的任务
|
||||||
|
*
|
||||||
|
* @param vExecute
|
||||||
|
* 执行的方法,注意有多个同样的方法时,只会清除第一个
|
||||||
|
*/
|
||||||
|
public static void ClearInterval(ThreadDelegateCode vExecute) {
|
||||||
|
Interval.Clear(vExecute);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Sleep(int p) throws InterruptedException {
|
||||||
|
Thread.sleep(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Thread RunThread(final ThreadDelegateCode vExecute) {
|
||||||
|
Thread thread = new Thread() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
vExecute.Execute();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
thread.setDaemon(true);
|
||||||
|
thread.start();
|
||||||
|
|
||||||
|
return thread;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Thread RunThread(final RunInterval vInterval) {
|
||||||
|
Thread vThread = RunThread(new ThreadDelegateCode() {
|
||||||
|
@Override
|
||||||
|
public void Execute() throws Exception {
|
||||||
|
while (!vInterval.getBreak()) {
|
||||||
|
try {
|
||||||
|
vInterval.getCode().Execute();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogHelper.WriteLog(ex);
|
||||||
|
}
|
||||||
|
Thread.sleep(vInterval.getTime());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
vInterval.setThread(vThread);
|
||||||
|
return vThread;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sleep(int timer) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(timer);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
78
src/com/light/util/Uint32.java
Normal file
78
src/com/light/util/Uint32.java
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
public class Uint32 {
|
||||||
|
|
||||||
|
public final static int SIZE = 32;
|
||||||
|
|
||||||
|
private final static long MIN = 0L;
|
||||||
|
private final static long MAX = (1L << SIZE) - 1;
|
||||||
|
|
||||||
|
public final static Uint32 MIN_VALUE = new Uint32(MIN);
|
||||||
|
public final static Uint32 MAX_VALUE = new Uint32(MAX);
|
||||||
|
|
||||||
|
private Long value;
|
||||||
|
|
||||||
|
public Uint32() {
|
||||||
|
this(0L);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Uint32(long value) {
|
||||||
|
setValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Uint32(int value) {
|
||||||
|
if (value < 0) {
|
||||||
|
setValue(value - Integer.MIN_VALUE + (long) Integer.MAX_VALUE + 1);
|
||||||
|
} else {
|
||||||
|
setValue(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(long value) {
|
||||||
|
check(value);
|
||||||
|
this.value = value & MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void check(long value) {
|
||||||
|
if (value < MIN || value > MAX) {
|
||||||
|
throw new IllegalArgumentException(value + " 值必须在 " + MIN + " 到 " + MAX + " 之间");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return ((Long) value).hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return String.valueOf(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int compareTo(Uint32 obj) {
|
||||||
|
if (obj == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (this.value == obj.value) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return this.value > obj.value ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
final Uint32 other = (Uint32) obj;
|
||||||
|
if (value != other.value)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
27
src/com/light/util/UrlUtil.java
Normal file
27
src/com/light/util/UrlUtil.java
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package com.light.util;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLDecoder;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
|
||||||
|
public class UrlUtil {
|
||||||
|
// 转换为%E4%BD%A0形式
|
||||||
|
public static String Encoding(String s, String encoding) throws UnsupportedEncodingException {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
for (int i = 0; i < s.length(); i++) {
|
||||||
|
char c = s.charAt(i);
|
||||||
|
if (c >= 0 && c <= 255) {
|
||||||
|
sb.append(c);
|
||||||
|
} else {
|
||||||
|
String t = URLEncoder.encode("" + c, encoding);
|
||||||
|
sb.append(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将%E4%BD%A0转换为汉字
|
||||||
|
public static String Decoding(String s, String encoding) throws UnsupportedEncodingException {
|
||||||
|
return URLDecoder.decode(s, encoding);
|
||||||
|
}
|
||||||
|
}
|
||||||
84
src/test/DES3.java
Normal file
84
src/test/DES3.java
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
import java.security.Security;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.SecretKey;
|
||||||
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||||
|
|
||||||
|
import sun.misc.BASE64Decoder;
|
||||||
|
import sun.misc.BASE64Encoder;
|
||||||
|
|
||||||
|
public class DES3 {
|
||||||
|
public static final String ALGORITHM_TAG = "BC";
|
||||||
|
public static final String ALGORITHM = "DESede/ECB/PKCS7Padding";
|
||||||
|
public static final String ALGORITHM_KEY = "DESede"; // 定义 加密算法,可用
|
||||||
|
// DES,DESede,Blowfish
|
||||||
|
// AES
|
||||||
|
|
||||||
|
static {
|
||||||
|
// 初始化
|
||||||
|
Security.addProvider(new BouncyCastleProvider());
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] Handle(int type, byte[] from, String key, String siv) throws Exception {
|
||||||
|
if (key.length() < 24) {
|
||||||
|
key += "000000000000000000000000000000000";
|
||||||
|
}
|
||||||
|
key = key.substring(0, 24);
|
||||||
|
byte[] keys = key.getBytes("UTF-8");
|
||||||
|
SecretKey secretKey = new SecretKeySpec(keys, ALGORITHM_KEY);
|
||||||
|
|
||||||
|
Cipher cipher = isEmpty(ALGORITHM_TAG) ? Cipher.getInstance(ALGORITHM)
|
||||||
|
: Cipher.getInstance(ALGORITHM, ALGORITHM_TAG);
|
||||||
|
if (ALGORITHM.indexOf("/ECB/") > 0 || isEmpty(siv)) {
|
||||||
|
cipher.init(type, secretKey);
|
||||||
|
} else {
|
||||||
|
byte[] ivs = siv.getBytes("UTF-8");
|
||||||
|
IvParameterSpec iv = new IvParameterSpec(ivs);
|
||||||
|
cipher.init(type, secretKey, iv);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] to = cipher.doFinal(from);
|
||||||
|
return to;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isEmpty(String str) {
|
||||||
|
return str == null || str.equals("");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解密数据
|
||||||
|
public String decrypt(String fromString, String key, String siv) throws Exception {
|
||||||
|
BASE64Decoder base64 = new BASE64Decoder();
|
||||||
|
byte[] from = base64.decodeBuffer(fromString);
|
||||||
|
byte[] to = Handle(Cipher.DECRYPT_MODE, from, key, siv);
|
||||||
|
String toString = new String(to, "UTF-8");
|
||||||
|
return toString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String encrypt(String fromString, String key, String siv) throws Exception {
|
||||||
|
byte[] from = fromString.getBytes("UTF-8");
|
||||||
|
byte[] to = Handle(Cipher.ENCRYPT_MODE, from, key, siv);
|
||||||
|
// Base64 加密实例
|
||||||
|
BASE64Encoder base64 = new BASE64Encoder();
|
||||||
|
String toString = base64.encode(to);
|
||||||
|
return toString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
String sIV = "hellocxp";
|
||||||
|
String key = "15874498990";
|
||||||
|
String value = "96e63ae1-336b-4638-be20-5e2ac73bf2e3";
|
||||||
|
|
||||||
|
DES3 des = new DES3();
|
||||||
|
|
||||||
|
System.out.println("加密数据:" + value);
|
||||||
|
String a = des.encrypt(value, key, sIV);
|
||||||
|
System.out.println("加密后的数据为:" + a);
|
||||||
|
String b = des.decrypt(a, key, sIV);
|
||||||
|
System.out.println("解密后的数据:" + b);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
169
src/test/DesPKCS7Encrypter.java
Normal file
169
src/test/DesPKCS7Encrypter.java
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.security.spec.*;
|
||||||
|
import javax.crypto.*;
|
||||||
|
import javax.crypto.spec.*;
|
||||||
|
|
||||||
|
import sun.misc.BASE64Encoder;
|
||||||
|
|
||||||
|
public class DesPKCS7Encrypter {
|
||||||
|
private static final String Algorithm = "DESede"; // 定义 加密算法,可用
|
||||||
|
// DES,DESede,Blowfish
|
||||||
|
|
||||||
|
Cipher ecipher;
|
||||||
|
Cipher dcipher;
|
||||||
|
|
||||||
|
DesPKCS7Encrypter(byte[] keyBytes, byte[] ivBytes) throws Exception {
|
||||||
|
Init(keyBytes, ivBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
DesPKCS7Encrypter(DESKeySpec keySpec, IvParameterSpec ivSpec) throws Exception {
|
||||||
|
Init(keySpec, ivSpec);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Init(byte[] keyBytes, byte[] ivBytes) throws Exception {
|
||||||
|
SecretKey key = new SecretKeySpec(keyBytes, Algorithm);
|
||||||
|
IvParameterSpec iv = new IvParameterSpec(ivBytes);
|
||||||
|
Init(key, iv);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Init(DESKeySpec keySpec, IvParameterSpec iv) throws Exception {
|
||||||
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
|
||||||
|
SecretKey key = keyFactory.generateSecret(keySpec);
|
||||||
|
Init(key, iv);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Init(SecretKey key, IvParameterSpec iv) throws Exception {
|
||||||
|
AlgorithmParameterSpec paramSpec = iv;
|
||||||
|
try {
|
||||||
|
ecipher = Cipher.getInstance(Algorithm + "/CBC/NoPadding");
|
||||||
|
dcipher = Cipher.getInstance(Algorithm + "/CBC/NoPadding");
|
||||||
|
|
||||||
|
// CBC requires an initialization vector
|
||||||
|
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
|
||||||
|
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void encrypt(InputStream in, OutputStream out) {
|
||||||
|
try {
|
||||||
|
// Bytes written to out will be encrypted
|
||||||
|
out = new CipherOutputStream(out, ecipher);
|
||||||
|
byte[] buf = new byte[this.ecipher.getBlockSize()];
|
||||||
|
|
||||||
|
// Read in the cleartext bytes and write to out to encrypt
|
||||||
|
int numRead = 0;
|
||||||
|
while (true) {
|
||||||
|
numRead = in.read(buf);
|
||||||
|
boolean bBreak = false;
|
||||||
|
if (numRead == -1 || numRead < buf.length) {
|
||||||
|
int pos = numRead == -1 ? 0 : numRead;
|
||||||
|
byte byteFill = (byte) (buf.length - pos);
|
||||||
|
for (int i = pos; i < buf.length; ++i) {
|
||||||
|
buf[i] = byteFill;
|
||||||
|
}
|
||||||
|
bBreak = true;
|
||||||
|
}
|
||||||
|
out.write(buf);
|
||||||
|
|
||||||
|
if (bBreak)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
System.out.println("Exception e in encrypt=" + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void decrypt(InputStream in, OutputStream out) {
|
||||||
|
try {
|
||||||
|
// Bytes read from in will be decrypted
|
||||||
|
in = new CipherInputStream(in, dcipher);
|
||||||
|
byte[] buf = new byte[this.dcipher.getBlockSize()];
|
||||||
|
|
||||||
|
// Read in the decrypted bytes and write the cleartext to out
|
||||||
|
int numRead = 0;
|
||||||
|
while ((numRead = in.read(buf)) >= 0) {
|
||||||
|
if (in.available() > 0) {
|
||||||
|
out.write(buf, 0, numRead);
|
||||||
|
} else {
|
||||||
|
byte byteBlock = buf[buf.length - 1];
|
||||||
|
int i = 0;
|
||||||
|
for (i = buf.length - byteBlock; i >= 0 && i < buf.length; ++i) {
|
||||||
|
if (buf[i] != byteBlock) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == buf.length) {
|
||||||
|
out.write(buf, 0, buf.length - byteBlock);
|
||||||
|
} else {
|
||||||
|
out.write(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out.close();
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
System.out.println("Exception e in decrypt=" + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String encrypt(String value, String key, String siv) throws Exception {
|
||||||
|
if (key.length() < 24) {
|
||||||
|
key += "000000000000000000000000000000000";
|
||||||
|
}
|
||||||
|
key = key.substring(0, 24);
|
||||||
|
// 生成Key和IV
|
||||||
|
byte[] byteKey = key.getBytes("UTF-8");
|
||||||
|
byte[] byteIv = siv.getBytes("UTF-8");
|
||||||
|
|
||||||
|
// 创建加密实例
|
||||||
|
DesPKCS7Encrypter encrypter = new DesPKCS7Encrypter(byteKey, byteIv);
|
||||||
|
// 生成要加密的数据
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(value.getBytes("UTF-8"));
|
||||||
|
// 声明加密输出
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
// Base64 加密实例
|
||||||
|
BASE64Encoder base64Encoder = new BASE64Encoder();
|
||||||
|
|
||||||
|
// 加密
|
||||||
|
encrypter.encrypt(bais, baos);
|
||||||
|
|
||||||
|
// Base64加密
|
||||||
|
String outStr = base64Encoder.encode(baos.toByteArray());
|
||||||
|
return outStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String decrypt(String value, String key, String siv) {
|
||||||
|
|
||||||
|
// // 初始化解密数据
|
||||||
|
// bais = new ByteArrayInputStream(baos.toByteArray());
|
||||||
|
// // 声明解密输出
|
||||||
|
// baos = new ByteArrayOutputStream();
|
||||||
|
// // 解密
|
||||||
|
// encrypter.decrypt(bais,baos);
|
||||||
|
// //查看解密结果
|
||||||
|
// System.out.println(baos.toString("utf-8"));
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String args[]) {
|
||||||
|
try {
|
||||||
|
String sIV = "hellocxp";
|
||||||
|
String key = "15874498990";
|
||||||
|
String value = "96e63ae1-336b-4638-be20-5e2ac73bf2e3";
|
||||||
|
String outStr = encrypt(value, key, sIV);
|
||||||
|
// 结果
|
||||||
|
System.out.println(outStr);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("Exception e=" + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user