项目源代码可访问我的 github:https://github.com/Spacider/Gather-and-store
如果觉得好的话请给个 star 哦~
开发 IDE: IDEA 2018.03 JDK 1.8
开发环境: macOS 10.13.6 (如 windows 请对项目中部分路径进行改写)
数据库: Oracle 11g
第二阶段:数据的采集和写入日志文件
在 JAVA 实践项目---树莓派信息自动化采集后入库项目(二) 中我们从模拟的树莓派服务器上得到了我们需要采集的数据,接下来我们要干的事儿就是把得到的 XML 继续解析,等到相应的数据把其写入一个文件中!文件内容如下图所示:
话不多说,开始编写代码:
- 在我们的
SAXReaderHelper
类中编写方法InLogFile
:将获取到数据写入到日志文件中。
public static void InLogFile(String str,String SensorAddress,String counter){
}
它由 3 个参数,分别是我们读取的 XML 文件(通过流实际上使用的是 String 来接收),由于 SensorAddress
和 counter
参数返回的 XML 文件中没有这两个参数,所以我们通过传参的方式把这两个参数传入!
这里我们又用到了 dom4j 技术对其进行解析:
// 把客户端传过来的 xml 转化为字符串存储
String TotalStr = str.toString();
byte[] TotalBytes = TotalStr.getBytes();
// dom4j 构建对象内填入一个 byte 类型的数组
bais = new ByteArrayInputStream(TotalBytes);
SAXReader reader = new SAXReader();
Document document = null;
通过对象流的方式直接交给 dom4j:
try {
document = reader.read(bais,"utf-8");
}
有了 document
对象以后我们就可以解析了,接下来我们用一个 StringBuilder 来对字符串进行拼接,拼接成上图我们讲过的样子。最后加上 "\r\n"
,这样最后写入文件的时候每一条数据会换行。
// 获取根节点
Element Message = document.getRootElement();
StringBuilder sb = new StringBuilder();
// 拼接字符串
sb.append(Message.element("SrcID").getText()+"|");
sb.append(Message.element("DstID").getText()+"|");
sb.append(Message.element("DevID").getText()+"|");
sb.append(SensorAddress+"|");
sb.append(counter+"|");
sb.append(Message.element("Cmd").getText()+"|");
sb.append(Message.element("Data").getText()+"|");
sb.append(Message.element("Status").getText()+"|");
sb.append(new Timestamp(System.currentTimeMillis()));
sb.append("\r\n");
得到拼接好数据的字符串以后我们要做的就是写入文件了,这里用到了文件输出流,最后记得 flush
哦!刷一下内容才会进去
注意:请在 src 下先创建 radwtmp
文件,这里的 "/Users/wjh/Desktop/FirstProject/src/radwtmp"
路径为我电脑上路径,请改成你的路径!
File file = new File("/Users/wjh/Desktop/FirstProject/src/radwtmp");
if (!file.exists()){
file.createNewFile();
}
fos = new FileOutputStream(file,true);
fos.write(sb.toString().getBytes());
fos.flush();
- 封装好方法以后我们就可以调用它了,在
ClientReceiveHelper
的ClientGetXml
方法最后加入这么一行:
// 根据 XML 文件解析,并将其写入文件中
SAXReaderHelper.InLogFile(sb.toString(), SensorAddress, counter + "");
- 编写客户端主程序:
DataClient(温度湿度客户端),GuangClient(树莓派光照客户端),CarbonDioxideClient(二氧化碳客户端):
传入SensorAddress
为传感器 ID,16 表示温度湿度传感器,256 表示光照传感器,1280 表示二氧化碳传感器
public static void DataGetObj(){
ClientReceiveHelper.ClientGetXml("16",1);
}
public static void guangGetObj(){
ClientReceiveHelper.ClientGetXml("256",1);
}
public static void CarbonDioxideGetObj(){
ClientReceiveHelper.ClientGetXml("1280",1);
}
- 为了方便操作,我们设立一个定时器,编写一个定时器类:
public final class TimerRunClient {
public static void runClientMain() {
// 构建定时器
Timer timer = new Timer(false);
/**
* 第一个参数表示定时器执行的函数,第二个参数表示第一次定时器生效的时间,第三个参数表示每隔多长事件调用第一个参数所指向的方法
* 第二个参数和第三个参数单位是毫秒
*/
timer.schedule(new TimerTask() {
@Override
public void run() {
// 定时器调用的代码
DataClient.DataGetObj();
GuangClient.guangGetObj();
CarbonDioxideClient.CarbonDioxideGetObj();
}
}, 0, 5000);
}
public static void main(String[] args) {
runClientMain();
}
}
- 运行定时器类(TimerRunClient)和树莓派系统数据模拟类(DataServer),看到 radwtmp 类中数据如下图所示即为成功!
本文中为代码详解,可能与源代码不一定相同,可以查看我的 github:https://github.com/Spacider/Gather-and-store 查看源代码与你的代码进行比对!如果觉得我写的好的话请给一个 star 哦!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于