java - 提高在文件夹和子文件夹文件 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 分钟,所以无论如何我可以提高这个程序的性能
解决方案
真正慢的是使用字符串连接,+
. 这很容易慢数百倍。
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中还有其他好东西,也可以用于递归遍历所有文件、子目录等。
推荐阅读
- reactjs - 如何在 spfx 中开发自定义设计和母版页
- bash - 如何控制作为参数之一传递给 bash 函数的重定向运算符?
- android - DialogFragment 阻止上一个片段上的动画
- node.js - Nodejs moment not able to convert string to date
- mongodb - Mongodb聚合查找以在每个数组中添加带有条件的字段
- javascript - TypeError:无法在 Array.forEach 处读取未定义的属性“名称”
- list - 如何从 firestore 检查有多少项目具有真值或假值并在列表中仅显示真值?- 颤动
- ios - JSON 写入中的类型无效 (RTCIceCandidate)
- reactjs - react并发模式的使用方法
- typescript - 打字稿中可选函数参数下的解构参数抛出错误