`

有关关键字的写入文件和读取

    博客分类:
  • java
阅读更多
/***
这里用到了一个工具类StringUtil.java,在博客中有StringUtil.java这个类的说明
*/
package com.huanglq.huanglq_test;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.huanglq.util.DBUtil;
import com.huanglq.util.Log;
import com.huanglq.util.StringUtil;

public class KeywordDaoImpl{
        
       //在这里做一次转义处理
public static String[] getEscapedKeyWords(String keyword,int count){
String[] keyWords=getKeywords(keyword, count);
for(int i=0;i<keyWords.length;i++){
System.out.println(keyWords[i]);

if(keyWords[i].contains("\\")){
keyWords[i]=StringUtil.replace(keyWords[i], "\\", "\\\\");
}
if(keyWords[i].contains("'")){
keyWords[i]=StringUtil.replace(keyWords[i], "'", "\\'");
}
}
return keyWords;
}
/***************************************************************************
* 要先执行setKeywords(String filePath)一次,才能执行getKeywords(String keyword,int
* count,String filePath);
* 返回包合关键字的集合,keyword是要搜索的关键字,count是显示的个数,filePath是keywords存放的文件路径
*/
public static String[] getKeywords(String keyword, int count) {
// 文件中读取内容,返回一个keyword的String[]
String[] keywords = KEY_WORDS;

StringBuffer br = new StringBuffer("");
// 要返回的关键字集合String[]
String[] keys = new String[count];
List keysList = new ArrayList();
List keysList2 = new ArrayList();
for (int i = 0; i < keywords.length; i++) {
if ((keywords[i].toLowerCase()).startsWith(keyword.toLowerCase())) {
keysList.add(keywords[i].trim());

if (keysList.size() >= count)
break;
} else if (
(!(keywords[i].toLowerCase()).startsWith(keyword.toLowerCase()))
&& (keywords[i].toLowerCase()).contains(keyword.toLowerCase())) {
keysList2.add(keywords[i].trim());


}
}
Iterator it = keysList.iterator();
while (it.hasNext()) {
br.append((String) it.next() + "\n");
}
// 如果keyword开头的不够count的数,就把包含的也写进来,加到count,
int countKeyWord = keysList.size() ;
if (countKeyWord < count) {
Iterator it2 = keysList2.iterator();
while (it2.hasNext()) {
br.append((String) it2.next() + "\n");
countKeyWord++;
if (countKeyWord > count) {
break;
}
}
}

String tempKeys = br.toString();
keys = tempKeys.split("\n");

return keys;
}

// 读取文件-------------从文件中读取内容,返回一个keyword的String[]
private static String[] KEY_WORDS = null;
static {
refeshKeyWord();
}

//刷新keyword的文件
public void refeshKeyWordToFile(){
refeshKeyWord();
}
//初始化/刷新KEY_WORDS
public static void refeshKeyWord() {
FileReader fr = null;
BufferedReader br = null;
StringBuffer keys = new StringBuffer("");
try {
// 文件路径,这里的文件路径可以写在全局变量或配置在xml或.properties文件中
fr = new FileReader("/usr/work4/keyword.txt");
br = new BufferedReader(fr);
String len = "";
int index=1;
while ((len = br.readLine()) != null) {
                                //这里这样做是为了方便后面用换行来分隔字符串
keys.append(len.trim() + "\n");
}
String temp = keys.toString();
KEY_WORDS = temp.split("\n");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

public static String[] getKeyWord() {
return KEY_WORDS;
}

         //这里用到来了Configuration.java,和refeshKeyword.xml
       //Configuration是读取xml的类
//txtCount,txt[]的值都是从xml文件读取回来的
private static int txtCount;

private static String txt[] =new String[10];
static{
txtCount = Integer.parseInt(Configuration.getConfigValue(
"refeshKeyword.xml", "refeshKeyword", "TxtCount"));
for (int i = 1; i <= txtCount; i++) {
txt[i - 1] = Configuration.getConfigValue("refeshKeyword.xml",
"refeshKeyword", "Txt" + i);
}
}

// 找关键字的语句
String KEYWORD_SQL = "select top 10000 keyword,count(1) as cnt from huanglq90_other..all_keyword "
+ "group by keyword order by cnt desc";

// 生成关键字文件(add by huanglinquan)
public void setKeywords() {
String[] keyWords = null;
String temp = null;
StringBuffer sb = new StringBuffer("");
List keyWordList = new ArrayList();

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

FileWriter fw = null;

try {
conn = DBUtil.gethuanglq90Conn();//链接JNDI
//conn = DBUtil.getConnection(url2, driver, username, password);
pstmt = conn.prepareStatement(KEYWORD_SQL);
rs = pstmt.executeQuery();
while (rs.next()) {
keyWordList.add(rs.getString("keyword"));
}
for (int k = 0; k < txtCount; k++) {
fw = new FileWriter(txt[k]);
keyWords = new String[keyWordList.size()];
for (int i = 0; i < keyWords.length; i++) {
keyWords[i] = (String) keyWordList.get(i);
sb.append(keyWords[i] + "\n");
}
temp = sb.toString();
fw.write(temp);
fw.flush();
fw.close();
sb = new StringBuffer("");
Log.debug(this, "getKeywords()", KEYWORD_SQL);
}
} catch (Exception e) {
Log.error(this, "getKeywords()", e.getMessage());
} finally {
DBUtil.clean(this, rs);
DBUtil.clean(this, pstmt);
DBUtil.clean(this, conn);
}
}

}
===========================================
Suggestion.java是KeywordDaoImp.的改进,但是没有把setKeywords()写进来,
不过它还有一个不断调用getSuggest(String key, int count)时,在每天的指定时间就会刷新静态初始化块

package com.huanglq.huanglq_test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Date;

import com.huanglq.util.Log;
import com.huanglq.util.StringUtil;

public class Suggestion {

private static String path = "/usr/work4/keyword.txt";

// 返回关键词的个数
private static final int DEFAULT_COUNT = 10;

// 重新读取关键词数据的时间,8即是早晨8点,默认为8
private static final int LOAD_HOUR = 8;

// 重新读取关键词数据的间隔时间,单位:微妙;默认值为1天
private static final int LOAD_INTERVAL = 24 * 60 * 60 * 1000;

// 包含所有关键词的列表
private static String[] words = null;

private static long loodTime = 0;

private static final Locale locale = Locale.SIMPLIFIED_CHINESE;

// yyyy-mm-dd
private static final DateFormat FORMAT_DATE = DateFormat.getDateInstance(
DateFormat.MEDIUM, locale);

// yyyy-mm-dd HH:SS:MM
private static final DateFormat FORMAT_DTTM = DateFormat
.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, locale);

static {
load();
}

public String[] get(String key, int count) {
return getEscapedSuggest(key, count);
}

public String[] get(String key) {
return get(key, DEFAULT_COUNT);
}

public static String[] getEscapedSuggest(String key, int count) {
String[] suggest = getSuggest(key, count);
for (int i = 0; i < suggest.length; i++) {
if (suggest[i].contains("\\")) {
suggest[i] = StringUtil.replace(suggest[i], "\\", "\\\\");
}
if (suggest[i].contains("'")) {
suggest[i] = StringUtil.replace(suggest[i], "'", "\\'");
}
}
return suggest;
}

public static String[] getSuggest(String key, int count) {
if (System.currentTimeMillis() >= loodTime)
load();

String[] suggest = null;

List keysList = new ArrayList();
List keysList2 = new ArrayList();

for (int i = 0; i < words.length; i++) {
if ((words[i].toLowerCase()).startsWith(key.toLowerCase())) {
keysList.add(words[i].trim());
if (keysList.size() >= count)
break;
} else if (words[i].toLowerCase().indexOf(key.toLowerCase()) > 0) {
if (keysList2.size() >= count)
continue;
keysList2.add(words[i].trim());
}
}

int need = count - keysList.size();
for (int i = 0; i < need; i++) {
if (keysList2.size() == 0 || keysList2.size() < (i + 1))
break;
keysList.add(keysList2.get(i));
}

suggest = new String[keysList.size()];
for (int i = 0; i < keysList.size(); i++) {
suggest[i] = (String) keysList.get(i);
}

return suggest;
}

static public void load() {
try {
System.out.println("load()");
String time = FORMAT_DATE.format(new Date()) + " " + LOAD_HOUR + ":0:0";
loodTime = FORMAT_DTTM.parse(time).getTime() + LOAD_INTERVAL;
} catch (ParseException e) {
Log.error(Suggestion.class, "load{}", e.getMessage());
}

FileReader fr = null;
BufferedReader br = null;
StringBuffer sb = new StringBuffer();
try {
fr = new FileReader(path);
br = new BufferedReader(fr);
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line.trim() + "\n");
}
words = sb.toString().split("\n");
} catch (Exception e) {
Log.error(Suggestion.class, "reload()", e.getMessage());
} finally {
try {
br.close();
fr.close();
} catch (IOException e) {
Log.error(Suggestion.class, "reload()", e.getMessage());
}
}
}

public static String getPath() {
return path;
}

public static void setPath(String path) {
Suggestion.path = path;
}
}
分享到:
评论
2 楼 qsrock 2007-11-02  
for (int k = 0; k < txtCount; k++) {
fw = new FileWriter(txt[k]);
temp = sb.toString();
fw.write(temp);
fw.flush();
fw.close();

还要try-catch一次
1 楼 qsrock 2007-11-02  
对KeywordDaoImpl 的setKeyWords()方法的优化:
// 生成关键字文件(add by huanglinquan)
public void setKeywords() {
String[] keyWords = null;
String temp = null;
StringBuffer sb = new StringBuffer("");
List keyWordList = new ArrayList();

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

FileWriter fw = null;

try {
conn = DBUtil.gethuanglq90Conn();//链接JNDI
//conn = DBUtil.getConnection(url2, driver, username, password);
pstmt = conn.prepareStatement(KEYWORD_SQL);
rs = pstmt.executeQuery();
while (rs.next()) {
keyWordList.add(rs.getString("keyword"));
}

Log.debug(this, "getKeywords()", KEYWORD_SQL);
}
} catch (Exception e) {
Log.error(this, "getKeywords()", e.getMessage());
} finally {
DBUtil.clean(this, rs);
DBUtil.clean(this, pstmt);
DBUtil.clean(this, conn);
}
//sb生成一次就可以了,不必写入循环中
for (int i = 0; i < keyWordList.size(); i++) {
sb.append((String) keyWordList.get(i) + "\n");
}
for (int k = 0; k < txtCount; k++) {
fw = new FileWriter(txt[k]);
temp = sb.toString();
fw.write(temp);
fw.flush();
fw.close();
}

以后要注意写完程序时要看程序是否可以继续优化,
涉及到数据库和IO方面的资源要尽可能快地关闭,不要在里面做无谓的操作。

相关推荐

    多关键字排序 高手成绩 文件读取

    本文将详细讨论这两个概念,并结合C++编程语言,探讨如何实现多关键字排序以及如何进行文件读取和输出。 首先,多关键字排序是指对数据集合进行排序时,不仅依据一个关键字,而是依据多个关键字。例如,假设我们有...

    EasyExcel 并发读取文件字段并进行校验,数据写入到新文件,批量插入数据到数据库

    下面我们将详细探讨如何使用EasyExcel实现并发读取文件字段、进行数据校验、将数据写入新文件以及批量插入到数据库的操作。 1. **EasyExcel介绍** EasyExcel是一款轻量级的Java Excel处理框架,它基于NIO和内存...

    VC++ 关键字查找对文件内容归类

    在VC++中,ofstream类可用于写入文件,可以选择ASCII或二进制模式。根据需求,结果可能以纯文本、CSV格式或自定义格式存储,便于后续处理或可视化。 总之,“VC++关键字查找对文件内容归类”是一个涉及字符串匹配...

    易语言PAK文件读取

    下面我们将深入探讨易语言PAK文件读取的相关知识点。 1. **易语言基础** 易语言是一种面向初学者的、中文编程语言,其设计目标是降低编程难度,让不懂英文的用户也能编写程序。易语言采用直观的中文词汇作为关键字...

    根据关键字搜索文件夹

    接着,关于文件内容的读取和修改,我们可以使用`open()`函数打开文件,然后用`read()`或`readlines()`获取文件内容。为了在文件开头添加字符串,我们可能需要先读取整个文件,然后将新字符串与原内容拼接,最后用`...

    文本文件读取和写入的另一种方法

    在编程领域,文本文件的读取和写入是常见的...总的来说,"文本文件读取和写入的另一种方法"可能涵盖了许多高级特性和策略,包括使用`File`类、`LINQ`、异步操作和内存映射文件等。实际应用取决于具体的编程需求和场景。

    C#通过流写入数据到文件的方法

    总的来说,C#通过流进行文件操作具有很大的灵活性和效率,无论是文本还是二进制数据,都能方便地写入文件。了解并熟练掌握流的概念和使用方法,对于提升C#编程能力至关重要。通过结合不同的流类型和方法,可以构建出...

    python批量读取txt文件(读取指定行内容/统计关键词数量/读取指定关键词之间的内容/创建空白txt/统计行数和字符串数量)

    关于功能5修改编码格式——写该功能主要因为,经常遇到一些文本文件由于编码格式不一致的问题,导致无法用写好的算法进行读取。 对于该功能需要注意的是,编码格式不能写错,请在使用前先备份,写错有可能导致文件被...

    Android应用程序中读写txt文本文件的基本方法讲解

    // 实现文件读取逻辑 } ``` 以上就是Android应用程序中使用`context.openFileInput()`和`context.openFileOutput()`读写txt文本文件的基本方法。在实际应用中,还需要考虑异常处理、权限管理、文件操作的同步异步...

    bat批处理,实现循环读取txt,每行内容为文件夹名称或文件,把对应文件夹或文件复制或剪切至E:\123\下

    将对应file.txt和两个.bat文件放在需要复制或剪切的文件夹下,将需要复制或剪切的文件夹或文件名写入file.txt中,双击运行其中一个.bat即可复制或剪切txt里的文件夹或文件至E:\123文件夹中。

    写入读取98341

    3. **文件读取**: - 读取文件通常用于获取文件中的信息,以便在程序中进一步处理或展示。在本例中,文件“1.txt”被读取,内容通过对话框显示。 - 使用`open()`函数以读取模式('r')打开文件,然后可以使用`read()...

    c#大文件读取和写入数据库(带进度条的源代码).rar

    本资源“c#大文件读取和写入数据库(带进度条的源代码).rar”提供了一个示例,它展示了如何在C#中高效地处理大文件,并在操作过程中添加进度条来提升用户体验。以下是对这个主题的详细讲解: 一、大文件读取 1. **...

    python实现按关键字筛选日志文件

    这个脚本适用于Python 2.x版本,主要功能是读取指定的日志文件,找出包含特定关键字的行,并将这些行写入新的日志文件中。 首先,脚本定义了一个函数`getParameters()`,它负责获取用户的输入。用户被要求输入要...

    C语言实现的根据关键字读取特定格式(PDM)文件的数据内容,生成数组定义,数组声明等并存储到新生成的文件中

    标题中的“C语言实现的根据关键字读取特定格式(PDM)文件的数据内容,生成数组定义,数组声明等并存储到新生成的文件中”描述了一个使用C语言编程的任务,涉及了文件操作、数据解析和文件生成等多个核心知识点。...

    读取文件信息.rar

    本教程将详细阐述如何在不同的操作系统和编程环境中读取文件信息,以及涉及的相关知识点。 1. 文件系统的理解 在开始读取文件信息之前,我们需要了解操作系统中的文件系统。文件系统是管理和组织磁盘上存储的数据的...

    易语言取TXT文件指定内容

    在处理文本文件,如TXT文件时,易语言提供了丰富的内置函数和命令来读取、写入和搜索文件内容。本篇文章将深入探讨如何使用易语言取TXT文件指定内容,并通过源码分析来帮助理解其实现原理。 首先,我们需要打开TXT...

    C++电话薄 文件读取 文件写入 添加删除修改联系人 分类显示 查询功能

    这个系统具备从文件读取和写入数据、添加、删除、修改联系人信息、分类显示和查询功能。以下是对这些功能的详细解释: 1. **文件读取与写入**: 在C++中,我们可以使用`fstream`库来处理文件操作。通过`ifstream`...

    读取xml和写入xml文件开源库

    TinyXML是一个小型、轻量级的C++库,它提供了读取和写入XML文件的功能。这个库设计简洁,易于理解和使用,特别适合于嵌入式系统或者对内存占用有严格要求的项目。接下来,我们将探讨tinyxml库的主要功能和使用方法。...

    使用RandomAccessFie分段写大文件,创建多线程程席、通讨多线程分段读取大文件并分段写入到新文件

    5. **同步控制**:由于多个线程可能同时操作同一文件,我们需要使用`synchronized`关键字或者`Lock`接口来确保读写操作的原子性和一致性,防止数据竞争。 6. **线程管理**:所有线程启动后,主线程需要等待所有工作...

    obj三维文件的读取和保持功能实现-源码

    2. **Obj文件读取** - **读取顶点**:文件中的“v”关键字标记一个顶点,如“v 1.0 2.0 3.0”,表示三维空间中的一个点(x, y, z)。 - **读取纹理坐标**:使用“vt”关键字,如“vt 0.5 0.5”表示纹理坐标上的一...

Global site tag (gtag.js) - Google Analytics