`

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

    【强2】30个java工具类

    使用java工具类可有效的提高开发效率! 没有CSDN积分的朋友到这里源头下载:http://www.javacs.cn/bbs/thread-382-1-1.html 感谢支持 [工具类] CookieCounter .java.txt [工具类] 验证码img .jsp.txt [工具类] Java中...

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

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

    java开发,30个常用工具类总结,全部来自项目实践中用到的工具类

    在Java开发中,工具类是程序员经常会用到的代码模块,它们封装了各种常见的操作,提高了代码的可重用性和可维护性。以下是对标题和描述中提到的几个常用工具类的详细说明: 1. **DateUtils**: `java.util.Date` 和 ...

    mysql-connector-java-5.1.30工具

    3. **建立连接**:在Java代码中,使用`DriverManager.getConnection()`方法建立到MySQL服务器的连接: ```java String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "username"; String ...

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

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

    语音识别 sphinx4 JAVA 教程

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

    备忘录日程管理java代码

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

    java转js工具

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

    java实现sftp操作工具类

    1分让你得到sftp常用操作工具,工具实现如下操作: 1)得到当前工作目录地址 2)改变目录为配置的远程目录 3)取文件目录列表 4)取文件列表 5)下载文件 6)复制文件 7)删除文件 8)目录是否存在,文件是否存在 9)移动文件 ...

    Java poi导入导出EXCEL工具类(兼容各版本)

    概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...

    mysql-connector-java-8.0.11

    MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够方便地在MySQL数据库上执行SQL查询和操作。在这个"mysql-...

    《Java项目开发全程实录》书本源代码

    《Java项目开发全程实录》是一本专注于Java编程和项目实践的书籍,其源代码提供了丰富的实例和案例,帮助读者深入理解Java在实际项目中的应用。这本书的核心目标是引导读者从理论到实践,掌握Java开发的全过程,包括...

    java keytool gui 图形工具 portecle-1.7.zip

    java keytool gui 图形工具 portecle-1.7.zip Portecle 是一个图形化界面的 JDK 中的命令行工具 keytool ,可生成各种不同类型的密钥库,生成并存储相关的 X.509 证书、生成 CSRs、导入和储存信任的证书并进行维护。...

    Android-JNI完整工程,实现c++调用java和java调用c++

    Android-JNI,全称为Java Native Interface,是一种技术,允许Java代码和其他语言编写的代码进行交互。这个完整工程展示了如何在Android应用中使用JNI,实现C++与Java之间的双向调用。这种技术在需要高效计算、利用...

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

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

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

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

    《kettle中调用java类》示例代码

    在标题《kettle中调用java类》示例代码中,我们关注的是如何在Kettle的转换或作业中嵌入Java代码,以实现更复杂的数据处理逻辑。 首先,Kettle支持两种方式来调用Java类:使用“Java Class”步骤和使用“Execute ...

    java jdk-8u51-windows-i586.exe

    这些工具使得开发者能够创建、调试和优化Java代码,并确保其在不同平台上的一致性。 在Java JDK 8u51中,"u51"代表的是更新版本号,意味着这是8系列的第51次更新。这次更新可能包含了性能优化、新的特性和对之前...

    Java实现的分页工具类

    本篇文章将详细探讨如何使用Java实现一个分页工具类,以及在实际应用中如何运用这个工具。 首先,分页的基本概念是通过指定每页显示的数据量(每页记录数,即pageSize)和当前页数(pageNumber),从数据库中获取...

Global site tag (gtag.js) - Google Analytics