一、功能說明:
王大錘有一個非常喜歡的女神,爲了保留和女神的每個瞬間,他想把和女神的聊天記錄都保存到本地系統中,作爲以後在一起的甜蜜回憶。
- 經過分析,他和女神的聊天信息庫關鍵詞對應關係如下:
王大錘常用語 | 女神常用語 |
---|---|
幹嘛 | 正要去洗澡… 正在喫飯… 正在和朋友在一起 |
紅包 | 謝謝,那我不客氣了,你早點休息 真的啊,大錘,你真好 大錘你真棒 |
睡覺 | 怎麼了,不開心麼 …你怎麼回事 …是什麼意思 |
- 王大錘常用語和女神常用語分別保存在大錘.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流的小應用分享給大家,寫的不好大家請見諒~~~