我有一个包含如下字符的文件:ABCD...HHCCCCHH..BC
H
现在,如果两个字符之间的间隔H
小于 20 个字符,我想删除两个字符之间的字符。并将输出写入一个新文件。因此,新文件将如下所示:
ABCD...HH..BC
这可以快速完成吗?
我有一个包含如下字符的文件:ABCD...HHCCCCHH..BC
H
现在,如果两个字符之间的间隔H
小于 20 个字符,我想删除两个字符之间的字符。并将输出写入一个新文件。因此,新文件将如下所示:
ABCD...HH..BC
这可以快速完成吗?
如果文件可以轻松放入内存,则可以使用 Apache commons-io。
String input = FileUtils.readFileToString(new File("inputFile"), "UTF-8");
Pattern p = Pattern.compile("H[^H]{1,19}H");
Matcher m = p.matcher(input);
String output = m.replaceAll("HH");
FileUtils.writeStringToFile(new File("outputFile"), output, "UTF-8");
纯Java代码
public static void main(String[] args) throws Exception {
BufferedReader in=new BufferedReader(new FileReader("d:\\data1.txt"));
StringBuilder sb=new StringBuilder();
String line=null;
while((line=in.readLine())!=null)
sb.append(line);
String alteredData=sb.toString().replaceAll("H.{1,19}H", "HH");
BufferedWriter out=new BufferedWriter(new FileWriter("d:\\data2.txt"));
out.write(alteredData);
in.close();
out.close();
}
我会将此作为对 John Watts 回答的评论,但它有点太长了......
缓冲 I/O 是 Java 非常高效的。无需将整个文件加载到内存中即可获得不错的性能。假设它是一个面向行的文件,并且模式不跨越行边界,这就足够了:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
...
BufferedReader r = new BufferedReader(new FileReader(inputFile));
FileWriter w = new FileWriter(outFile);
String line;
Pattern p = Pattern.compile("HH.{1,19}HH");
while (((line = r.readLine()) != null)
{
Matcher m = p.matcher(line);
w.write(m.replaceAll("HHHH"));
w.write('\n');
}
w.close();
r.close();
...