首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java代码优化,替换文件中的所有字符

Java代码优化,替换文件中的所有字符
EN

Stack Overflow用户
提问于 2016-04-28 11:50:02
回答 2查看 127关注 0票数 2

我试过这样做:

代码语言:javascript
复制
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();
        }
    }

}

然而,上面的代码比创建两个不同的文件需要更多的时间来执行:

代码语言:javascript
复制
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段代码?我正在进行代码优化。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-28 11:56:18

第一个例子中的主要罪魁祸首是,您使用字符串连接构建oldtext效率低下,正如解释的here。这将为每个级联分配一个新字符串。Java提供了用于构建字符串的StringBuilder

代码语言:javascript
复制
    StringBuilder builder = new StringBuilder;
    while(reader.ready()){
        builder.append(reader.readLine());
        builder.append("\n");
    }
    String oldtext = builder.toString();

您还可以在StringBuilder中构建文本时进行替换。代码的另一个问题是,您需要ready()来检查文件中是否还有一些内容--检查readLine()的结果。最后,关闭流应该在一个finally或尝试资源块中。结果可能如下所示:

代码语言:javascript
复制
    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的数量是最慢的,在这两种情况下都是相同的--一次读取完整的内容,一次写入结果。

票数 1
EN

Stack Overflow用户

发布于 2016-04-28 11:56:26

第一个程序速度慢的主要原因可能是它正在逐步构建字符串oldtext。这方面的问题是,每次向其中添加另一行时,它可能需要复制一份。由于每个副本所需的时间与要复制的字符串的长度大致成正比,所以执行时间将与输入文件大小的平方成正比。

您可以通过尝试处理不同长度的文件并查看运行时如何依赖于文件大小来检查这是否是您的问题。

如果是这样的话,解决这个问题的一个简单方法就是 class,它正是用于这个任务的:增量地构建一个大字符串。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36913804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档