2013-03-27 19 views
2

我有一個讀取和寫入數據的servlet。這裏是我的代碼片段org.opendatafoundation.data.spss.SPSSFileException:讀取數據時出錯:字符串變量的意外壓縮代碼

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    SPSSFile file = null; 
    try { 
     File f = new File(getServerDiretory() + "dabadeba_2011.01.03.sav"); 

     if (!f.exists()) { 
      System.out.println("not found"); 
      return; 
     } 
     file = new SPSSFile(f); 

     file.loadMetadata(); 
     file.loadData(); 

     if (file == null) { 
      System.err.println("vai"); 
      return; 
     } 

     Document doc = file.getDDI2(); 

     //set up a transformer 
     TransformerFactory transfac = TransformerFactory.newInstance(); 
     Transformer trans = transfac.newTransformer(); 
     trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
     trans.setOutputProperty(OutputKeys.INDENT, "yes"); 
     trans.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "yes"); 

     StringWriter sw = new StringWriter(); 
     StreamResult result = new StreamResult(sw); 
     DOMSource source = new DOMSource(doc); 
     trans.transform(source, result); 
     String xmlString = sw.toString(); 

     writeToFile(xmlString); 

     out.println(xmlString); 

    } catch (TransformerException ex) { 
     Logger.getLogger(SPSSReaderServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(SPSSReaderServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (SPSSFileException ex) { 
     Logger.getLogger(SPSSReaderServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     out.close(); 
     if (file != null) { 
      file.close(); 
      System.out.println("done, file closed"); 
     } 
    } 
} 

一切似乎都在工作,直到我刷新JSP並再次調用此servlet。以下是刷新頁面後出現的錯誤:

SEVERE: org.opendatafoundation.data.spss.SPSSFileException: Error reading data: unexpected compression code for string variable 
    at org.opendatafoundation.data.spss.SPSSDataRecord.read(SPSSDataRecord.java:161) 
    at org.opendatafoundation.data.spss.SPSSDataRecord.read(SPSSDataRecord.java:54) 
    at org.opendatafoundation.data.spss.SPSSFile.loadData(SPSSFile.java:1277) 
    at ge.geostat.metadata.web.servlet.SPSSReaderServlet.processRequest(SPSSReaderServl‌​et.java:63) 
    at ge.geostat.metadata.web.servlet.SPSSReaderServlet.doGet(SPSSReaderServlet.java:1‌​40) 

當我重新部署應用程序並運行它時,它工作正常。我想這是一個內存問題,任何幫助將不勝感激

+0

請檢查catalina日誌文件(如果您使用tomcat)並讓我們知道發生異常的位置。 – boomz 2013-03-27 23:52:14

+0

我使用Glasfish,這裏是空穴例外: 重度:org.opendatafoundation.data.spss.SPSSFileException:錯誤讀取數據:對字符串變量意外壓縮碼 \t在org.opendatafoundation.data.spss.SPSSDataRecord.read( SPSSDataRecord.java:161) \t在org.opendatafoundation.data.spss.SPSSDataRecord.read(SPSSDataRecord.java:54) \t在org.opendatafoundation.data.spss.SPSSFile.loadData(SPSSFile.java:1277) \t at ge.geostat.metadata.web.servlet.SPSSReaderServlet.processRequest(SPSSReaderServlet.java:63) \t at ge.geostat.metadata.web.servlet.SPSSReaderServlet.doGet(SPSSReaderServlet.java:140) – 2013-03-27 23:54:32

+0

將數據寫入文件後關閉文件嗎? – boomz 2013-03-27 23:59:17

回答

0

謝謝你們的幫助。我已經找到了問題,它可能有助於某人使用org.opendatafoundation SPSS閱讀器類

因此,問題出在loadData()方法,它使用靜態變量,必須在第二個調用:SPSSDataRecord.clusterIndex = 8;

/** 
* Load the data section of the file into the variables in memory. This may be expensive on memory, use with care on large datasets 
* 
* @throws SPSSFileException 
* @throws IOException 
*/ 
public void loadData() throws IOException, SPSSFileException { 
    if (dataStartPosition < 1) { 
     // this has not been initialized, we don't actually know where the data starts 
     throw new SPSSFileException("Error: data location pointer not initialized."); 

    } 
    SPSSDataRecord data = new SPSSDataRecord(); 

    SPSSDataRecord.clusterIndex = 8; //---This is the fix!!! 
    seek(dataStartPosition); 
    for (int i = 0; i < infoRecord.numberOfCases; i++) { 
     // log("\nRECORD "+(i+1)+" offset "+this.getFilePointer()); 
     data.read(this); 
    } 
    isDataLoaded = true; 
} 
1

因爲刷新頁面時會發生異常,因爲您忘記關閉文件,所以會發生異常。我相信問題就在於此。因爲你第一次建立你的項目是有效的,在那之後它不起作用。您應該在finally區塊中調用close文件的方法。

+0

你能詳細說一下嗎?這聽起來更像是一個評論。 – bfavaretto 2013-03-28 00:53:57

+0

我們在上面的評論中有一些協作。所以我解釋了一下!該帖子已被編輯! – boomz 2013-03-28 01:01:11

+0

從對這個問題的評論中,*「仍然沒有任何運氣」的哪個部分*你不瞭解?在評論中發佈的代碼也只顯示'finally'中的關閉調用。你錯過了嗎? – BalusC 2013-03-28 01:05:26