- 浏览: 693181 次
- 性别:
- 来自: 合肥
-
文章分类
最新评论
-
di1984HIT:
学习了,学习了!
Tomcat的URL中文乱码解决以及传输优化 -
arottenapple:
...
我的二十一天CoreJava 学习笔记 -
黯淡流觞:
...
我的二十一天CoreJava 学习笔记 -
onlyOneToOne:
wsc830719 写道@RequestMapping(val ...
spring mvc3中 ResponseBody中文乱码 -
waj_615:
但是打印订单不是简单的string 啊
用java实现打印功能
2012-2-7
继续昨天的日志。贴出工具类的代码实现。
工具类名定义为UtilFile
再定义四个方法
public static void changeChineseToHexInFile(String filePath, SwitchHexAndChineseView frame) throws IOException
public static boolean changeChineseToHexInString(StringBuilder input)
public static void changeHexToChineseInFile(String filePath, SwitchHexAndChineseView frame) throws IOException
public static boolean changeHexToStringInString(StringBuilder input)
方法说明
changeChineseToHexInFile 是用来对文件进行中文转unicode处理,至少要传一个文件名或路径。
对于第二个参数的说明,至于后面的frame是一个swing的jframe对象,这是为了做GUI界面而后加入的,为的就是如果传入的是路径,则对路径内部的文件处理时,处理一个文件后就在GUI界面里写出一个操作提示。
这里有多种方案如:
1.就是我当前使用的,在工具类中传入一个GUI对象,就可以在工具类中对GUI进行操作。因为这里的工具类是前几天写好的,不想大改,只要加入一个新参数就能GUI的项目中马上起作用。
2.方法参数这里只传一个文件名而不是路径,这样就可以在GUI的方法体中调用工具类对单个文件进行处理,处理完后再在GUI方法体内进行GUI操作。
changeChineseToHexInString 是用来对字符串进行中文转unicode处理,传入的是一个字符串。
changeHexToChineseInFile和changeHexToStringInString 是反过来的
方法实现
public static void changeHexToChineseInFile(String filePath, final SwitchHexAndChineseView frame) throws IOException { final File file = new File(filePath); //*** 如果是文件夹则查其子文件夹中的文件 if (file.isDirectory()) { //使用文件过滤器来过滤文件,只取子文件夹中的.java/.properties或路径 File[] files = file.listFiles(new FileFilter() { public boolean accept(File pathname) { return pathname.isDirectory() || pathname.getName().endsWith(".java") || pathname.getName().endsWith(".properties"); } }); //对字文件夹中的内容进行递归调用 for (File f : files) { changeHexToChineseInFile(f.getAbsolutePath(), frame); } } else { //如果是文件,则以固定的utf8编码读取文件 FileInputStream fr = new FileInputStream(file); InputStreamReader is = new InputStreamReader(fr, "utf8"); char[] cc = new char[(int) file.length()]; int readnum = is.read(cc); StringBuilder sb = new StringBuilder(readnum); sb.append(cc, 0, readnum); //对字符串进行转换处理,如果文件里没有要转换的字符则就不必对原文件进行覆盖 boolean isChange = changeHexToStringInString(sb); fr.close(); if (isChange) { //如果有转换,则以固定的utf8码对原文件进行覆盖 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file), "utf8"); osw.write(sb.toString().trim()); osw.close(); //每处理完一个文件,则在awt线程中对GUI界面进行操作,在窗口中输出处理过的文件绝对路径全名 SwingUtilities.invokeLater(new Runnable() { public void run() { frame.setResultView(file.getAbsolutePath() + "\n"); } }); } } }
public static void changeChineseToHexInFile(String filePath, final SwitchHexAndChineseView frame) throws IOException { final File file = new File(filePath); //*** 如果是文件夹则查其子文件夹中的文件 if (file.isDirectory()) { File[] files = file.listFiles(new FileFilter() { public boolean accept(File pathname) { return pathname.isDirectory() || pathname.getName().endsWith(".java") || pathname.getName().endsWith(".properties"); } }); //对子文件进行递归调用 for (File f : files) { changeChineseToHexInFile(f.getAbsolutePath(), frame); } } else { //以固定utf8读取文件内容 FileInputStream fr = new FileInputStream(file); InputStreamReader is = new InputStreamReader(fr, "utf8"); char[] cc = new char[(int) file.length()]; int readnum = is.read(cc); StringBuilder sb = new StringBuilder(readnum); sb.append(cc, 0, readnum); //处理内容 boolean isChange = changeChineseToHexInString(sb); fr.close(); if (isChange) { //覆盖原文件 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file), "utf8"); osw.write(sb.toString().trim()); osw.close(); //在awt线程中操作GUI SwingUtilities.invokeLater(new Runnable() { public void run() { frame.setResultView(file.getAbsolutePath() + "\n"); } }); } } }
可以看到这两个方法大部分代码都相同,还可以再重构。如再分一个方法要加emun参数,这两个方法分别再调第三个方法。这里时间不多就不在gui的工具类里做了,但我会在自己的实现工具类里再优化的。
public static boolean changeChineseToHexInString(StringBuilder input) { char each = '\u0000'; boolean isChange = false; int inputLength = input.length(); //定义一个临时变量 StringBuilder sb = new StringBuilder(inputLength); for (int i = 0; i < inputLength; i++) { each = input.charAt(i); if (String.valueOf(each).matches("[^\\u0000-\\u00FF]")) { isChange = true; //将中文转成16进制 sb.append("\\u").append(Integer.toHexString(each)); } else { sb.append(each); } } if (isChange) { //如果有变化,就将原内容替换 input.replace(0, inputLength, sb.toString()); } return isChange; }
参数使用StringBuilder是考虑性能问题,且这是个对象引用,可以直接对对象进行操作。引用中间变量sb是为了解决在循环中的正则长度匹配问题。如果不使用中间变量,而直接使用参数在循环体中进行replace替换,那么每替换一次则字符的总长度会加5,因为16进制是6位字符,而中文只是一个字符。对于正则来说在循环时如果长度发生变化则可能会抛出异常。
public static boolean changeHexToStringInString(StringBuilder input) { boolean isChange = false; //使用正则找出\u0000这种格式,且不能是\\u0000这各格式的 Matcher matcher = Pattern.compile("((?<!\\\\)\\\\u([0-9A-Fa-f]{4}))", Pattern.MULTILINE | Pattern.UNICODE_CASE).matcher(input); while (matcher.find()) { isChange = true; //每找到一处,就从找到的下标开始进行替换 input.replace(matcher.start(), matcher.end(), String.valueOf((char) Integer.parseInt(matcher.group(2), 16))); //替换后字符长度发生了变量,则要相应的更改正则的匹配范围,否则会出错 matcher.region(matcher.start() - (matcher.end() - matcher.start()), input.length()); } return isChange; }
这里的stringbuilder就更重要了,如果你只使用string则每次replace都会创建一个新对象,因为string是不变长度的,你改了字符,长度变了,那它就会创建新string对象对于性能来说是影响很大的
主要代码就是这么多,GUI代码太多了,就不贴了,直接上传成品,为了方便使用,我直接把GUI打包成了exe。运行环境是要jre1.6及以上的。小工具一个,没时间去做更好的用户体验,凑合着用吧
发表评论
-
学习计划表[最新更新2012-04-16]
2012-04-13 11:34 1587内容 重要 备注 进度 爱 ... -
java练手全程录5-对JPA的研究[最新更新2012-2-5]
2012-02-15 17:46 10232012-2-13至2012-2-15日 ... -
java练手全程录3-处理代码中文工具类
2012-02-06 19:18 10372012-2-4 和 2012-2-6 号两天空闲时间 ... -
java练手全程录2-静态页面制作
2012-02-04 16:28 10812012-2-3日 做出了网站的静态页面,首页、列表页 ... -
java练手全程录1-练手方案
2012-02-04 16:10 1114技术学了不少了,我也不是那个刚出道时剑指四方,谁与争锋的刚猛的 ... -
睡觉的隐性影响
2011-08-30 11:59 952“饥来餐饭倦时 ... -
着手准备着技术转型
2011-07-08 20:56 967最近很少写技术文型章 ... -
规划我的30年后
2011-07-06 18:33 1057做为一个程序员,每天研究的不仅仅是技术,还有自己的人生。。。 ... -
重新定位合适我的操作系统
2011-07-05 19:14 1349夏天已至,我的电脑又 ... -
在JAVA周边转了一圈,现在回来了
2011-07-04 18:20 1222好像差不多有一个月的 ... -
最近喜欢上了做脑图,以后就用脑图来发文章
2011-05-25 17:53 1557写的不少的字,没保存一下子全没了。-_-! 别 ... -
我的二十一天CoreJava 学习笔记
2011-05-16 17:10 17266前言 :最近在网上收了个做JAVA 的徒 ... -
打造能度量的真实进度
2011-04-18 15:30 1062在做项目时,会常常要报告进度。经常的,我们会写出工 ... -
团队开会的艺术之怎么开
2011-04-11 17:27 1967开会,对于我们程序员来说,也是司空见惯了,然而每次开会过后,你 ... -
项目开发过程的三重境界
2011-04-11 00:14 1161国学大师王国维在《人间词话》中有写到古今成功者三重境界,第一重 ... -
如何在重复性工作中提升自我
2011-04-09 18:55 4708最近感觉项目组的战友们都有点麻木性的疲惫了,都有点了颓废的 ... -
团队交流艺术-对事不对人
2011-04-07 18:35 1112下班了,匆匆的写上几 ... -
[一切从模仿开始]我要创造轮子
2011-03-24 18:37 1446干IT的都听过或看过一句话,别发明重复轮子。可我现在却想说,一 ... -
成功开发程序员的目标之一:灭了测试
2011-03-21 19:18 1378与不少的朋友在一起聊天时,经常会聊到开发和测试的关系。 ... -
JAVA程序员不一定非得要会SSH
2011-03-20 01:06 4837SSH框架架构对于国内来说是大行其道。国内一大半的软件 ...
相关推荐
不需要关心接受的字符串编码是UTF_8还是GBK,还是ios-8859-1,自动转换为utf-8编码格式,无需判断字符串原有编码,用法://处理编码String newStr = GetEncode.transcode(oldStr);
JavaUtils工具类是Java开发中常见的一类代码资源,它们提供了许多便利的静态方法,用于简化常见的编程任务。在这个压缩包文件"javaUtils"中,我们可以期待找到一系列实用的工具类,比如正则表达式处理工具和Base64...
java图片处理工具类JAR包 java-image-scalingjar
论坛-论坛网站-论坛网站源码-论坛网站java代码-论坛网站设计与实现-基于springboot的论坛网站-基于Web的论坛网站设计与实现-论坛项目-论坛项目代码论坛系统-论坛系统源码-论坛管理系统-论坛管理系统java代码-论坛...
在Java编程中,工具类(Util Class)是包含各种静态方法的类,这些方法通常用于执行常见的、重复的任务,如字符串处理、数学计算或者集合操作等。这些类不包含任何状态,即没有实例变量,因此它们是线程安全的。在...
Java项目开发全程实录-源代码是一份涵盖了Java编程语言在实际项目开发中的全面实践案例。这份源代码集合为开发者提供了宝贵的参考资料,帮助他们深入理解Java编程思想、设计模式以及项目构建过程。以下是对这份资源...
easypoi实现上百万大数据导出excel工具,需要引入3.0.1版本easypoi相关依赖即可,该工具类也提供自定义动态标题,动态填充数据实现导出数据功能(但此功能最大导出为6w,导出大数据请用工具中的另一个方法,亲测有效...
这个“完整版modbus+tcp+java开发代码”是用于在Java环境中实现Modbus TCP通信的一个资源,非常适合那些需要在Java应用中集成Modbus功能的开发者。 Modbus TCP是Modbus协议的网络版本,它在原始的串行Modbus协议...
招聘-招聘系统-招聘系统源码-招聘管理系统-招聘管理系统java代码-招聘系统设计与实现-基于springboot的招聘系统-基于Web的招聘系统设计与实现-招聘网站-招聘网站代码-招聘平台-招聘平台代码-招聘项目-招聘项目代码-...
来访-来访系统-来访系统源码-来访管理系统-来访管理系统java代码-来访系统设计与实现-基于springboot的来访系统-基于Web的来访系统设计与实现-来访网站-来访网站代码-来访平台-来访平台代码-来访项目-来访项目代码-...
Java到Python的转换工具,如标题“java2python”所示,是编程领域中的一种实用技术,旨在帮助开发者将已有的Java代码转换为Python语言。这种转换对于那些熟悉Java但希望进入Python生态系统,或者想要利用Python特定...
旅游-旅游系统-旅游系统源码-旅游管理系统-旅游管理系统java代码-旅游系统设计与实现-基于springboot的旅游系统-基于Web的旅游系统设计与实现-旅游网站-旅游网站代码-旅游平台-旅游平台代码-旅游项目-旅游项目代码-...
车辆-车辆系统-车辆系统源码-车辆管理系统-车辆管理系统java代码-车辆系统设计与实现-基于springboot的车辆系统-基于Web的车辆系统设计与实现-车辆网站-车辆网站代码-车辆平台-车辆平台代码-车辆项目-车辆项目代码-...
图书-图书系统-图书系统源码-图书管理系统-图书管理系统java代码-图书系统设计与实现-基于springboot的图书系统-基于Web的图书系统设计与实现-图书网站-图书网站代码-图书平台-图书平台代码-图书项目-图书项目代码-...
社团-社团系统-社团系统源码-社团管理系统-社团管理系统java代码-社团系统设计与实现-基于springboot的社团系统-基于Web的社团系统设计与实现-社团网站-社团网站代码-社团平台-社团平台代码-社团项目-社团项目代码-...
知识-知识系统-知识系统源码-知识管理系统-知识管理系统java代码-知识系统设计与实现-基于springboot的知识系统-基于Web的知识系统设计与实现-知识网站-知识网站代码-知识平台-知识平台代码-知识项目-知识项目代码-...
班级-班级系统-班级系统源码-班级管理系统-班级管理系统java代码-班级系统设计与实现-基于ssm的班级系统-基于Web的班级系统设计与实现-班级网站-班级网站代码-班级平台-班级平台代码-班级项目-班级项目代码-班级代码...
冬奥会科普-冬奥会科普平台-冬奥会科普平台源码-冬奥会科普平台java代码-冬奥会科普平台设计与实现-基于springboot的冬奥会科普平台-基于Web的冬奥会科普平台设计与实现-冬奥会科普网站-冬奥会科普网站源码-冬奥会...