2011-02-24 72 views
3

我正在使用Groovy在.csv文件中執行一些大量寫入操作。更具體地說,我有一個正在運行的Quartz作業,並創建一些發送到RabbitMQ隊列的Map消息。該隊列正在被10位消費者使用,並導致生成一些字符串列表。對於列表中的每個元素,我只是將它寫入一個以管道分隔的.csv文件中。具有寫入.csv文件的方法的實際服務是標準(單例)事務性Grails服務。當我登錄要寫入的行時,一切正常,但在文件中,某些行被「破壞」。我寫的方法是:使用Groovy(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

\n字符由「破」我的意思是,並不是所有的字符串寫入行,一些反覆。這條線是一半寫的。我附上了我用來寫入文件的代碼。我正在編寫的String對象,從我在日誌中看到的內容都很好,但是當它們寫入文件時,其中的一部分未完全寫入。 – Iraklis 2011-02-24 12:02:17

回答

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數據中有

+1

我其實並沒有想到,我的行數據可能會有換行符。將不得不檢查它!如果這是你從屋頂跳下來救了我(並讓我記得我有點虛) – Iraklis 2011-02-24 12:09:08

+0

手指交叉就是這樣:-)如果他們在那裏,那麼正則表達式應該檢測它們。不要再打敗了!我在我的時間做得更糟;-) – 2011-02-24 12:13:09

+0

我已經改變了代碼,並會試一試。非常感謝您的幫助。我將回來這個練習的結果。 – Iraklis 2011-02-24 12:15:08