Java實現 遞歸讀取文件 並替換文件中字符子串
注:適用於修改代碼中大量重複的變量名稱或者字符過濾之類的場景
按道理來講,直接複製我的代碼到兩個.java文件,注意引用關係就能跑
實現代碼:
package com.tools;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.List;
/**
* 遞歸讀取文件夾內文件,並替換字符串工具類
* @author Dacle
*
*/
public class StrReplace {
/**
* 文件或文件夾路徑
*/
private String filePath;
/**
* 遞歸讀取的file對象列表
*/
private List<File> files = new LinkedList<File>();
/**
* 文件編碼方式
*/
private String encoding = "UTF-8";
/**
* 文件名選中條件
*/
private String keyStr = ".";
/**
* 文件名過濾條件
*/
private String filterStr = "###";
/**
* 啓動ReplaceStr
* @param oldStr 被替換的字符串
* @param newStr 用於替換的字符串
*/
public void processReplace(String oldStr,String newStr){
readFiles(filePath);
for(int i=0;i<files.size();i++){
if(files.get(i).exists() && files.get(i).isFile())
replaceStr(files.get(i), oldStr, newStr);
}
}
/**
* 替換動作的實現
* @param file 將要操作的文件對象
* @param oldStr 被替換的字符串
* @param newStr 用於替換的字符串
*/
private void replaceStr(File file, String oldStr, String newStr) {
InputStreamReader reader = null;
StringBuffer sb= new StringBuffer("");
String line = "";
try {
reader = new InputStreamReader(new FileInputStream(file),encoding);
BufferedReader br = new BufferedReader(reader);
while((line = br.readLine()) != null) {
//System.out.println(line);
if(line.indexOf(oldStr)>-1){
System.out.println(line);
line = line.substring(0,line.indexOf(oldStr))+newStr+line.substring(line.indexOf(oldStr)+oldStr.length());
System.out.println(line);
}
sb.append(line+"\n\t");
//System.out.println(line);
}
br.close();
reader.close();
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file),encoding);
BufferedWriter bw = new BufferedWriter(writer);
bw.write(sb.toString());
bw.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 初始化文件或文件夾,遞歸讀取文件到內存
* @param filePath
*/
private void readFiles(String filePath) {
if(filePath == null)
return;
File temp = new File(filePath);
System.out.println(temp.getPath());
File[] file = null;
if(temp.isFile()){
files.add(temp);
//System.out.println(temp.getPath());
}else{
file = temp.listFiles();
}
if(file == null){
return;
}
for(File f : file){
if(f.isFile()){
String fileName = f.getName();
//System.out.println("filename: "+fileName);
if(fileName.indexOf(keyStr)>=0)//判斷文件名中是否存在關鍵詞,若存在,則選中
if(fileName.indexOf(filterStr)==-1){//判斷文件名中是否存在過濾詞,若不存在,則選中
files.add(f);
//System.out.println("filePath: "+f.getPath());
}
}else if(f.isDirectory()){
readFiles(f.getPath());
//System.out.println(f.getPath());
}else
System.out.println("文件讀入有誤!");
}
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) throws Exception {
if(filePath != null){
this.filePath = filePath;
}else
throw new Exception("文件名不能爲空");
}
public String getEncoding() {
return encoding;
}
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public String getKeyStr() {
return keyStr;
}
public void setKeyStr(String keyStr) {
this.keyStr = keyStr;
}
public String getFilterStr() {
return filterStr;
}
public void setFilterStr(String filterStr) {
this.filterStr = filterStr;
}
}
使用該工具的一個簡單Demo:
package com.main;
import com.tools.StrReplace;
public class Test {
public static void main(String[] args) {
try {
//新建文件字符替換工具類對象
StrReplace strReplace = new StrReplace();
//設置文件路徑
strReplace.setFilePath("E:/java");
//可選:設置編碼方式,默認爲UTF-8,對某些文件若不設置編碼方式可能會到這中文亂碼
strReplace.setEncoding("UTF-8");
//可選:設置keyStr,文件名包含該字符串的文件纔會被選中
strReplace.setKeyStr(".vm");
//可選:設置過濾詞,文件名包含該字符串的文件將不會被選擇,優先級高於keyStr
strReplace.setFilterStr("副本");
strReplace.processReplace("數量(手)", "手數");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}