java文件流处理jd-gui反编译后文件中每行的注释符

工作中不少情况下会使用到jd-gui对jar、war文件进行反编译,然而反编译后的文件每行都会出现
注释符号:/*     */ 这类的,看起来很别扭,于是写了一小段程序来删除这些注释符。

过程中遇到的问题及解决:
开始准备使用边读边写的方式来处理每一行数据,简要代码如下:
 isr = new InputStreamReader(new FileInputStream(file));
 br = new BufferedReader(isr);
 FileWriter fw = new FileWriter(file);
 String eveLine = "";
 while ((eveLine = br.readLine()) != null) {
  //删除每行注释方法
  eveLine = removeSpecialStr(eveLine);
  //处理后写入到每行
  fw.write(eveLine + "\r\n");
  //to-do
 }

然后发现每次都走不到while循环里面,显示文件为空,查了API发现FileWriter(file)会
自动将file文件中的内容清空再被写入。所以出现这个问题。

之后想法是使用RandomAccessFile类的读写模式来完成边读边写,简要代码如下:
isr = new InputStreamReader(new FileInputStream(file));
br = new BufferedReader(isr);
RandomAccessFile raf = new RandomAccessFile(file);
String eveLine = "";
while ((eveLine = br.readLine()) != null) {
 //删除每行注释方法
 eveLine = removeSpecialStr(eveLine);
 //处理后写入到每行
 raf.write((eveLine + "\r\n").getBytes());
 //to-do
}
然而又发现这么操作只是进行了覆盖写入操作,若写入的字符比原有的字符要少,则多出的字符还会存在于文件末尾里面。。

最后思考了很长时间觉得采用如下思路:先把整个文件中的每行数据读取存放到一个list集合中,
然后再用FileWriter写入到此文件,完整代码如下:
package com.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class ProcessFile {
 
 //要处理的文件根目录
 static String filePath = "E:\\test";
 //要处理的特殊字符匹配的正则表达式
 static String regex = "/\\*[\\s\\S]*\\*/\\s";
 
 static BufferedReader br = null;
 static InputStreamReader isr = null;
 
 @SuppressWarnings("unused")
 public static void main(String[] args) throws Exception {
  File file = new File(filePath);
  //判断当前路径下目录文件是否存在
  if (file != null) {
   //获取目录下文件集合和目录地址
   processFile(file.list(), filePath);
  } else {
   System.out.println("系统找不到指定文件!");
  }
  System.out.println("文件处理完毕!");
 }
 
 /**
  * @param filePath  待处理的文件目录路径
  * @param files 待处理的文件
  * 
  */
 static public void processFile(String[] files, String filePath) throws Exception {
  for (int i=0; i<files.length; i++) {
   //取得文件路径
   String path = filePath + "\\" + files[i];
   File file = new File(path);
   //判断文件是否为一个目录
   if (file.isDirectory()) {
    //若为目录则递归处理
    processFile(file.list(), path);
   } else {
    //新建一个保存文件每一行内容的集合
    List<String> list = new ArrayList<String>();
    //读取文件流
    isr = new InputStreamReader(new FileInputStream(file));
    br = new BufferedReader(isr);
    String eveLine = "";
    while ((eveLine = br.readLine()) != null) {
     //处理字符
     String line = removeSpecialStr(eveLine);
     list.add(line);
    }
    //把集合中数据内容写入文件
    writeDataToFile(list, file);
    isr.close();
    br.close();
   }
  }
 }
 
 //处理掉每行带有注释的内容
 static public String removeSpecialStr(String eveLine) {
  //正则匹配替换掉 注释内容
  eveLine = eveLine.replaceAll(regex,"");
  return eveLine;
 }
 
 static public void writeDataToFile(List<String> list, File file) throws Exception {
  FileWriter fw = new FileWriter(file);
  for (String line : list) {
   //每行文件内容后加上“\r\n”换行
   fw.write(line + "\r\n");
  }
  list = null;
  fw.close();
 }
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: jd-gui是一款常用的Java编译工具,它可以将Java程序的class字节码文件编译Java源代码。然而,在使用jd-gui编译后,可能出现文乱码的情况。 这是因为Java程序的字串常量在编译的时候会被转换为Unicode编码,而在编译过程jd-gui默认对这些字串常量进Unicode码的还原,因此在编译结果文字可能会出现乱码。 为了解决这个问题,我们可以在jd-gui的菜单栏选择“File--Settings--Display”,将“Decompiler--Decompile Type”选项设置为“UTF-8”,这样就可以正确地显示文字了。 另外,我们还可以使用其他的编译工具,如Procyon、Fernflower等,这些工具在编译文字时表现更加稳定、准确。同时,我们在编写Java程序时,也可以尽可能使用UTF-8编码,来避免文字的乱码问题。 ### 回答2: jd-gui是一款非常常用的Java编译工具,用于编译Java字节码文件。然而,在使用jd-gui编译Java字节码文件时,可能会出现文乱码的情况。 这是因为Java编译器在编译Java源代码时,会将文字转换成Unicode编码,而jd-gui编译Java字节码文件时,会将这些Unicode编码转换成原来的文字。但是,因为编译时使用的编码和编译时使用的编码不同,可能会导致转换出现错误,进而导致文字乱码。 为了解决这个问题,可以将Java源代码文件的编码与编译后的字节码文件的编码设置为一致。比如,可以将Java源代码文件的编码设置为UTF-8,然后在jd-gui将字节码文件的编码也设置为UTF-8,就可以避免文乱码的问题。 同时,也建议在Java源代码尽量避免使用文字,尽量使用英文或者Unicode编码来表示,这样可以有效地避免文乱码的问题。 ### 回答3: JD-GUI是一个Java字节码编译工具,它可以将Java程序的class文件编译成易于阅读和修改的Java源代码。然而,在使用JD-GUI编译后,我们可能会发现一些文字会显示为乱码。这是因为在Java编译编译过程文字会被编译成Unicode编码,在编译后需要进解码才能正确显示文。 要解决这个问题,我们可以通过编辑JD-GUI的配置文件来改变默认的编码方式。具体的做法是,在JD-GUI的主面板,点击“Options”按钮,然后选择“Preferences”菜单。在弹出的对话框,选择“Decompiler”选项卡,然后将“Default charset”选项改为“GBK”或者“UTF-8”,以便正确解码文字。 如果修改了配置文件后还是无法正确显示文,还可以尝试使用其他编译工具,例如Procyon、Fernflower等,这些工具通常具有更好的对文字的支持。不过需要注意的是,在进Java程序开发时,最好使用英文字命名变量和类名,以避免因为字编码问题带来的不必要麻烦。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值