我有一个大约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();
}
答案 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)
首先。 几乎你的代码的每一行都是超级无效的。
System.out.println(i);
机器非常重substring(2);
它也很重,尝试将其更改为lines[i].chatAt(...)
content=""
。制作一些StringBuilder,并使用append。