学习与编写项目Woss_Gathe一些总结
0.大致流程:客户端通过管理模块调用采集、备份,服务器端通过管理模块调用入库。
1.字符流读文件,使用ObjectInputStream和ObjectOutputStream备份和向服务器发送文件。
BufferedReader br = new BufferedReader(new FileReader(file));
String st = null;
while(!(st=br.readLine())=null){}//使用readLine()一行一行读数据方便分割截取
2、split(“\|”)或者split(“[|]”)以|为界分割文件中内容,存入数组中即可依次放入想放入的变量中。
//调用split()方法按|分割存入sp集合
String[] sp = st.split("\\|");
调用split()方法按|分割存入sp集合
3.new Timestamp()将字符型的时间数据转换成时间戳。
在api中:使用毫秒时间值构造 Timestamp 对象。Timestamp(long time),括号内需将数据类型转换为long类型再使用
new Timestamp(Long.parseLong(date));
4.map.containsKey() 判断map集合中有无key值。
//判断有无重复key值
if(!map.containsKey(ip)){
map.put(ip, bidr);
}
判断有无重复key值,如果没有继续存入
5.时间戳相加减。
int time_deration =
(int)(bidr.getLogout_date().getTime()-bidr.getLogin_date().getTime());
这是登出时间戳减去登入时间戳
为了得到登录时长
6.Property中。
存放:setProperty(key值,values值)方法,也可以使用put(key值,values值)方法
读取:getProperty(key值)方法
7.将数据导入数据库时 使用conn.setAutoCommit(false)。
这句代码是将数据库插入的提交改成手动提交
这样一旦代码错误也不会错误的存入一部分数据致使还需要去删除之后重新插入
8.getDate()是一个已过时的方法。
字符类型时间戳.getDate() :将时间戳转换成一个月的第几天1-31
9.数据库插入完成后一定要关闭 在for循环里关闭是为了防止游标越界。
public void saveToDB(Collection<BIDR> arg0) throws Exception {
Connection conn = null;
PreparedStatement pst = null;
Class.forName(driver);
conn = DriverManager.getConnection(url,userName,passWord);
conn.setAutoCommit(false);//手动提交
List<BIDR> bidr = (List<BIDR>) arg0;
for(BIDR list:bidr){
String sql = "insert into t_detail_"+list.getLogin_date().getDate()
+ " values(?,?,?,?,?,?)";
pst = conn.prepareStatement(sql);
pst.setString(1, list.getAAA_login_name());
pst.setString(2, list.getLogin_ip());
pst.setTimestamp(3, list.getLogin_date());
pst.setTimestamp(4, list.getLogout_date());
pst.setString(5, list.getNAS_ip());
pst.setInt(6, list.getTime_deration()/1000/60);
pst.executeUpdate();
conn.commit();
pst.close();//游标越界
}
conn.close();
}
10.利用dom4j解析xml文件并利用反射实例化方法传入参数
代码块:
private static Properties pp ;//存储配置信息初始化
private static WossModule wossmodule = null;
private static Gather gather = null;
private static Map<String,WossModule> map =
new HashMap<String, WossModule>();
static{
try {
SAXReader reader = new SAXReader();//获得一个SAXReader对象
File file = new File("src/com/briup/file/conf.xml");
Document document = reader.read(file);//读取xml文件
Element rootElement = document.getRootElement();//获得document中的根节点
List<Element> elements = rootElement.elements();//获得根节点下面的所有子节点
for(Element e:elements){
String name = e.getName();
String clsName = e.attributeValue("class");
wossmodule = (WossModule)Class.forName(clsName).newInstance();
pp = new Properties();
List<Element> elements2 = e.elements();//获取子节点下的子节点
for(Element e2:elements2){
pp.setProperty(e2.getName(), e2.getText());
}
wossmodule.init(pp);
map.put(name, wossmodule);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//构造一个方法 传进元素名 返回子节点
//这样下面的方法就可以一一返回对应的值
public WossModule getwossmodule(String name){
WossModule wm = map.get(name);
return wm;
}
例如某个重写方法调用getwossmodule()方法
@Override
public BackUP getBackup() throws Exception {
return (BackUP)getwossmodule("backup");
}
这样就可以传入参数到该方法 重现对应类调用此方法
补充:
11. substring();
substring(int beginIndex),如果只有一个参数,返回一个新的字符串,它是此字符串的一个子字符串。这个子字符串从指定也就是参数表示的索引(下标)处的字符开始,直到此字符串末尾都截取。如”asdv”.substring(1)则返回”sdv”。
substring(int beginIndex, int endIndex) ,如果有两个参数,返回一个新的字符串,它是此字符串的一个子字符串。这个子字符串从指定也就是参数表示的索引(下标)处的字符开始,直到下一个参数表示的索引都截取。如”asdasdf”.substring(3,5)则返回”asd”。
12.ObjectInputStream和ObjectOutputStream流可以将整个集合例如ArrayList或HashMap集合进行传输。
//存储
@Override
public void store(String arg0, Object arg1, boolean arg2) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(path));
oos.writeObject(arg1);
oos.flush();
oos.close();
new LoggerImpl().warn("客户端备份完成");
这是备份模块部分代码 arg1传进来的参数正是一个map集合,而writeObject可以直接输出。
13.sql语句中的循环建表(针对该项目)。
BEGIN
FOR i IN 1..31 LOOP
EXECUTE IMMEDIATE
‘DROP TABLE t_detail_’||TO_CHAR(i);
END LOOP;
END;
/
BEGIN
FOR i IN 1..31 LOOP
EXECUTE IMMEDIATE
‘CREATE TABLE t_detail_’||TO_CHAR(i)||
‘(
aaa_login_name VARCHAR2(30),
login_ip VARCHAR2(32),
login_date DATE,
logout_date DATE,
nas_ip VARCHAR2(32),
time_duration NUMBER(10)
)’;
END LOOP;
END;
/
语句分两段,前者是检测是否有相同表,有则删除,后者则是循环建表。具有参考价值。