Besoin de résoudre ce problème: java.io.IOException: Prématuré EOF
J'essaye d'accéder à la uniprot site web pour récupérer une liste de séquences de protéines avec leurs profils dans un fichier XML. La taille du fichier est énorme. Je suis l'aide de l'eclipse qui viennent avec JBPM package complet. Aussi, je suis en utilisant ubuntu sous virtual box. Maintenant quand je lance mon code j'obtiens ce stacktrace:
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
quelqu'un peut-il aider à la façon de résoudre cette erreur OU ce qui cause de ça?
Voici le code qui génère l'erreur:
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;
}
- Comment quelques-uns des codes Java???
- Vous n'avez pas besoin d'allouer un nouveau tampon à chaque fois autour de cette boucle, c'est juste la flagellation de la GC à la mort. Vous pourriez véritable réécriture
new String(buffer).substring(0, read)
commenew String(buffer, 0, read)
trop.
Vous devez vous connecter pour publier un commentaire.
Cette erreur est causée par vous-même en passant d'une valeur null dans la nouvelle StringReader() à la ligne 117 de Uniprot.java.
Vous pouvez le voir en votre stacktrace:
Le constructeur de StringReader est la suivante:
Voir plus StringReader.
Si vous êtes en train de télécharger beaucoup de uniprot entrées dans une connexion http, vous avez aussi votre connexion http mourir sur vous. Je suggère que vous avez un oeil à http://www.uniprot.org/faq/28#retrieving_entries_via_queries et l'utilisation de l'offset et de limiter les paramètres de votre requête http afin de limiter le nombre d'entrées que vous essayez de récupérer en une seule fois.
Dynamique de la requête http a tendance à échouer lors du téléchargement de très grands ensembles de résultats. L'autre option est de télécharger toutes les entrées via ftp et de travailler sur le fichier à télécharger. Voir le UniProt site FTP
J'ai finalement résolu le problème qui semble être arrivé à cause de la lecture rapide avec une connexion lente. une fois j'ai ajouté un
System.out.println(new String(buffer))
il fonctionne très bien.La
println
déclaration ralentir l'opération de lecture et de la rendre compatible avec la vitesse de connexion.Je souhaite que cela sera utile à toute personne confrontée au même problème.