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

  • Post author:
  • Post category:java


工作中不少情况下会使用到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();
 }
 
}



版权声明:本文为huqingpeng321原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。