我的Java學習之路(11)-- 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();
				}
			}
		}
	}
}

四、演示效果圖

在這裏插入圖片描述
在這裏插入圖片描述


好了,一個簡單IO流的小應用分享給大家,寫的不好大家請見諒~~~
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章