2011-11-27 55 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

相关问题