本文要解决的问题:“键盘输入一段英语语句,将这段话写入content.txt中,然后输出这段话,并且统计语句中英文单词的数目以及各个单词出现的次数。”

分析问题知,核心是文件读写和单词统计。

单词统计可以参考我以前的一篇文章:java源码——统计字符串中字符出现的次数,不过要注意的是以前这篇文章是统计字符,不用判断是否是单词,本问题中统计单词就要判断多少字符是一个单词,同时忽略大小写问题。

文件读写不是很难,方法基本是死的,不用考虑方法。代码解决问题的难点还是单词的统计,我的代码中用了正则表达式匹配:"[a-zA-Z]+",这个能匹配所有英文单词。

下面上代码。

Filereadwrite.java

/**
 * <p>Title: Filereadwrite.java</p>
 * <p>Description: </p>
 * 
 * @author fuxuemingzhu
 *
 * @email fuxuemingzhu@163.com
 *
 * @date 2014年12月5日  下午4:05:40
 * @version 1.0
 */
package com.fuxuemingzhu.filereadwrite.main;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * <p>
 * Title: FileReadWrite
 * </p>
 * <p>
 * Description:由键盘输入文字,保存到相应目录下的txt中。由txt中读取内容并且进行单词统计
 * </p>
 * 
 * @author fuxuemingzhu
 * 
 * @email fuxuemingzhu@163.com
 * 
 * @date 2014年12月5日 下午4:05:40
 */
public class FileReadWrite {

	/**
	 * inputString 键盘输入的字符串
	 */
	public static String inputString = new String();

	/**
	 * filePath 文件存储路径
	 */
	public static String filePath = new String("E:/学习/java/content.txt");

	/**
	 * fileContent 文件内容
	 * 
	 */
	public static String fileContent = new String();

	/**
	 * wordsCount 存放单词和其对应数目的HashMap
	 */
	public static HashMap<String, Integer> wordsCount = new HashMap<String, Integer>();

	/**
	 * <p>
	 * Title: main
	 * </p>
	 * <p>
	 * Description:main方法,程序的入口
	 * </p>
	 * 
	 * @param args
	 * 
	 */
	public static void main(String[] args) {
		input();
		try {
			writeFile(inputString, filePath);
			fileContent = readFile(new File(filePath));
		} catch (Exception e) {
			e.printStackTrace();
		}
		output(fileContent);
	}

	/**
	 * <p>
	 * Title: input
	 * </p>
	 * <p>
	 * Description:由键盘输入文字
	 * </p>
	 * 
	 */
	public static void input() {
		System.out.println("请输入要保存到txt中的内容:");
		Scanner scanner = new Scanner(System.in);
		inputString = scanner.nextLine();
		scanner.close();
		System.out.println("文本扫描成功!");
	}

	/**
	 * <p>
	 * Title: output
	 * </p>
	 * <p>
	 * Description:读取txt,并且统计输出单词和其对应数目
	 * </p>
	 * 
	 * @param outputString
	 * 
	 */
	public static void output(String outputString) {
		System.out.println("您输入的文本由txt中读取出来咯,内容是:");
		System.out.println(outputString);
		countWords();
		System.out.println("输入的文本中共有" + wordsCount.size() + "个英语单词。");
		System.out.println("统计分析如下(已忽略大小写):");
		for (Iterator<String> iterator = wordsCount.keySet().iterator(); iterator
				.hasNext();) {
			String words = (String) iterator.next();
			int num1 = wordsCount.get(words);
			System.out.println("\"" + words + "\"出现了" + num1 + "次");
		}
	}

	/**
	 * <p>
	 * Title: countWords
	 * </p>
	 * <p>
	 * Description:用HashMap保存每个单词出现的次数
	 * </p>
	 * 
	 */
	public static void countWords() {
		Pattern expression = Pattern.compile("[a-zA-Z]+");// 定义正则表达式匹配单词
		String string1 = fileContent.toLowerCase();// 转换成小写
		Matcher matcher = expression.matcher(string1);
		String word = null;// 文章中的单词
		while (matcher.find()) {// 是否匹配单词
			word = matcher.group();// 得到一个单词-树映射的键
			if (wordsCount.containsKey(word)) {
				wordsCount.put(word, wordsCount.get(word) + 1);
			} else {
				wordsCount.put(word, 1);
			}
		}
	}

	/**
	 * <p>
	 * Title: writeFile
	 * </p>
	 * <p>
	 * Description:写入文件
	 * </p>
	 * 
	 * @param str
	 *            要保存的内容
	 * @param savePath
	 *            保存的文件路径
	 * @throws Exception
	 *             找不到路径
	 * 
	 */
	public static void writeFile(String str, String savePath) throws Exception {
		System.out.println("txt保存路径是:" + savePath);
		BufferedWriter bw = new BufferedWriter(new FileWriter(savePath));
		System.out.println("txt创建成功!");
		bw.write(str);
		System.out.println("文本内容存储到txt中成功!");
		bw.close();

	}

	/**
	 * <p>
	 * Title: readFile
	 * </p>
	 * <p>
	 * Description:读取文件
	 * </p>
	 * 
	 * @param file
	 * @return 文件内容
	 * @throws Exception
	 * 
	 */
	public static String readFile(File file) throws Exception {
		BufferedReader br = new BufferedReader(new FileReader(file));
		System.out.println("打开文件成功!");
		StringBuffer sbf = new StringBuffer("");
		String line = null;
		while ((line = br.readLine()) != null) {
			sbf.append(line).append("\r\n");// 按行读取,追加换行\r\n
		}
		System.out.println("文件内容读取成功!");
		br.close();
		return sbf.toString();
	}
}
 
 附上运行效果图。


Java 文件读写漏洞 java中读写文件_System


另外附上在指定位置生成的content.txt文件夹的截图。

Java 文件读写漏洞 java中读写文件_java_02


content.txt打开效果,说明已经把键盘输入的内容写入到指定的txt文件中,并且单词统计时能够匹配到所有英语单词,非英文单词没有进行匹配。

Java 文件读写漏洞 java中读写文件_键盘输入_03