使用Groovy(Grails)写入文件失败了一些行(虚线)

时间:2011-02-24 11:34:22

标签: file csv groovy append

我正在使用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()
}

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

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

任何帮助将不胜感激。

由于

1 个答案:

答案 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个字符