Java實現遞歸讀取文件夾並逐行替換指定字符子串

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();
        }
    }  

}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章