我的Java学习之路(11)-- IO模拟王大锤撩女神聊天记录

IO模拟王大锤撩女神聊天记录

  • 一、功能说明:
  • 二、思路
  • 三、代码实现
  • 四、演示效果图

一、功能说明:

王大锤有一个非常喜欢的女神,为了保留和女神的每个瞬间,他想把和女神的聊天记录都保存到本地系统中,作为以后在一起的甜蜜回忆。

  • 经过分析,他和女神的聊天信息库关键词对应关系如下:
王大锤常用语 女神常用语
干嘛 正要去洗澡…
正在吃饭…
正在和朋友在一起
红包 谢谢,那我不客气了,你早点休息
真的啊,大锤,你真好
大锤你真棒
睡觉 怎么了,不开心么
…你怎么回事
…是什么意思
  • 王大锤常用语和女神常用语分别保存在大锤.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();
				}
			}
		}
	}
}

四、演示效果图

我的Java学习之路(11)-- IO模拟王大锤撩女神聊天记录_第1张图片
我的Java学习之路(11)-- IO模拟王大锤撩女神聊天记录_第2张图片


好了,一个简单IO流的小应用分享给大家,写的不好大家请见谅~~~
我的Java学习之路(11)-- IO模拟王大锤撩女神聊天记录_第3张图片

你可能感兴趣的:(Java)