【问题标题】:Java 6: Copy and manipulate filesJava 6:复制和操作文件
【发布时间】:2015-12-29 08:18:48
【问题描述】:

我想做什么...

我的 XML 文件的名称类似于 SomeName999999blablabla.xml,其中包含大量内容,其中几乎每一行都包含字符串 "999999"。我需要相同的 xml 文件,在名称和文件内容中,999999888888777777 等替换。

问题...

我的代码运行良好,实际上创建了我需要的所有文件,但有时会出现一些小错误。就像在一行中,E 被“随机”替换为 D(它似乎总是比它应该的低一个字母,但我无法确认 100%)。它不是很多,比如 60 个文件中的一两个实例,每个文件大约 100MB。但由于它是一个 xml,这是一个真正的问题,因为这通常是模式违规,这会导致后续处理崩溃。 我完全不知道这是从哪里来的或如何解决它,请帮忙。

到目前为止我的代码...

private void createMandant(String mandant) throws Exception {
    String line;
    File dir = new File(TestConstants.getXmlDirectory());

    for (File file : dir.listFiles()) {
        if (file.getName().endsWith((".xml")) && file.getName().contains("999999")) {
            BufferedReader br = new BufferedReader(new FileReader(file));
            FileWriter fw = new FileWriter(file.getAbsolutePath().replace("999999", mandant));

            while ((line = br.readLine()) != null) {
                fw.write(line.replace("999999", mandant) + "\r\n");
            }

            br.close();
            fw.close();
        }
    }
}

环境...

我们使用的是 Java 6。如前所述,文件非常大。像 100MB,每个几十万行。

【问题讨论】:

  • 换个机器试试,可能是硬件问题。

标签: java io bufferedreader filewriter


【解决方案1】:

String.replace() 似乎有问题 我已将其替换为 StringBuilder:

  while ((line = br.readLine()) != null) {
                index = 0;
                // fw.write(line.replace("999999", mandant) + "\r\n");
                StringBuilder builder = new StringBuilder(line);
                index = builder.indexOf("999999");
                if (index > 0) {
                    fw.write(builder.replace(index, index + 6, mandant).toString() + "\r\n");
                } else {
                    fw.write(line + "\r\n");
                }
            }

...现在它似乎工作了。两次运行已经完成,没有任何问题。

但这似乎很奇怪。难道真的是像 String.replace() 这样被大量使用的函数只是在每几百万次方法调用中随机出现单个字母错误吗?

【讨论】:

  • 你肯定有硬件问题,做一个内存测试并检查你的磁盘。
  • 为什么StringBuilder没有这个问题?
  • StringBuilder 在替换过程中会复制内存,而 string.replace 使用一个正则表达式来逐个复制字符。我猜这里的更多操作只是增加了由于您的硬件问题而导致翻转的可能性。
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多