该项目一共有六个模块,涉及到的技术有;
反射,IO,网络编程,多线程,数据库连接池,预编译+批处理+手动提交,maven,svn
- 采集模块
- 网络模块
- 入库模块
- 日志模块
- 备份模块
- 配置模块
采集模块需求分析:
通过java中IO读取数据文件,将信息封装成环境数据的集合对象。
1. 使用IO流 读取本地文件
2. 读取到数据的每一行进行解析。
3. 对一行数据先拆分成9个部分。每个部分数据对应一个属性值。
4. 一行数据封装成一个ENV对象。
5. 将ENV对象保存在一个集合对象,作为返回结果
6. 将拆分读取到数据保存在对象的属性中
public Collection<Environment> gather() throws Exception {
log.info("开始采集数据");
//使用字符缓存输入流读取数据文件中每一行
List<Environment> list = new ArrayList<>();
//读取文件前先进行文件的判断
File file = new File(fileName);
if(!file.exists()){
throw new GatherException("数据文件不存在,无法采集");
}
BufferedReader br = new BufferedReader(new FileReader(fileName));
String line = null;//每行数据
//获取每次文件的内容的大小
FileInputStream fis = new FileInputStream(fileName);
int size = fis.available();//本次读取数据文件的大小
log.debug("本次读取数据大小:"+size);
//获取保存在文件中的上次读取的数据字节大小
//当第一次读取没有备份的数据
Object o = backup.load(backupFile, Backup.LOAD_UNREMOVE);
if(o != null){
//获取到上次的备份的大小
int beforeSize = (int) o;
br.skip(beforeSize);//跳过上次读取过的数据
log.debug("上次读取文件的大小:"+beforeSize);
}
//继续读取剩余的环境数据
while((line = br.readLine()) != null){
//根据分隔符拆分数据
String[] arr = line.split("[|]");
if(arr.length != 9){
//当读取文件内容空行
continue;
}
//将数组元素添加到环境对象中,环境对象的属性值
Environment env = new Environment();
init(env,arr);
//根据传感器编号判断,对name和data进行赋值
switch (arr[3]) {
case "16":
env.setName("温度");
//57a4 ---10进制 --》公式计算
env.setData((Integer.parseInt(arr[6].substring(0,4),16) * (0.00268127F))-46.85F);
//当传感器为温湿度时,需要新增一个环境对象表示湿度
Environment humidityEnv = new Environment();
init(humidityEnv,arr);
humidityEnv.setData((Integer.parseInt(arr[6].substring(4,8),16) *0.00190735F)-6);
humidityEnv.setName("湿度");
list.add(humidityEnv);
break;
case "256":
env.setName("光照强度");
//arr[6]---substr---String(16进制)---int10进制--->float
env.setData(Integer.parseInt(arr[6].substring(0,4),16));
break;
case "1280":
env.setName("二氧化碳");
env.setData(Integer.parseInt(arr[6].substring(0,4),16));
break;
default:
throw new GatherException("数据存在问题");
}
list.add(env);
}
//使用备份模块记录下当前文件中已经读取文件大小的标志
backup.store(backupFile,size,Backup.STORE_OVERRIDE);
log.info("完成采集数据"