2013-10-22 43 views
0

我的Grails應用程序從數據庫讀取數據並將數據寫入CSV文件。最近,它已經失敗,出現以下錯誤:寫CSV文件:IOException:流關閉

java.io.IOException: Stream closed 
     at java.io.BufferedWriter.ensureOpen(BufferedWriter.java:98) 
     at java.io.BufferedWriter.write(BufferedWriter.java:203) 
     at java.io.Writer.write(Writer.java:140) 
     at sun.reflect.GeneratedMethodAccessor1116.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 

錯誤發生時,我做了以下(writer.write(builder.toString()):

Writer writer 
String delimiter =',' 

Pattern p 

public CsvGenerator() { 
    p = Pattern.compile(delimiter) 
} 

public CsvGenerator(String fullPath) { 
    writer = openWriter(fullPath) 
    p = Pattern.compile(delimiter) 
} 
public CsvGenerator(String fullPath, String delimiter) { 
    writer = openWriter(fullPath) 
    this.delimiter = delimiter 
    p = Pattern.compile(this.delimiter) 
} 

protected Writer openWriter(String fullPath) { 
    Writer writer = new BufferedWriter(new FileWriter(fullPath)) 
    return writer 
} 

public void closeWriter() { 
    if (writer !=null) { 
     writer.close() 
    } 
} 

public void writeLine(List<Object> entries) { 
    log.info "${entries}" 
    StringBuilder builder = new StringBuilder() 
    entries.eachWithIndex { Object entry, int index -> 
     builder.append(entry ==null? '': stripChars(entry.toString())) 
     //writer.write(entry ==null? '': stripChars(entry.toString())) 
     if (index < entries.size()-1) { 
      builder.append(delimiter) 
      //writer.write(delimiter) 
     } 
    } 
    builder.append('\r\n') 
    writer.write(builder.toString()) 
} 

private String stripChars(String s) { 
    String result =s.trim() 
    return p.matcher(s).replaceAll('') //result.replace(delimiter,'') 
} 

我讀過,原因被寫入已經寫入間關閉。這是否正確?

+0

您發佈的代碼太少。 – Nishan

回答

0
def userDataAsCSV(){ 
     response.setHeader("Content-disposition","attachment; filename=User.csv") 
     def lists = User.list() 
     def newRecord="Id Name \n" 
     lists.each{ 
      newRecord += "${it.id} ${it.name} \n" 
     } 
     render (contentType : "text/csv",text:newRecord) 
} 

這是一個用於創建和下載來自數據庫的數據CSV文件中的代碼。

+0

你能看到爲什麼我現有的代碼失敗嗎? – TheCoder

+0

我認爲你使用純的java.in grails代碼複雜,使用groovy.see csv插件或導出插件最簡單的方法。 – Visme

相關問題