一、功能说明:
王大锤有一个非常喜欢的女神,为了保留和女神的每个瞬间,他想把和女神的聊天记录都保存到本地系统中,作为以后在一起的甜蜜回忆。
- 经过分析,他和女神的聊天信息库关键词对应关系如下:
| 王大锤常用语 | 女神常用语 |
|---|---|
| 干嘛 | 正要去洗澡… 正在吃饭… 正在和朋友在一起 |
| 红包 | 谢谢,那我不客气了,你早点休息 真的啊,大锤,你真好 大锤你真棒 |
| 睡觉 | 怎么了,不开心么 …你怎么回事 …是什么意思 |
- 王大锤常用语和女神常用语分别保存在大锤.txt和女神.txt文件里面,每句话占一行。
- 当王大锤发送的消息包含常用语的关键词时,女神会从自己的对应的常用语中随机选择一条回复王大锤,如果王大锤发送的消息不包含关键词,那么女神回复 “不想回答他的问题”,并且“结束聊天”。
二、思路
1. 聊天记录由于是按行读写的,可以使用字符缓冲流
2. 女神的聊天记录会根据大锤发送消息的关键词对应选取,可以把大锤的关键词作为key,女神的对应的回复列表最为value,存入map中
3. 聊天记录的保存要用到SimpleDateFormat,记录格式化好的时间,逐行写入到聊天记录文件中
三、代码实现
package com.feonix;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Scanner;
/**
* 聊天记录类
*
* @author FeoniX
*/
public class ChatLog {
public static void main(String[] args) {
System.out.println("欢迎来到珍爱网交友平台...");
Map<String, List<String>> msgMap = initData();
System.out.println(msgMap);
System.out.println("聊天开始:---");
System.out.println("聊天记录即将备份到文件,请输入文件名");
Scanner scanner = new Scanner(System.in);
String filename = scanner.next();
String msg = null;
boolean flag = true;
while (flag) {
System.out.print("王大锤:");
msg = scanner.next();
saveData("data/大锤语录/" + filename, "王大锤:" + msg);
msg = getReply(msgMap, msg);
// 如果女神回复null,输出默认内容,并结束聊天
if (msg == null) {
System.out.println("高圆圆:你在说什么,不想回答你");
saveData("data/大锤语录/" + filename, "高圆圆:你在说什么,不想回答你");
System.out.println("高圆圆:聊天到此结束!");
saveData("data/大锤语录/" + filename, "高圆圆:聊天到此结束!");
flag = false;
} else { // 否则输出女神回复的内容,聊天继续
System.out.println("高圆圆:" + msg);
saveData("data/大锤语录/" + filename, "高圆圆:" + msg);
}
}
scanner.close();
}
/**
* 获取女神回复
*
* @param msgMap
* @param msg
* @return
*/
private static String getReply(Map<String, List<String>> msgMap, String msg) {
List<String> vals = null;
// 遍历map
for (Entry<String, List<String>> set : msgMap.entrySet()) {
// 如果msg中包含 key关键词
if (msg.contains(set.getKey())) {
// 把对应的女神语录列表赋值给vals
vals = set.getValue();
// 找到了就不需要再循环下去了
break;
}
}
if (vals == null) {
// 如果没找到返回null
return null;
}
Random rand = new Random();
// 随机选取一句话
msg = vals.get(rand.nextInt(3));
// 返回女神的回复内容
return msg;
}
/**
* 初始化数据,生成大锤和女神聊天的关键词字典
*
* @return
*/
private static Map<String, List<String>> initData() {
// 存放大锤和女神聊天关键词对应关系的字典
Map<String, List<String>> map = new HashMap<String, List<String>>();
System.out.println("系统初始化中...");
List<String> listKeys = readData("data/大锤语录/大锤.log");
List<String> listValues = readData("data/大锤语录/女神.log");
List<String> vals;
// 遍历大锤语录
for (int i = 0; i < listKeys.size(); i++) {
// 初始化女神语录列表
vals = new ArrayList<String>();
// 二级循环,根据一级循环设置初始值和终值
for (int j = i * 3; j < i * 3 + 3; j++) {
// 获取一条女神语录,放入列表
vals.add(listValues.get(j));
}
// 添加到关键词字典
map.put(listKeys.get(i), vals);
}
// 返回关键词字典
return map;
}
/**
* 从文件中读取数据
*
* @param path
* @return
*/
private static List<String> readData(String path) {
List<String> data = new ArrayList<String>();
BufferedReader br = null;
try {
// 初始化字符缓冲输入流
br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
String linestr = null;
// 循环读取一行,判断是否不为空
while ((linestr = br.readLine()) != null) {
// 添加到data中
data.add(linestr);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
// 关闭字符缓冲输入流
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return data;
}
/**
* 保存聊天记录到文件
*
* @param path
* @param data
*/
private static void saveData(String path, String data) {
// 初始化格式化日期类
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
BufferedWriter bw = null;
try {
// 初始化字符缓冲输出流
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path, true), "UTF-8"));
// 写入一行
bw.write(sdf.format(new Date()) + " " + data);
// 换行
bw.newLine();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bw != null) {
try {
// 关闭字符缓冲输出流
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
四、演示效果图


好了,一个简单IO流的小应用分享给大家,写的不好大家请见谅~~~

本文介绍了一个简单的聊天记录备份小应用,通过IO流技术实现聊天记录的保存与管理,包括关键词匹配、随机回复及时间戳记录等功能。
2089

被折叠的 条评论
为什么被折叠?



