使用 Groovy(Grails) 写入文件对于某些行(断行)失败

Posted

技术标签:

【中文标题】使用 Groovy(Grails) 写入文件对于某些行(断行)失败【英文标题】:Writing to file with Groovy(Grails) fails for some lines (broken lines) 【发布时间】: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 对象很好,但是当它们被写入文件时,其中一些对象无法完全写入。 【参考方案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

以上是关于使用 Groovy(Grails) 写入文件对于某些行(断行)失败的主要内容,如果未能解决你的问题,请参考以下文章

Grails 数据库迁移:将 xml/groovy diff 转换为 sql 脚本文件

Grails:服务 VS Groovy 类

grails - 如何强制更新子依赖项

使用 Spock 进行 Grails 测试 - 选择哪个模拟框架?

从 grails 应用程序中的自定义 groovy 文件加载 spring bean

Grails项目BuildConfig.groovy Tomcat插件版本?