从每行JAVA替换String的两个第一个字符的最佳方法

时间:2014-07-31 11:55:15

标签: java substring

我有一个大约300万行的文本文件,我需要用“”替换每行的前两个字符。 我目前的代码是

String[] lines = content.split("\n");
        content = "";
        for(int i = 0;i<lines.length;i++){
            System.out.println(i);
            lines[i].substring(2);
            content = content + lines[i];
        }

完成需要3-4天。 有没有更快的方法呢?

我的整个代码:

 try {
        String content = readFile("text.txt", StandardCharsets.ISO_8859_1);
        content = content.replaceAll("\\d","");
        content = content.replaceAll("\\.","");
        String[] lines = content.split("\n");
        content = "";
        for(int i = 0;i<lines.length;i++){
            System.out.println(i);
            lines[i].substring(2);
            content = content + lines[i];
        }
         PrintWriter out = new PrintWriter("texty text.txt");
        out.println(content);
    } catch (IOException e) {
        e.printStackTrace();
    }

4 个答案:

答案 0 :(得分:11)

  

有更快的方法吗?

是 - 不要执行重复的字符串连接。 那是杀死你表现的部分。请改用StringBuilder

它甚至没有做你想要的事情 - 你没有使用调用substring的结果。

我怀疑你想要这样的东西:

String[] lines = content.split("\n");
StringBuilder builder = new StringBuilder();
for (String line : lines) {
    builder.append(line.substring(2));
    // I suspect you want this, otherwise you're losing line breaks.
    builder.append("\n");
}
String result = builder.toString();

此外,您应该逐行考虑读取文件而不是读取整个文件然后拆分它。例如:

StringBuilder builder = new StringBuilder();
try (BufferedReader reader = ...) {
    String line;
    while ((line = reader.readLine()) != null) {
        builder.append(line.substring(2));
        builder.append("\n");
    }
}
String result = builder.toString();

除非你在任何时候都真的需要内存中的所有内容,否则在处理它们时写行:

try (BufferedReader reader = ...,
     BufferedWriter writer = ...) {
    String line;
    while ((line = reader.readLine()) != null) {
        // Perform any other manipulations here...
        writer.write(line.substring(2));
        writer.write("\n");
    }
}

答案 1 :(得分:5)

为什么,为什么你在记忆中一下子读完整个shebang?只需从缓冲文件阅读器中读取一行,将一行写入缓冲文件编写器。

答案 2 :(得分:4)

在这种情况下,

sed会快得多:

sed 's/^..//' file > output

您的代码速度太慢的原因是您使用+连接字符串。这会创建一个新对象,复制两个旧字符串的内容,然后忘记两个旧字符串。这给VM带来了很大的压力。

请尝试使用StringBuilder

答案 3 :(得分:2)

首先。 几乎你的代码的每一行都是超级无效的。

  1. 删除System.out.println(i);机器非常重
  2. substring(2);它也很重,尝试将其更改为lines[i].chatAt(...)
  3. 我猜到内容是String,看看你在做什么。每次循环迭代都会创建新的Sting content=""。制作一些StringBuilder,并使用append。
  4. 如果您可以将其更改为BufferReader或FileReader