2011-11-27 56 views
1

我試圖訪問該網站UNIPROT檢索蛋白質序列與他們的個人資料爲XML文件的列表。文件大小很大。我正在使用JBPM full package附帶的eclipse。另外,我在虛擬盒子下使用Ubuntu。現在,當我運行代碼,我得到這個堆棧跟蹤:需要解決這個問題:java.io.IOException異常:早產EOF

java.io.IOException: Premature EOF 
    at sun.net.www.http.ChunkedInputStream.fastRead(ChunkedInputStream.java:234) 
    at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:662) 
    at java.io.FilterInputStream.read(FilterInputStream.java:116) 
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2512) 
    at edu.uga.uniprot.amna.QueryExecuter.ExecuteQuery(QueryExecuter.java:40) 
    at edu.uga.uniprot.amna.Uniprot.getProteenStringByDFamily(Uniprot.java:40) 
    at edu.uga.uniprot.amna.Uniprot.getProteensByDFamily(Uniprot.java:55) 
    at org.drools.bpmn2.Process_org_drools_bpmn2_Hello_World_0.action4(Process_org_drools_bpmn2_Hello_World_0.java:60) 
    at org.drools.bpmn2.Process_org_drools_bpmn2_Hello_World_0Action4Invoker.execute(Process_org_drools_bpmn2_Hello_World_0Action4Invoker.java:14) 
    at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:47) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerConnection(NodeInstanceImpl.java:185) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:150) 
    at org.jbpm.workflow.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:49) 
    at org.jbpm.workflow.instance.node.StartNodeInstance.internalTrigger(StartNodeInstance.java:41) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122) 
    at org.jbpm.ruleflow.instance.RuleFlowProcessInstance.internalStart(RuleFlowProcessInstance.java:35) 
    at org.jbpm.process.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:188) 
    at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:302) 
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:154) 
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:124) 
    at org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1095) 
    at org.drools.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:306) 
    at com.sample.ProcessTest.main(ProcessTest.java:49) 
java.lang.RuntimeException: unable to execute Action 
    at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:49) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerConnection(NodeInstanceImpl.java:185) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:150) 
    at org.jbpm.workflow.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:49) 
    at org.jbpm.workflow.instance.node.StartNodeInstance.internalTrigger(StartNodeInstance.java:41) 
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122) 
    at org.jbpm.ruleflow.instance.RuleFlowProcessInstance.internalStart(RuleFlowProcessInstance.java:35) 
    at org.jbpm.process.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:188) 
    at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:302) 
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:154) 
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:124) 
    at org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1095) 
    at org.drools.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:306) 
    at com.sample.ProcessTest.main(ProcessTest.java:49) 
Caused by: java.lang.NullPointerException 
    at java.io.StringReader.<init>(StringReader.java:33) 
    at edu.uga.uniprot.amna.Uniprot.loadProteenFromString(Uniprot.java:117) 
    at edu.uga.uniprot.amna.Uniprot.getProteensByDFamily(Uniprot.java:58) 
    at org.drools.bpmn2.Process_org_drools_bpmn2_Hello_World_0.action4(Process_org_drools_bpmn2_Hello_World_0.java:60) 
    at org.drools.bpmn2.Process_org_drools_bpmn2_Hello_World_0Action4Invoker.execute(Process_org_drools_bpmn2_Hello_World_0Action4Invoker.java:14) 
    at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:47) 
    ... 14 more 

任何一個可以幫助如何解決這個錯誤還是什麼原因的呢?

這裏是生成錯誤的代碼:

public static String ExecuteQuery(String queryURL, boolean writeFile) { 

    URL url; 

    try { 

     System.out.println("Strat getting Data"); 

     String output = ""; 

     int read; 

     RandomAccessFile file = null; 

     url = new URL(queryURL); 

     HttpURLConnection connection = 

       (HttpURLConnection) url.openConnection(); 



     connection.setRequestProperty("Content-Type", "application/xml"); 

     connection.connect();  



     //read the result from the server 

     if(writeFile == true) { 

      file = new RandomAccessFile(fileName, "rw"); 

     } 

     InputStream stream = connection.getInputStream(); 

     byte[] buffer = new byte[1024]; 

     BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 



     while((read = stream.read(buffer, 0, 1024)) != -1) { 

      //System.out.println(new String(buffer)); 

      output = output + new String(buffer).substring(0, read); 

      if(writeFile == true) { 

       file.write(buffer, 0, read); 

      } 

      buffer = new byte[1024]; 

     } 

     System.out.println(output); 

     return output; 

    } catch (MalformedURLException e) { 

     // TODO Auto-generated catch block 

     e.printStackTrace(); 

    } catch (IOException e) { 

     // TODO Auto-generated catch block 

     e.printStackTrace(); 

    } 

    return null; 

} 
+0

某些Java代碼如何? – Michael

+0

你不需要每次在該循環周圍分配一個新的緩衝區,這只是詛咒GC死亡。您可以將'new String(buffer).substring(0,read)'重寫爲'new String(buffer,0,read)'。 – EJP

回答

-1

我終於下定了決心,這似乎是因爲快慢速連接讀取要發生的問題。一旦我添加了System.out.println(new String(buffer))它工作正常。

println聲明減慢讀取操作並使其與連接速度兼容。

我希望這有助於任何人都面臨同樣的問題。

+1

不可靠的解釋。您的閱讀代碼不能以比數據到達更快的速度運行:在沒有數據時它會阻止。 – EJP

+0

EJP我發佈了這個問題,沒有人給出一個合理的解決方案,因爲錯誤「過早的EOF」很奇怪。所以,如果你不能相信這個解決方案,請讓我知道你將如何解決這個問題,代碼已經發布如此,繼續並運行它。 – thinkBig

+3

我沒有說我知道解決方案,我說你的解釋沒有說服力。換句話說,你還不知道解決方案。您尚未解決問題:您剛剛移動了它,或推遲了它。 – EJP

1

此錯誤是由你上Uniprot.java的117線傳遞一個空值到新的StringReader()引起的。

你可以通過你的堆棧跟蹤看到:

Caused by: java.lang.NullPointerException 
    at java.io.StringReader.<init>(StringReader.java:33) 
    at edu.uga.uniprot.amna.Uniprot.loadProteenFromString(Uniprot.java:117) 
    at edu.uga.uniprot.amna.Uniprot.getProteensByDFamily(Uniprot.java:58) 

爲StringReader的構造函數如下:

public StringReader(String s) { 
    this.str = s; 
    this.length = s.length(); // line 33 
} 

查看更多StringReader

+0

感謝您的回覆哥們,但我在詢問java.io.IOException:過早的EOF,它會在稍後導致null值。 – thinkBig

+1

這是一個例外,還是兩個例外?如果它是兩個,那麼你需要發佈你的代碼,以便我們可以看到它。 edu.uga.uniprot.amna.QueryExecuter.ExecuteQuery最好是 –

+0

我剛添加了代碼。 – thinkBig

1

如果你正在嘗試下載很多UNIPROT條目在一個HTTP連接,你可能對你的HTTP連接死去。我建議你看看http://www.uniprot.org/faq/28#retrieving_entries_via_queries,並在你的http請求中使用offset和limit參數來限制你一次嘗試檢索的條目數量。

動態HTTP請求往往下載非常大的結果集時失敗。另一種選擇是通過ftp下載所有條目並在下載文件上工作。請參閱UniProt FTP site

相關問題