文章目录
- 一、基本任务:(实现代码包括了三个需要编写的方法)
- 1.先创建一个Log类
- 2.实现代码
- 二、贯穿任务(物流管理系统)
- 任务1-1升级实体类为可序列化的类,以便在文件中保存或网络中传递。
- DataBase.java
- LogRec.java
- MatchedLogRec.java
- Transport.java
- MatchedTransport.java
- 任务1-2 实现匹配的日志信息的保存和读取功能。
- LogRecService.java
- 任务1-3 实现匹配的物流信息的保存和读取功能。
- TransportService.java
- 任务1-4 测试匹配的日志、物流信息的保存和读取功能。
- FileDemo.java
实训一下载地址:https://picture.hs-vae.com/practice1.zip
里面包含了com.qst.dms包,log.txt文件,以及实验报告
个人博客里面有其他java的知识,欢迎访问哦
一、基本任务:(实现代码包括了三个需要编写的方法)
提醒一下:我写class的属于vae项目里面,我这里为了使用相对路径简便,把log.txt文件放在vae项目里,这样在写路径的时候可以直接写"log.txt"
- 完成如下图所示log.txt日志文件的分析,编写方法分析访问量排名前10的IP地址打印输出。
- 编写方法读取日志文件分析出有哪几种不同的错误异常。
3)编写方法完成日志文件的字段对象封装,完成对象的序列化。
1.先创建一个Log类
package Demo5Experiment.Demo1;
import java.io.Serializable;
//对log.txt日志文件的字段进行对象封装
public class Log implements Serializable { //序列化和反序列化的时候,会抛出NotSerializableException没有序列化异常
private static final long serialVersiouUID=1L; //可以解决序列化冲突异常
private String name;
private String time;
private String Ip;
private String status;
private String information;
public String getName() {
return name;
}
@Override
public String toString() {
return "Log{" +
"name='" + name + '\'' +
", time='" + time + '\'' +
", Ip='" + Ip + '\'' +
", status='" + status + '\'' +
", information='" + information + '\'' +
'}';
}
public Log(String name, String time, String Ip, String status, String information) {
this.name = name;
this.time=time;
this.Ip=Ip;
this.status=status;
this.information=information;
}
public Log(String s) {
}
public String getIp() {
return Ip;
}
public String getInformation() {
return information;
}
public void setInformation(String information) {
this.information = information;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public void setIp(String ip) {
Ip = ip;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public void setName(String name) {
this.name = name;
}
}
2.实现代码
package Demo5Experiment.Demo1;
/*
实验一基本任务:
1.打印排名前十IP地址
2.输出不同的"ERROR"异常信息
3.对象序列化
*/
import java.io.*;
import java.util.*;
public class Demo1Experiment {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.打印排名前十IP地址
printIp(new FileReader("log.txt"));
//2.输出不同的异常信息
printError(new FileReader("log.txt"));
//3.Log对象的序列化
objectLog(new FileReader("log.txt"),new FileOutputStream("objectlog.txt"),new FileInputStream("objectlog.txt"));
}
//1.构造printIp方法
private static void printIp(FileReader file) throws IOException {
BufferedReader br = new BufferedReader(file);
String line;
System.out.println("访问量排名前十的IP地址:");
for (int i = 0; i < 10; i++) {
line = br.readLine();
String[] arr=line.split(",",5);
System.out.println(arr[2]);
}
br.close();
}
//2.构造printError方法
private static void printError(FileReader file) throws IOException {
BufferedReader br = new BufferedReader(file);
ArrayList<String> list=new ArrayList<>(); //存储"ERROR"和"LOG"
Set<String> set=new HashSet<String>(); //Hashset类比较特殊,可以去重,所以可以采用add方法解决异常信息重复问题
String line;
int i=0;
while ((line = br.readLine()) != null) {
String[] arr = line.split("\\,",5);
list.add(arr[3]);
if(list.get(i).trim().equals("ERROR")){ //注意这里得利用String类的trim除去空格,而且需要equals方法判断是否相等(因为存储的还是地址值),而不是==
set.add(arr[4]);
}
++i;
}
System.out.println("错误异常信息:");
for(String s:set){
System.out.println(s); //Hashset由于没有索引值,只能用加强的for循环和迭代器来遍历
}
br.close();
}
//3.构造对象序列化objectLog方法
private static void objectLog(FileReader file1,FileOutputStream file2,FileInputStream file3) throws IOException, ClassNotFoundException {
ObjectOutputStream oos =new ObjectOutputStream(file2);
BufferedReader br =new BufferedReader(file1);
ObjectInputStream ois = new ObjectInputStream(file3);
ArrayList<Log> list =new ArrayList<>(); //用来存储Log对象
String line;
//序列化,先将该文件以','隔开切割成5份,然后添加到ArrayList类型的list集合中去,通过遍历对list集合进行序列化
while ((line = br.readLine()) != null) {
String[] arr = line.split(",",5);
list.add(new Log(arr[0],arr[1],arr[2],arr[3],arr[4])); //添加name
}
for (int i = 0; i < list.size(); i++) {
oos.writeObject(list);
}
//反序列化,打印输出出来
Object o=ois.readObject();
ArrayList<Log> a=(ArrayList<Log>)o; //Object类型的集合转换为ArrayList类型
System.out.println("序列化后:");
for (Log p:a){
System.out.println(p);
}
//释放资源
oos.close();
br.close();
ois.close();
}
}
二、贯穿任务(物流管理系统)
- 【任务1-1】 升级实体类为可序列化的类,以便在文件中保存或网络中传递。
DataBase.java
LogRec.java
MatchedLogRec.java
Transport.java
MatchedTransport.java
- 【任务1-2】 实现匹配的日志信息的保存和读取功能。
LogRecService.java
- 【任务1-3】 实现匹配的物流信息的保存和读取功能。
TransportService.java
- 【任务1-4】测试匹配的日志、物流信息的保存和读取功能。
FileDemo.java
任务1-1升级实体类为可序列化的类,以便在文件中保存或网络中传递。
DataBase.java
package com.qst.dms.entity;
import java.io.Serializable;
import java.util.Date;
//数据基础类
public class DataBase implements Serializable{
// ID标识
private int id;
// 时间
private Date time;
// 地点
private String address;
// 状态
private int type;
// 状态常量
public static final int GATHER=1;//"采集"
public static final int MATHCH=2;//"匹配";
public static final int RECORD=3;//"记录";
public static final int SEND=4;//"发送";
public static final int RECIVE=5;//"接收";
public static final int WRITE=6;//"归档";
public static final int SAVE=7;//"保存";
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public DataBase() {
}
public DataBase(int id, Date time, String address, int type) {
this.id = id;
this.time = time;
this.address = address;
this.type = type;
}
public String toString() {
return id + "," + time + "," + address + "," + type;
}
}
LogRec.java
package com.qst.dms.entity;
import java.io.Serializable;
import java.util.Date;
//用户登录日志记录
public class LogRec extends DataBase implements Serializable{
/**
* 登录用户名
*/
private String user;
/**
* 登录用户主机IP地址
*/
private String ip;
/**
* 登录状态:登录、登出
*/
private int logType;
/**
* 登录常量LOG_IN、登出常量常量LOG_OUT
*/
public static final int LOG_IN=1;
public static final int LOG_OUT=0;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getLogType() {
return logType;
}
public void setLogType(int logType) {
this.logType = logType;
}
public LogRec() {
}
public LogRec(int id, Date time, String address, int type,String user,String ip,int logType) {
super(id,time,address,type);
this.user=user;
this.ip=ip;
this.logType=logType;
}
public String toString() {
return this.getId() + "," +this.getTime() + "," +this.getAddress() + "," + this.getType() + ","+user+","+ip+","+logType;
}
}
MatchedLogRec.java
package com.qst.dms.entity;
import java.io.Serializable;
import java.util.Date;
//匹配日志记录,"登录登出对" 类型
public class MatchedLogRec implements Serializable{
private LogRec login;
private LogRec logout;
// user用户登录名
public String getUser() {
return login.getUser();
}
// 登入时刻
public Date getLogInTime() {
return login.getTime();
}
// 登出时刻
public Date getLogoutTime() {
return logout.getTime();
}
// 登入记录
public LogRec getLogin() {
return login;
}
// 登出记录
public LogRec getLogout() {
return logout;
}
public MatchedLogRec() {
}
public MatchedLogRec(LogRec login, LogRec logout) {
if (login.getLogType() != LogRec.LOG_IN) {
throw new RuntimeException("不是登录记录!");
}
if (logout.getLogType() != LogRec.LOG_OUT) {
throw new RuntimeException("不是登出记录");
}
if (!login.getUser().equals(logout.getUser())) {
throw new RuntimeException("登录登出必须是同一个用户!");
}
if (!login.getIp().equals(logout.getIp())) {
throw new RuntimeException("登录登出必须是同一个IP地址!");
}
this.login = login;
this.logout = logout;
}
public String toString() {
return login.toString() + " | " + logout.toString();
}
}
Transport.java
package com.qst.dms.entity;
import java.io.Serializable;
import java.util.Date;
//货运物流信息
public class Transport extends DataBase implements Serializable{
/**
* 经手人
*/
private String handler;
/**
* 收货人
*/
private String reciver;
/**
* 物流状态
*/
private int transportType;
/**
* 物流状态常量:发货中, 送货中, 已签收
*/
public static final int SENDDING = 1;// 发货中
public static final int TRANSPORTING = 2;// 送货中
public static final int RECIEVED = 3;// 已签收
public String getHandler() {
return handler;
}
public void setHandler(String handler) {
this.handler = handler;
}
public String getReciver() {
return reciver;
}
public void setReciver(String reciver) {
this.reciver = reciver;
}
public int getTransportType() {
return transportType;
}
public void setTransportType(int transportType) {
this.transportType = transportType;
}
public Transport() {
}
public Transport(int id, Date time, String address, int type,
String handler, String reciver, int transportType) {
super(id, time, address, type);
this.handler = handler;
this.reciver = reciver;
this.transportType = transportType;
}
public String toString() {
return this.getId() + "," + this.getTime() + "," + this.getAddress()
+ "," + this.getType() + "," + handler + "," + transportType;
}
}
MatchedTransport.java
package com.qst.dms.entity;
import java.io.Serializable;
public class MatchedTransport implements Serializable{
private Transport send;
private Transport trans;
private Transport receive;
public Transport getSend() {
return send;
}
public void setSend(Transport send) {
this.send = send;
}
public Transport getTrans() {
return trans;
}
public void setTrans(Transport trans) {
this.trans = trans;
}
public Transport getReceive() {
return receive;
}
public void setReceive(Transport receive) {
this.receive = receive;
}
public MatchedTransport() {
}
public MatchedTransport(Transport send, Transport trans, Transport receive) {
if (send.getTransportType() != Transport.SENDDING) {
throw new RuntimeException("不是发货记录!");
}
if (trans.getTransportType() != Transport.TRANSPORTING) {
throw new RuntimeException("不是送货记录!");
}
if (receive.getTransportType() != Transport.RECIEVED) {
throw new RuntimeException("不是签收记录!");
}
this.send = send;
this.trans = trans;
this.receive = receive;
}
public String toString() {
// TODO Auto-generated method stub
return send.toString() + "|" + trans.toString() + "|" + receive;
}
}
任务1-2 实现匹配的日志信息的保存和读取功能。
LogRecService.java
package com.qst.dms.service;
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;
import com.qst.dms.entity.DataBase;
import com.qst.dms.entity.LogRec;
import com.qst.dms.entity.MatchedLogRec;
//日志业务类
public class LogRecService {
// 日志数据采集
public LogRec inputLog() {
LogRec log = null;
// 建立一个从键盘接收数据的扫描器
Scanner scanner = new Scanner(System.in);
try {
// 提示用户输入ID标识
System.out.println("请输入ID标识: ");
// 接收键盘输入的整数
int id = scanner.nextInt();
// 获取当前系统时间
Date nowDate = new Date();
// 提示用户输入地址
System.out.println("请输入地址:");
// 接收键盘输入的字符串信息
String address = scanner.next();
// 数据状态是“采集”
int type = DataBase.GATHER;
// 提示用户输入登录用户名
System.out.println("请输入 登录用户名:");
// 接收键盘输入的字符串信息
String user = scanner.next();
// 提示用户输入主机IP
System.out.println("请输入 主机IP:");
// 接收键盘输入的字符串信息
String ip = scanner.next();
// 提示用户输入登录状态、登出状态
System.out.println("请输入登录状态:1是登录,0是登出");
int logType = scanner.nextInt();
// 创建日志对象
log = new LogRec(id, nowDate, address, type, user, ip, logType);
} catch (Exception e) {
System.out.println("采集的日志信息不合法");
}
// 返回日志对象
return log;
}
// 日志信息输出
public void showLog(LogRec... logRecs) {
for (LogRec e : logRecs) {
if (e != null) {
System.out.println(e.toString());
}
}
}
// 匹配日志信息输出,可变参数
public void showMatchLog(MatchedLogRec... matchLogs) {
for (MatchedLogRec e : matchLogs) {
if (e != null) {
System.out.println(e.toString());
}
}
}
// 匹配日志信息输出,参数是集合
public void showMatchLog(ArrayList<MatchedLogRec> matchLogs) {
for (MatchedLogRec e : matchLogs) {
if (e != null) {
System.out.println(e.toString());
}
}
}
// 匹配日志信息保存,参数是集合
public void saveMatchLog(ArrayList<MatchedLogRec> matchLogs) throws IOException, ClassNotFoundException {
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("matchlog.txt"));
for(MatchedLogRec e:matchLogs){
if (e!=null){
oos.writeObject(e);
}
}
oos.writeObject(null); //文件末尾加一个null,标记着结束
oos.flush();
oos.close();
}
// 读匹配日志信息保存,参数是集合
public ArrayList<MatchedLogRec> readMatchLog() throws IOException, ClassNotFoundException {
ArrayList<MatchedLogRec> matchLogs=new ArrayList<>();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("matchlog.txt"));
MatchedLogRec matchLog;
while ((matchLog=(MatchedLogRec)ois.readObject())!=null){
matchLogs.add(matchLog);
}
ois.close();
return matchLogs;
}
}
任务1-3 实现匹配的物流信息的保存和读取功能。
TransportService.java
package com.qst.dms.service;
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;
import com.qst.dms.entity.DataBase;
import com.qst.dms.entity.MatchedLogRec;
import com.qst.dms.entity.MatchedTransport;
import com.qst.dms.entity.Transport;
public class TransportService {
// 物流数据采集
public Transport inputTransport() {
Transport trans = null;
// 建立一个从键盘接收数据的扫描器
Scanner scanner = new Scanner(System.in);
try{
// 提示用户输入ID标识
System.out.println("请输入ID标识:");
// 接收键盘输入的整数
int id = scanner.nextInt();
// 获取当前系统时间
Date nowDate = new Date();
// 提示用户输入地址
System.out.println("请输入地址:");
// 接收键盘输入的字符串信息
String address = scanner.next();
// 数据状态是“采集”
int type = DataBase.GATHER;
// 提示用户输入登录用户名
System.out.println("请输入货物经手人:");
// 接收键盘输入的字符串信息
String handler = scanner.next();
// 提示用户输入主机IP
System.out.println("请输入 收货人:");
// 接收键盘输入的字符串信息
String reciver = scanner.next();
// 提示用于输入物流状态
System.out.println("请输入物流状态:1发货中,2送货中,3已签收");
// 接收物流状态
int transportType = scanner.nextInt();
// 创建物流信息对象
trans = new Transport(id, nowDate, address, type, handler, reciver,
transportType);
} catch (Exception e) {
System.out.println("采集的日志信息不合法");
}
// 返回物流对象
return trans;
}
// 物流信息输出
public void showTransport(Transport... transports) {
for (Transport e : transports) {
if (e != null) {
System.out.println(e.toString());
}
}
}
// 匹配的物流信息输出,可变参数
public void showMatchTransport(MatchedTransport... matchTrans) {
for (MatchedTransport e : matchTrans) {
if (e != null) {
System.out.println(e.toString());
}
}
}
// 匹配的物流信息输出,参数是集合
public void showMatchTransport(ArrayList<MatchedTransport> matchTrans) {
for (MatchedTransport e : matchTrans) {
if (e != null) {
System.out.println(e.toString());
}
}
}
// 匹配物流信息保存,参数是集合
public void saveMatchedTransport(ArrayList<MatchedTransport> matchTrans) throws IOException {
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("matchtrans.txt"));
for (MatchedTransport e:matchTrans) {
if(e!=null){
oos.writeObject(e);
}
}
oos.writeObject(null); //文件末尾加一个null,标记着结束
oos.flush();
oos.close();
}
// 读匹配物流信息保存,参数是集合
public ArrayList<MatchedTransport> readMatchedTransport() throws IOException, ClassNotFoundException {
ArrayList<MatchedTransport> matchTrans=new ArrayList<>();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("matchtrans.txt"));
MatchedTransport matchTran;
while ((matchTran=(MatchedTransport) ois.readObject())!=null){
matchTrans.add(matchTran);
}
ois.close();
return matchTrans;
}
}
任务1-4 测试匹配的日志、物流信息的保存和读取功能。
FileDemo.java
package com.qst.dms.dos;
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import com.qst.dms.entity.DataBase;
import com.qst.dms.entity.LogRec;
import com.qst.dms.entity.MatchedLogRec;
import com.qst.dms.entity.MatchedTransport;
import com.qst.dms.entity.Transport;
import com.qst.dms.service.LogRecService;
import com.qst.dms.service.TransportService;
public class FileDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 创建一个日志业务类
LogRecService logService = new LogRecService();
ArrayList<MatchedLogRec> matchLogs = new ArrayList<>();
matchLogs.add(new MatchedLogRec(
new LogRec(1001, new Date(), "青島",DataBase.GATHER, "zhangsan", "192.168.1.1", 1),
new LogRec(1002, new Date(), "青島", DataBase.GATHER, "zhangsan", "192.168.1.1", 0)));
matchLogs.add(new MatchedLogRec(
new LogRec(1003, new Date(), "北京",DataBase.GATHER, "lisi", "192.168.1.6", 1),
new LogRec(1004, new Date(), "北京", DataBase.GATHER, "lisi", "192.168.1.6", 0)));
matchLogs.add(new MatchedLogRec(
new LogRec(1005, new Date(), "济南",DataBase.GATHER, "wangwu", "192.168.1.89", 1),
new LogRec(1006, new Date(), "济南", DataBase.GATHER, "wangwu", "192.168.1.89", 0)));
//保存匹配的日志信息到文件中
logService.saveMatchLog(matchLogs);
//从文件中读取匹配的日志信息
ArrayList<MatchedLogRec> logList=logService.readMatchLog();
System.out.println("-------------------------日志信息-------------------------");
logService.showMatchLog(logList);
// 创建一个物流业务类
TransportService tranService = new TransportService();
ArrayList<MatchedTransport> matchTrans = new ArrayList<>();
matchTrans.add(new MatchedTransport(
new Transport(2001, new Date(), "青島",DataBase.GATHER,"zhangsan","zhaokel",1),
new Transport(2002, new Date(), "北京",DataBase.GATHER,"lisi","zhaokel",2),
new Transport(2003, new Date(), "北京",DataBase.GATHER,"wangwu","zhaokel",3)));
matchTrans.add(new MatchedTransport(
new Transport(2004, new Date(), "青島",DataBase.GATHER,"maliu","zhaokel",1),
new Transport(2005, new Date(), "北京",DataBase.GATHER,"sunqi","zhaokel",2),
new Transport(2006, new Date(), "北京",DataBase.GATHER,"fengba","zhaokel",3)));
//保存匹配的物流信息到文件中
tranService.saveMatchedTransport(matchTrans);
//从文件中读取匹配的物流信息
ArrayList<MatchedTransport> tranList=tranService.readMatchedTransport();
System.out.println("--------------------------物流信息------------------------");
tranService.showMatchTransport(tranList);
}
}