本文要解决的问题:“键盘输入一段英语语句,将这段话写入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();
}
}

附上运行效果图。

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

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

java源码——文件读写和单词统计的更多相关文章

  1. OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)

    在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件  ...

  2. OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构

    最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...

  3. Android反编译(一)之反编译JAVA源码

    Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具  dex2jar   http://code.go ...

  4. 解密随机数生成器(二)——从java源码看线性同余算法

    Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...

  5. Java--Eclipse关联Java源码

    打开Eclipse,Window->Preferences->Java 点Edit按钮后弹出: 点Source Attachment后弹出: 选择Java安装路径下的src.zip文件即可 ...

  6. 使用JDT.AST解析java源码

    在做java源码的静态代码审计时,最基础的就是对java文件进行解析,从而获取到此java文件的相关信息: 在java文件中所存在的东西很多,很复杂,难以用相关的正则表达式去一一匹配.但是,eclip ...

  7. 2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码

    此文是前文使用现有在线翻译服务进行代码翻译的体验的编程语言方面第二点的一个尝试. 参考Which framework to generate source code ? - Cleancode and ...

  8. 如何阅读Java源码?

    阅读本文大概需要 3.6 分钟. 阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃< ...

  9. 2018-09-24 Java源码英翻中网页演示

    在线演示地址: 源代码翻译 两部分如下. 独立的Java代码翻译库 续前文代码翻译尝试-使用Roaster解析和生成Java源码 源码库: program-in-chinese/java_code_t ...

随机推荐

  1. Python基础之数字类型内置方法

    目录 1. 整型内置方法(int) 2. 浮点型内置方法 3. 常用操作 1. 整型内置方法(int) 用途:年龄,号码,等级等 定义: age = 18 常用操作 # 算数运算.比较运算 age = ...

  2. go 函数进阶

    目录 回调函数和闭包 高阶函数示例 回调函数(sort.SliceStable) 闭包 最佳闭包实例 回调函数和闭包 当函数具备以下两种特性的时候,就可以称之为高阶函数(high order func ...

  3. day6 基本数据类型及内置方法

    day6 基本数据类型及内置方法 一.10进制转其他进制 1. 十进制转二进制 print(bin(11)) #0b1011 2. 十进制转八进制 print(hex(11)) #0o13 3. 十进 ...

  4. Oracle—全局变量

    Oracle全局变量 一.数据库程序包全局变量       在程序实现过程中,经常用遇到一些全局变量或常数.在程序开发过程中,往往会将该变量或常数存储于临时表或前台程序的全局变量中,由此带来运行效率降 ...

  5. Rust 总章

    1.1 Rust安装 3.5 Rust Generic Types, Traits, and Lifetimes 3.6 String 与 切片&str的区别 https://openslr. ...

  6. 理解inode以及软硬连接,和inode磁盘爆满的解决方案以及文件权限

    理解Linux的软硬链接 创建硬链接的命令 [root@centos6 data]#ln /data/f1 /data/f2 [root@centos6 data]#ll -itotal 1613 - ...

  7. oracle name

    1.db_name 数据库名 SQL> connect xys/manager as sysdba 已连接. SQL> show user USER 为 "SYS" S ...

  8. Spring MVC入门(二)—— URI Builder模式

    URI Builder Spring MVC作为一个web层框架,避免不了处理URI.URL等和HTTP协议相关的元素,因此它提供了非常好用.功能强大的URI Builder模式来完成,这就是本文重点 ...

  9. Python基础入门(5)- 函数的定义与使用

    定义函数 函数的定义 函数的分类 函数的创建方法 函数的返回return 函数的定义 将一件事情的步骤封装在一起并得到最终结果 函数名代表了这个函数要做的事情 函数体是实现函数功能的流程 函数可以帮助 ...

  10. 阿里云RDS备份 恢复到本地

    目录 一.恢复准备 二.具体操作 一.恢复准备 阿里云RDS默认配置了全备份+binlog,可以精准恢复到某个时间点上. 可以下载备份的包到本地,进行本地恢复,要预留好本地的数据库容量和cpu等规格, ...