工作中不少情况下会使用到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写入到此文件,完整代码如下:
然后再用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 版权协议,转载请附上原文出处链接和本声明。