用java写一个英汉翻译的函数,首先想一下需要完成几个步骤。
- 判断消息中是否含有英文。
- 读取词库文件。
- 将消息截取成单个的单词。
- 将单词与词库中相对应的汉语替换。
- 返回翻译好的消息。
判断消息中是否含有英文,运用了正则表达式去匹配字符串中是否含有字母。
判断含有英文代码如下:
/**
* 日志消息是否含有英文
*
* @param str
* @return
*/
public boolean judgeContainsStr(String str) {
if (StringUtils.isBlank(str)) {
return false;
}
String regex = "[a-zA-Z]";
Pattern p = Pattern.compile(regex);
return p.matcher(str).find();
}
如果含有英文,那么进入翻译函数中进行英汉的转换。因为要应用在项目中,那么写死或者从本地读取词库都是不合适的,因此这里引入了properties类,应用了这种配置文件的方式进行词库的生成,这样放在项目中,将来添加新的单词就只需在配置文件中进行新增。
配置文件如下:translation.properties
#磁盘
disk=u78c1u76d8
#空间
space=u7a7au95f4
#在
on=u5728
#数据库
datastore=u6570u636eu5e93
#不足
insufficient=u4e0du8db3
配置文件采用Key = Value 的格式,这里把汉字转换成了ASCLL码是为了防止发生乱码的问题,给大家提供一个比较好用的在线转码工具。
在翻译函数中,通过FileInputStream来获取配置文件中的内容,这里如果获取不到的话,最后会讲解一下相关问题。获取到词库后,通过构造一个解析str的StringTokenizer对象,根据分隔符分隔,再调用相关函数将传进来的消息分隔为单个单词。然后通过properties的方法properties.getProperty(key)方法搜索是否存在单词。如果存在,那么替换。这样,一个通过读取配置文件的英汉转换函数就完成了。
/font>
翻译函数代码如下:
/**
* 日志消息英译汉
*
* @param message
* @return
*/
public String operationResultMessageTranslate(String message) {
if (StringUtils.isBlank(message)) {
return null;
}
Properties properties = new Properties();
FileInputStream fileInputStream =null;
try {
//获取配置文件中的词库
fileInputStream = new FileInputStream("src/main/resources/translation.properties");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
//加载属性列表到properties对象中
properties.load(fileInputStream);
} catch (IOException e) {
e.printStackTrace();
}
//指定分隔符
String delim = " :,.!
";
//构造一个解析str的StringTokenizer对象,并提供指定的分隔符,同时,指定不返回分隔符
StringTokenizer str = new StringTokenizer(message, delim, false);
while (str.hasMoreTokens()) {
//分割出的一个个单词
String sub = str.nextToken();
//统一转换为小写
String lowerSub = sub.toLowerCase();
//从词库中找匹配的项
String newSub = properties.getProperty(lowerSub);
//如果找到了匹配的汉字,则进行替换
if (newSub != null) {
message = message.replaceFirst(sub, newSub);
}
}
return message;
}
注意:如果properties获取不到配置文件,提示系统找不到相关文件的话,那么我们需要理解一下读取的方法。
为什么用FileInputStream找不到路径?
因为FileInputStream这个类读取的相对路径针对的是项目根目录的 。根目录工程包就是java语法这个包。
要找到person.xml,应该写成 src/res/person.xml .
如果用getResource,
InputStream is=getClass().getResourceAsStream("../res/person.properties");
这个是从当前java原文件处开始读的。
还有一种方法:资源文件db.properties放在ClassPath下(src目录中)
我们需要加"/",可以理解为在ClassPath下寻找,即src目录
InputStream in = Test1.class.getResourceAsStream("/res/db.properties");
上面3种方法都可以。。