功能需求
- 导入任意英文文本文件
- 统计各单词出现的频率,并按照字典序输出
- 将单词频率写入数据库
- 实现GUI页面
实现思路
读文件
- 使用BufferedReader可以读取一行,使用StringBuilder的append()将读入的字符串追加。
频率统计
- 将英文字符串使用spilt()按空格分割,使用带自然排序的TreeMap进行存储,key存单词,value存频率。
存入数据库
- 使用c3p0连接池与DBUtils进行数据库访问与数据存入。
代码实现
- 项目文件结构
主页面的实现(MainFrame.java)
package edu.xust.frame;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
*
* Title: MainFrame
* Description:主窗体类
* @author jianglei
* @date 2018年9月21日
*/
public class MainFrame extends JFrame {
JButton jbOk, jbSave;//查询、保存按钮
JTextField jtfPath;//文件路径
JTextArea jtaShow;//显示单词频率
JScrollPane jsp;//实现单词频率显示的滚动条
JLabel jl;
JPanel jp1;
/**
*
* Title: init</p>
* Description:初始化窗体
*/
public void init() {
jl = new JLabel("文件路径");
jbOk = new JButton("查询");
jbSave = new JButton("保存到数据库");
jtfPath = new JTextField(20);
jtaShow = new JTextArea();
jp1 = new JPanel();
jsp = new JScrollPane(jtaShow);
}
public void set() {
init();
jp1.add(jl);
jp1.add(jtfPath);
jp1.add(jbOk);
jsp.setSize(100,100);
jtaShow.setSize(100, 100);
//注册事件
jbOk.addActionListener(new OkListener(this));
jbSave.addActionListener(new SaveListener(this));
//添加组件
this.add(jp1, BorderLayout.NORTH);
this.add(jsp, BorderLayout.CENTER);
this.add(jbSave, BorderLayout.SOUTH);
this.setSize(400, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置可关闭
this.setVisible(true);//设置可见
}
public static void main(String[] args) {
new MainFrame().set();
}
}
从文件读入文本,并进行频率统计(GetFile.java)
package edu.xust.service;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
/**
*
* Title: GetFile
* Description:获取单词频率信息
* @author jianglei
* @date 2018年9月21日
*/
public class GetFile {
static int count;//统计单词个数
String path;
public GetFile(String path) {
this.path = path;
}
/**
*
* Title: GetString</p>
* Description: 将文本单词拼接成字符串返回
* @return 单词的字符串
* @throws IOException
*/
private String GetString() throws IOException {
BufferedReader bis = new BufferedReader(new FileReader(path));
String str;
StringBuilder sb = new StringBuilder();
sb.append("单词个数为"+count+"\n");
while ((str = bis.readLine()) != null) {
sb.append(str);
}
return sb.toString().toLowerCase();
}
/**
*
* Title: getCount</p>
* Description:对单词进行分割,并统计频率存入map
* @return 保存单词频率信息的map
* @throws IOException
*/
public Map getCount() throws IOException {
TreeMap<String, Integer> map = new TreeMap<String, Integer>();
String str = GetString();
String[] word = str.split(" ");
count = word.length;
for (String wd : word) {//如果map中不存在单词则在map中放入该单词
if (map.get(wd) == null)
map.put(wd, 1);
else//map中存在该单词则将频率加一
map.put(wd, map.get(wd) + 1);
}
map.remove("");//将多余的一个空字符去掉
return map;
}
/**
*
* Title: getCountSting</p>
* Description: 可直观感受的单词频率字符串
* @return 可直观感受的单词频率字符串
* @throws IOException
*/
public String getCountSting() throws IOException {
StringBuilder sb = new StringBuilder();
Map countMap = getCount();
for(Object o: countMap.keySet())
sb.append(o).append("->").append(countMap.get(o)).append("\n");
return sb.toString();
}
}
获取DataSource(GetDataSources.java)
package edu.xust.dao;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
*
* Title: GetDataBase
* Description:单例模式创建 DataSource
* @author jianglei
* @date 2018年9月21日
*/
public class GetDataBase {
private static DataSource dataSource = new ComboPooledDataSource();
public static DataSource getDataSource() {
return dataSource;
}
}
插入数据库(WordDao.java)
package edu.xust.dao;
import java.sql.SQLException;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
/**
*
* Title: WordDao
* Description:解析map将数据存入数据库
* @author jianglei
* @date 2018年9月21日
*/
public class WordDao {
QueryRunner queryRunner = new QueryRunner(GetDataBase.getDataSource());
public void add(Map map) throws SQLException {
String sql;
//遍历插入数据库
for(Object o: map.keySet()) {
sql = "insert into words values('"+o+"',"+Integer.parseInt(map.get(o).toString())+");";
queryRunner.update(sql);
}
}
}
保存到数据库按钮事件(SaveListener.java)
package edu.xust.frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import edu.xust.dao.WordDao;
import edu.xust.service.GetFile;
/**
*
* Title: SaveListener
* Description:将查询的单词频率信息插入到数据库
* @author jianglei
* @date 2018年9月21日
*/
public class SaveListener implements ActionListener {
MainFrame mf;
SaveListener(MainFrame mf){
this.mf = mf;
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==mf.jbSave) {
try {
WordDao wd = new WordDao();
GetFile gf = new GetFile(mf.jtfPath.getText().trim());
wd.add(gf.getCount());//插入数据库
JOptionPane.showMessageDialog(mf, "插入成功");//提示插入成功
} catch (SQLException | IOException e1) {
e1.printStackTrace();
}
}
}
}
查询按钮的事件类(OkListener.java)
package edu.xust.frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.JButton;
import edu.xust.service.GetFile;
/**
*
* Title: OkListener
* Description:查询按钮的事件实现类
* @author jianglei
* @date 2018年9月21日
*/
public class OkListener implements ActionListener{
MainFrame mf;
OkListener(MainFrame mf ){
this.mf = mf;
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==mf.jbOk) {
try {
String path = mf.jtfPath.getText().trim();//从文本框扩地path内容
GetFile file = new GetFile(path);
String countSting = file.getCountSting();//获得单词频率信息
mf.jtaShow.setText(countSting);//将信息显示在文本框
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
c3p0连接池配置(c3p0-config.xml)
<?xml version ="1.0" encoding= "UTF-8" ?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>
运行结果
-
查询结果
-
插入数据库
-
数据库