我正在使用Groovy在.csv文件中执行一些大量写入。更具体地说,我有一个正在运行的Quartz作业,并创建了一些发送到RabbitMQ队列的Map消息。队列正由10个消费者使用,并导致生成一些字符串列表。对于List中的每个元素,我只需将它写在一个管道分隔的.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()
}
也得到了同样的东西......
如果出现问题,那么所有线路都会失败。可能是某种竞争条件,并发还是我不知道还有什么问题?
任何帮助将不胜感激。
由于
答案 0 :(得分:3)
你应该采取第二种方式,即:
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
个字符