我试过这样做:
import java.io.*;
public class ConvertChar {
public static void main(String args[]) {
Long now = System.nanoTime();
String nomCompletFichier = "C:\\Users\\aahamed\\Desktop\\test\\test.xml";
Convert(nomCompletFichier);
Long inter = System.nanoTime() - now;
System.out.println(inter);
}
public static void Convert(String nomCompletFichier) {
FileWriter writer = null;
BufferedReader reader = null;
try {
File file = new File(nomCompletFichier);
reader = new BufferedReader(new FileReader(file));
String oldtext = "";
while (reader.ready()) {
oldtext += reader.readLine() + "\n";
}
reader.close();
// replace a word in a file
// String newtext = oldtext.replaceAll("drink", "Love");
// To replace a line in a file
String newtext = oldtext.replaceAll("&(?!amp;)", "&");
writer = new FileWriter(file);
writer.write(newtext);
writer.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}然而,上面的代码比创建两个不同的文件需要更多的时间来执行:
import java.io.*;
public class ConvertChar {
public static void main(String args[]) {
Long now = System.nanoTime();
String nomCompletFichier = "C:\\Users\\aahamed\\Desktop\\test\\test.xml";
Convert(nomCompletFichier);
Long inter = System.nanoTime() - now;
System.out.println(inter);
}
private static void Convert(String nomCompletFichier) {
BufferedReader br = null;
BufferedWriter bw = null;
try {
File file = new File(nomCompletFichier);
File tempFile = File.createTempFile("buffer", ".tmp");
bw = new BufferedWriter(new FileWriter(tempFile, true));
br = new BufferedReader(new FileReader(file));
while (br.ready()) {
bw.write(br.readLine().replaceAll("&(?!amp;)", "&") + "\n");
}
bw.close();
br.close();
file.delete();
tempFile.renameTo(file);
} catch (IOException e) {
// writeLog("Erreur lors de la conversion des caractères : " + e.getMessage(), 0);
} finally {
try {
bw.close();
} catch (Exception ignore) {
}
try {
br.close();
} catch (Exception ignore) {
}
}
}
}有没有办法在不创建临时文件和减少执行时间的情况下执行第2段代码?我正在进行代码优化。
发布于 2016-04-28 11:56:18
第一个例子中的主要罪魁祸首是,您使用字符串连接构建oldtext效率低下,正如解释的here。这将为每个级联分配一个新字符串。Java提供了用于构建字符串的StringBuilder:
StringBuilder builder = new StringBuilder;
while(reader.ready()){
builder.append(reader.readLine());
builder.append("\n");
}
String oldtext = builder.toString();您还可以在StringBuilder中构建文本时进行替换。代码的另一个问题是,您需要ready()来检查文件中是否还有一些内容--检查readLine()的结果。最后,关闭流应该在一个finally或尝试资源块中。结果可能如下所示:
StringBuilder builder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line = reader.readLine();
while (line != null) {
builder.append(line.replaceAll("&(?!amp;)", "&"));
builder.append('\n');
line = reader.readLine();
}
}
String newText = builder.toString();不过,写入临时文件也是一个很好的解决方案。I/O的数量是最慢的,在这两种情况下都是相同的--一次读取完整的内容,一次写入结果。
发布于 2016-04-28 11:56:26
第一个程序速度慢的主要原因可能是它正在逐步构建字符串oldtext。这方面的问题是,每次向其中添加另一行时,它可能需要复制一份。由于每个副本所需的时间与要复制的字符串的长度大致成正比,所以执行时间将与输入文件大小的平方成正比。
您可以通过尝试处理不同长度的文件并查看运行时如何依赖于文件大小来检查这是否是您的问题。
如果是这样的话,解决这个问题的一个简单方法就是 class,它正是用于这个任务的:增量地构建一个大字符串。
https://stackoverflow.com/questions/36913804
复制相似问题