首页 > 解决方案 > 提高在文件夹和子文件夹文件 Java 中查找和替换的性能

问题描述

我有一个java程序可以在文件夹和所有子文件夹的文件中查找和替换(比如在文本编辑器中执行它时,例如notepad ++)我所做的是我创建了4个函数第一个函数有文件夹路径参数所以它列出了所有子文件,如果它是一个文件夹,然后再次列出所有子文件,然后在 RecursivePrint 我检查文件的扩展名,如果它是一个不可读的文件,如图像和压缩文件,然后忽略,否则我打开文件使用BufferedReader 并检查字符串并将其替换为新字符串

public void findWord(File pathToStart){
    // find word in every sub folders and subfiles.

    File[] filesInDirectory = pathToStart.listFiles(); // all sub files listed
    findWord = find.getText();
    replaceWord = replace.getText();
    driver();


}
public void driver(){ // drive all the files
    File dir = new File(path.getText());
    //fill here
    if(dir.exists() && dir.isDirectory()) 
    { 
        // array for files and sub-directories  
        // of directory pointed by maindir 
        File arr[] = dir.listFiles(); 
        
          
        // Calling recursive method 
        RecursivePrint(arr,0,0);  
   } 

public void RecursivePrint(File[] arr,int index,int level)  //arr file array
 {  
    // terminate condition 
    if(index == arr.length) 
         return; 
       
     // tabs for internal levels 
     for (int i = 0; i < level; i++) 
         System.out.print("\t"); 
       
     // for files 
     if(arr[index].isFile()){ 
         
         
                 String fileNamee;
   
      
      fileNamee=arr[index].getAbsolutePath();
      
     
    
  if( fileNamee.contains(".png") == false && fileNamee.contains(".jpg") == false && fileNamee.contains(".jpeg") == false 
          && fileNamee.contains(".rawproto") == false&& fileNamee.contains(".apk") == false && fileNamee.contains(".pro") == false){
 modifyFile(fileNamee, findWord, replaceWord);
     
    System.out.println("\nDoing The Task");
}
else{
    //System.out.print("File Not Readaable might be img file or other  on-readable file");
}
  

         

     
     }
       
     // for sub-directories 
     else if(arr[index].isDirectory() && !(arr[index].getName().equals(".git"))) 
     { 
        

         // recursion for sub-directories 
         RecursivePrint(arr[index].listFiles(), 0, level + 1); 
     } 
        
     // recursion for main directory 
     RecursivePrint(arr,++index, level); 
}

  public static void modifyFile(String filePath, String oldString, String newString){
    File fileToBeModified = new File(filePath);
     
    String oldContent = "";
     
    BufferedReader reader = null;
     
    FileWriter writer = null;
     
    try
    {
        reader = new BufferedReader(new FileReader(fileToBeModified));
         
        //Reading all the lines of input text file into oldContent
         
        String line = reader.readLine();
         
        while (line != null) 
        {
            oldContent = oldContent + line + System.lineSeparator();
             
            line = reader.readLine();
        }
         
        //Replacing oldString with newString in the oldContent
         
        String newContent = oldContent.replaceAll(oldString, newString);
         
        //Rewriting the input text file with newContent
         
        writer = new FileWriter(fileToBeModified);
         
        writer.write(newContent);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        try
        {
            //Closing the resources
             
            reader.close();
             
            writer.close();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

好吧,这段代码运行得很好,但问题是即使有一台好的电脑,只有一个 64mb 的文件夹,它也需要很长时间,它会停留超过 20 分钟,所以无论如何我可以提高这个程序的性能

标签: javaswing

解决方案


真正慢的是使用字符串连接,+. 这很容易慢数百倍。

public static void modifyFile(String filePath, String oldString, String newString)
        throws IOException {
    Path file = Paths.get(filePath);
    String oldContent = Files.readString(file, Charset.defaultCharset());
    String newContent = oldContent.replaceAll(oldString, newString);
    if (!newContent.equalsOldContent)) {
        Files.writeString(file, newContent, Charset.defaultCharset());
    }
}

Files中还有其他好东西,也可以用于递归遍历所有文件、子目录等。


推荐阅读