本文要解决的问题:“键盘输入一段英语语句,将这段话写入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. 【Linux】tmux安装(非root)及其使用

    tmux(terminal multiplexer)是Linux上的终端复用神器. 1. 安装 (1)下载 下载及其依赖软件. wget -c https://github.com/tmux/tmux ...

  2. Linux内网时钟同步问题(ntp和chrony)

    我们都知道时钟同步可以使用外网服务器,在内网内不能连接外网的时候也需要时钟同步,那怎么进行呢? 选择内网的一台稳定的服务器作为时钟源,然后让其他机器都来同步这台机器即可. 注:其实ntp服务和chro ...

  3. Macbookpro vim操作键说明

    i → Insert 模式,按 ESC 回到 Normal 模式. x → 删当前光标所在的一个字符.:wq → 存盘 + 退出 (:w 存盘, :q 退出) (陈皓注::w 后可以跟文件名)dd → ...

  4. 『学了就忘』Linux文件系统管理 — 65、LVM逻辑卷管理介绍

    目录 1.LVM逻辑卷管理的简介 2.LVM逻辑卷管理的原理 3.总结建立LVM分区的步骤 1.LVM逻辑卷管理的简介 LVM是Logical Volume Manager的简称,中文就是逻辑卷管理. ...

  5. 巩固javaweb第十三天

    巩固内容: HTML 表格 表格由 <table> 标签来定义.每个表格均有若干行(由 <tr> 标签定义),每行被分割为若干单元格(由 <td> 标签定义).字母 ...

  6. 数仓day02

    1. 什么是ETL,ETL都是怎么实现的? ETL中文全称为:抽取.转换.加载  extract   transform  load ETL是传数仓开发中的一个重要环节.它指的是,ETL负责将分布的. ...

  7. LeetCode398-随机数索引

    原题链接:[398. 随机数索引]:https://leetcode-cn.com/problems/random-pick-index/ 题目描述: 给定一个可能含有重复元素的整数数组,要求随机输出 ...

  8. Android 实现微信QQ分享以及第三方登录

    集成准备 在微信开放平台创建移动应用,输入应用的信息,包括移动应用名称,移动应用简介,移动应用图片信息,点击下一步,选择Android 应用,填写信息提交审核. 获取Appkey 集成[友盟+]SDK ...

  9. spring jdbc 配置数据源连接数据库

    概述 在XML配置数据源,并将数据源注册到JDBC模板 JDBC模板关联业务增删改查 在XML配置数据源 <?xml version="1.0" encoding=" ...

  10. 【Java基础】Java 注解详解

    对于Java注解,我之前的印象是很模糊的,总觉得这个东西经常听说,也经常用,但是具体是怎么回事,好像没有仔细学习过,说到注解,立马想到@Controller,仅此而已. 对于Java注解,我咨询过一些 ...