依赖引入,pom.xml
<dependency>
<groupId>com.github.stuxuhai</groupId>
<artifactId>jpinyin</artifactId>
<version>1.1.8</version>
</dependency>
封装工具类 SimpleToTraditionalUtils
package com.iot.power.boot.utils;
import com.github.stuxuhai.jpinyin.ChineseHelper;
import org.apache.commons.collections.CollectionUtils;
import java.io.*;
import java.util.ArrayList;
import java.util.regex.Pattern;
/**
* Created by zhangzhenhua
*/
public class SimpleToTraditionalUtils {
public static void main(String[] args) {
SimpleChineseToTraditionalWithPath("F:\\testFile\\test");
}
public static void SimpleChineseToTraditionalWithPath(String path){
ArrayList<String> tempArray = new ArrayList<>();
ArrayList<String> fileList = traverseFolder2(path , tempArray);
if(CollectionUtils.isEmpty(fileList)){
return;
}
for (int i = 0; i<fileList.size() ; i++){
readFileAndReWriteInNewFile(fileList.get(i));
}
System.out.println("转换结束");
}
public static void readFileAndReWriteInNewFile(String filePath){
// 简体转繁体
try{
BufferedReader bufRead = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filePath))));
StringBuilder strBuffer = new StringBuilder();
Pattern pattern = Pattern.compile("[\u4e00-\u9fcc]+");
for (String temp; (temp = bufRead.readLine())!= null; ){
if (pattern.matcher(temp).find()){
temp = convertToTraditionalChinese(temp);
}
strBuffer.append(temp);
strBuffer.append(System.getProperty("line.separator"));
}
//本地调试打印
System.out.println(strBuffer.toString());
bufRead.close();
PrintWriter printWriter = new PrintWriter(filePath);
printWriter.write(strBuffer.toString().toCharArray());
printWriter.flush();
printWriter.close();
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 遍历传入的根文件夹,获取每一级文件夹的每个文件
* @param path 文件夹路径
* @param listFileName 返回文件路径的list
* @return
*/
public static ArrayList<String> traverseFolder2(String path , ArrayList<String> listFileName) {
File file = new File(path);
if (file.exists()) {
File[] files = file.listFiles();
if (files == null || files.length == 0) {
System.out.println("文件夹是空的!");
return null;
} else {
for (File file2 : files) {
if (file2.isDirectory()) {
traverseFolder2(file2.getAbsolutePath(),listFileName);
} else {
String solutePath = file2.getAbsolutePath();
//以下文件格式根据自己实际添加或删除
if (solutePath.endsWith(".jsp") || solutePath.endsWith(".js")
|| solutePath.endsWith(".html") || solutePath.endsWith(".java")
|| solutePath.endsWith(".properties") || solutePath.endsWith(".sql")
){
listFileName.add(file2.getAbsolutePath());
}
}
}
}
} else {
System.out.println("文件不存在!");
}
return listFileName;
}
/**
* 简体转换为繁体
* @param simpleStr 要转换的字符串
* @return
*/
public static String convertToTraditionalChinese(String simpleStr) {
String tempStr;
try {
tempStr = ChineseHelper.convertToTraditionalChinese(simpleStr);
} catch (Exception e) {
tempStr = simpleStr;
e.printStackTrace();
}
//本地验证系字转换有问题,单独处理
return tempStr.replace("係", "系");
}
}
写在结尾
本人实际项目中对.html、.js、.java、.sql、.properties转换基本没发现问题,自己仔细验证了项目转换为繁体后的页面显示和功能都正常,除了唯一看到“系”字转换错误。
文章浏览阅读653次。自定义UITableViewCell大致有两类方法:使用nib 1、xib中指定cell的Class为自定义cell类型(注意不是设置File's Owner的class) 2、调用 tableView 的 registerNib:forCellReuseIdentifier:方法向数据源注册cell 复制代码[_tableVi_cell register 中单元标记名称是什么
文章浏览阅读249次。因为,在多线程中使用同一个静态方法时,每个线程都共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态字段,只在方法内部使用实例字段(instance field),不会引起安全性问题。但是,如果该静态方法操作了一个静态字段,则有可能会引起线程安全问题.静态方法内的临时变量是每个线程都有一份的,因而是安全的.那么,在多线程中使用静态方法是否有线程安全问题?_java 静态方法 非静态方法
文章浏览阅读2k次,点赞2次,收藏11次。硬件准备:四轴无人机Zigbee数传一台电脑或安卓手机软件准备:APM4.3.6(飞控)QGC 4.2.4 (地面站)Blender 3.5 (舞步设计)无人机编队表演的流程如下:舞步(灯光)设计->导出路径文件->地面站导入路径文件->通过mavlink将航点发给飞控->飞控执行航点(灯光)基于以上流程本系列文章将从包含一下几个方面的内容本教程将尽可能详细,即便你没有任何编程经验,也能实现自己的编队表现系统。_编队 超维
文章浏览阅读1.5w次,点赞5次,收藏32次。1 过滤器HBase 的基本 API,包括增、删、改、查等。增、删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan)。HBase 不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询。1.1 过滤器的两类参数过滤器可以根据列族、列、_hbase com filter
文章浏览阅读3.3k次。CoordinatorLayout可以协调子View之间进行交互动作,那么CoordinatorLayout它是怎么协调子View的呢?其实核心就是Behavior。那么今天讲的就是-Behavior。Behavior的使用我们应该不陌生,在AppbarLayout 与NestedScrollView 联动的时候,我们为NestedScrollView设置了一个Behavior,当然这个Behavi_behavior onnestedprescroll
文章浏览阅读7.5k次,点赞2次,收藏16次。close()方法执行的时候会触发两个事件Form_Closing和Form_Closeed事件,Form_Closing是在窗体关闭时执行,Form_Closed是在窗体关闭之后执行,所以如果想取消关闭窗体,可以在Form_Closing事件里取消。(2)此窗体是“模态”窗体。参数1代表程序非正常退出。指仅关闭当前窗体,如果不是主窗体(包含主线程的窗体,并非MDI窗体)的话,是无法退出整个程序的。强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出。..._c#中的输入框控件无法输入是怎么回事
文章浏览阅读292次。分享本文至:教程简单小白易懂本教程全网首发!我们是利用千月tp框架漏洞直接注入提权,网上的千月影视基本都没修复这个漏洞。1.域名/+?s=/index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell2.php&vars[1..._tp框架提权
文章浏览阅读232次。public class SharedPreferencesDanLi { private String filename; private Context context; private android.content.SharedPreferences SharedPreferences; public SharedPreferencesDanLi(String filename, Context context) { this.filename..._android sharedpreferences 单例
文章浏览阅读717次,点赞2次,收藏2次。element input 限制中文、输入中文导致数据报错_el-form input限制只能输入数字,输入中文后,触发校验
文章浏览阅读1k次,点赞22次,收藏13次。需要注意的是,这些特性是典型的,不是最大或最小值,也不是生产测试的参数。设计者和工程师应确保在这些推荐的操作条件下设计和使用NA555、NE555、SA555和SE555系列定时器,以确保器件的最佳性能和可靠性。这些应用信息为设计者和工程师提供了如何利用NA555、NE555、SA555和SE555系列定时器的多功能性和灵活性来满足特定应用需求的实用指导。这份文件为工程师和技术人员提供了NA555、NE555、SA555和SE555系列精密定时器的详细技术规格和操作指南,以便于在设计和应用中使用这些器件。
文章浏览阅读1.1k次。编程题#2: 配对碱基链来源: POJ (http://pkuic.openjudge.cn/ziyoulianxi/09)注意: 总时间限制: 1000ms 内存限制: 65536kB描述脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成。而构成DNA的碱基共有4种,分别为腺瞟呤(A)、鸟嘌呤(G)、胸腺嘧啶(T)和胞嘧啶(C)。我们知道,在两条互补碱基链的对应位置上,腺瞟呤总是和胸腺_2395: 配对碱基链
文章浏览阅读3.9k次,点赞5次,收藏10次。AOP(面向切面编程)面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。但是人们也发现,在分散代码的同时,也增加了代码的..._spring aop和拦截器的区别面试题