`

java练手全程录4-处理工具类代码实现

 
阅读更多

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及以上的。小工具一个,没时间去做更好的用户体验,凑合着用吧

 

  • 大小: 23.6 KB
分享到:
评论

相关推荐

    java图片处理工具类JAR包 java-image-scalingjar

    java图片处理工具类JAR包 java-image-scalingjar

    java工具类,日志处理类

    在Java编程中,工具类(Util Class)是包含各种静态方法的类,这些方法通常用于执行常见的、重复的任务,如字符串处理、数学计算或者集合操作等。这些类不包含任何状态,即没有实例变量,因此它们是线程安全的。在...

    JS实现AES-GCM加密,java实现AES-GCM解密。.md

    在工作中会经常遇到密码加密,URL传参要进行加密,在此我参照一个例子将用java实现的AES加解密程序用实例写出。JS实现AES-GCM加密,java实现AES-GCM解密

    jedisUtil工具类java

    jedis的工具类,java代码写的,非常全面,jedis的工具类,java代码写的,非常全面jedis的工具类,java代码写的,非常全面jedis的工具类,java代码写的,非常全面jedis的工具类,java代码写的,非常全面jedis的工具类...

    easypoi导出工具类-代码含java代码、jar包以及pom依赖

    easypoi实现上百万大数据导出excel工具,需要引入3.0.1版本easypoi相关依赖即可,该工具类也提供自定义动态标题,动态填充数据实现导出数据功能(但此功能最大导出为6w,导出大数据请用工具中的另一个方法,亲测有效...

    java2python--java代码转python工具

    Java到Python的转换工具,如标题“java2python”所示,是编程领域中的一种实用技术,旨在帮助开发者将已有的Java代码转换为Python语言。这种转换对于那些熟悉Java但希望进入Python生态系统,或者想要利用Python特定...

    C++代码转java工具

    这种工具通常通过分析C++的语法结构,然后生成相应的Java代码来工作。然而,需要注意的是,由于C++和Java的语法和语义差异,直接的转换可能会遇到挑战,比如C++的模板、指针、运算符重载在Java中没有直接对应的概念...

    语音识别 sphinx4 JAVA 教程

    在Java环境下使用Sphinx-4,首先需要下载并解压Sphinx-4的源代码包,然后通过构建工具如Maven或Gradle进行编译。确保你的开发环境中已安装Java JDK,并配置好环境变量。Sphinx-4的配置文件(通常是config.xml)需要...

    java源码包---java 源码 大量 实例

    util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以...

    备忘录日程管理java代码

    总的来说,"备忘录日程管理java代码"项目涵盖了Java编程、GUI设计、事件处理、日期时间操作、数据存储、测试和项目管理等多个方面,是一个综合性的Java应用开发案例。通过学习和实践这样的项目,开发者可以提升自己...

    java转js工具

    Java到JavaScript转换工具有助于开发者将已有的Java代码库移植到JavaScript环境中,这在Web开发中尤其有用,因为JavaScript是浏览器端的主要脚本语言。这样的工具能够帮助开发者利用Java的强大功能来构建前端应用,...

    java美元兑人民币汇率的工具类

    人民币兑美元汇率的java工具类,人民币兑美元汇率的java工具类人民币兑美元汇率的java工具类

    java中ping命令ping工具类(循环ping)

    java中ping命令ping工具类(循环ping) java ping ip ping命令 ping工具类 支持linux和windows等所有平台 Ping是Windows下的一个命令 在Unix和Linux下也有这个命令。 ping也属于一个通信协议,是TCP/IP协议的一部分 ...

    Java反编译工具jd-gui

    JD-GUI是使用C++开发的一款Java反编译工具,它是一个独立图形界面的Java源代码“.class”文件反编译工具。 JD-GUI是使用C++开发的一款Java反编译工具,它是一个独立图形界面的Java源代码“.class”文件反编译工具。

    Java生成兑换码工具类(英文26个字母加数字随机生成)

    生成指定位数的兑换码,(数字、大写字母随机混排)+(数字、小写字母随机混排)+(小写字母与数字混排),三种方式生成兑换码!

    java常用工具类打包下载

    J2EE常用工具类汇总 ...J2EE常用工具类—时间处理工具类 J2EE常用工具类—文件打包解包处理类 J2EE常用工具类——文件操作类 J2EE常用工具类——邮件处理类(javaMail发送邮件) J2EE常用工具类——字符串工具类

    cors-filter-1.7.jar 和 java-property-utils-1.9.jar

    而`java-property-utils-1.9.jar` 提供了一些用于处理Java属性文件的工具类,这些工具在配置CORS过滤器时可能会用到,例如读取配置文件中的CORS策略。 在配置CORS过滤器时,首先需要将这两个库添加到项目的类路径中...

    【原创示例代码】JAVA解析GBT32960协议 - (第一部分)数据包结构

    本资源内,包含原创代码如下: 1、Command_0x02.java 运行主类mian()方法类 ...以上通过JAVA实现报文协议解析的原创代码,即十六进制报文解析的示例代码。【注:可关注本作者关于报文解析,该系列的示例源码和文章】

    很强大的java代码混淆工具 Jocky

    Jockey跟其他混淆工具不同的是:它是直接对编译过程做文章,也就是在把java文件编译为class文件的过程中对代码进行混淆,混淆后的代码中包含很多JVM 指令,大家知道JVM指令是面向机器的,人类一般很难看懂!...

Global site tag (gtag.js) - Google Analytics