【问题标题】:Writing to file with Groovy(Grails) fails for some lines (broken lines)使用 Groovy(Grails) 写入文件对于某些行(断行)失败
【发布时间】:2011-07-03 12:13:05
【问题描述】:

我正在使用 Groovy 在 .csv 文件中执行一些大规模写入。更具体地说,我有一个 Quartz 作业正在运行,并创建了一些发送到 RabbitMQ 队列的 Map 消息。该队列被 10 个消费者使用,并导致生成一些字符串列表。对于列表中的每个元素,我只需将其写入管道分隔的 .csv 文件中。具有写入 .csv 文件的方法的实际服务是标准(单例)事务性 grails 服务。当我记录要写入的行时,一切都很好,但是在文件中,有些行被“破坏”了。我的写作方式是:

def writeRowsToFile(List<String> rows, File file) {
  rows.each {row->
    file.append("${row}\n")
  }
}

最初我使用的是:

file.withWriterAppend {out->
  out.write(row.toString())
  out.newLine()
}

也得到了同样的东西......

如果出现问题,所有行都会失败。可能是某种竞争条件、并发性还是我不知道还有什么问题?

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • “破碎”是指并非所有字符串都写在行中,在某些迭代中。这行写了一半。我附上了我用来写入文件的代码。从我在日志中看到的内容来看,我正在编写的 String 对象很好,但是当它们被写入文件时,其中一些对象无法完全写入。

标签: file csv groovy append


【解决方案1】:

你应该用第二种方式,即:

def writeRowsToFile(List<String> rows, File file) {
  file.withWriterAppend {out->
    rows.eachWithIndex { row, idx ->

      // It's probably \n chars in your strings
      if( row ==~ /.*[\n\r]+.*/ ) {
        println "Detected a CRLF char in rows[$idx]"
      }

      out.writeLine row
    }
  }
}

但是,您说这可能是“某种竞争条件”

是否有多个线程写入同一个文件?

如果不是,您的row 数据中更有可能包含\n 字符

【讨论】:

  • 实际上我没有想到,我的行数据中可能包含换行符。将不得不检查它!如果是你救了我免于从屋顶上跳下来(让我记得我有点傻)
  • 手指交叉就是这样 :-) 如果它们在那里,正则表达式应该检测到它们。不要打败自己!我在我的时代做得更糟;-)
  • 我已经更改了代码,将试一试。非常感谢您的帮助。我会带着这个练习的结果回来。
  • No \n chars detected :-( 而且我仍然得到“断”行,这似乎与上面的行没有任何延续。我认为这与队列有关消费者都写在同一个文件上。我应该在那里添加一些 Thread.sleep() 吗?它会让它真的很慢......
  • Thread.sleep 不会帮助您,(尽管它可能看起来有帮助,但实际上不会)。您可以synchronize writeRowsToFile 方法,或者查看某种并发框架,例如 GPars gpars.codehaus.org -- 这里的页面应该对我有所帮助:ibm.com/developerworks/java/library/j-gpars/index.html#N10407
猜你喜欢
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
相关资源
最近更新 更多