Mauvais Descripteur de Fichier IOException en Java à l'aide de javax.xml

Je suis en utilisant le standard javax.xml paquet de parser du XML des fichiers sur une machine linux. Mon code est comme suit:

try 
{
    //Prepare parser
    DocumentBuilder documentBuilder = documentBuilderFactory
        .newDocumentBuilder();
    Document document = documentBuilder.parse(file.getAbsolutePath()); //This is line 397
    XPath xPath = xPathFactory.newXPath();
    ...
}
catch(IOException e) { ... }

Un seul DocumentBuilderFactory est accessible par plusieurs threads, comme un seul XPathFactory, je pense que c'est acceptable d'utilisation. Je l'occasion de voir l'erreur suivante lors de l'analyse d'un fichier XML à l'aide du code ci-dessus.

java.io.IOException: Bad file descriptor
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:229)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:229)
at java.io.BufferedInputStream.read(BufferedInputStream.java:246)
at org.apache.xerces.impl.XMLEntityManager$RewindableInputStream.read(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at mypackage.MyXmlParser.parseFile(MyXmlParser.java:397)
at mypackage.MyXmlParser.access$500(MyXmlParser.java:51)
at mypackage.MyXmlParser$1.call(MyXmlParser.java:337)
at mypackage.MyXmlParser$1.call(MyXmlParser.java:328)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:284)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:665)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:690)
at java.lang.Thread.run(Thread.java:799)

De temps en temps j' (~10% du temps) voir le texte supplémentaire ci-dessous:

Caused by:
java.io.IOException: Bad file descriptor
at org.apache.xml.serializer.ToStream.flushWriter(ToStream.java:260)
at org.apache.xml.serializer.ToXMLStream.endDocument(ToXMLStream.java:191)
at org.apache.xalan.transformer.TransformerIdentityImpl.endDocument(TransformerIdentityImpl.java:983)
at org.apache.xml.serializer.TreeWalker.traverse(TreeWalker.java:174)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:410)
... 9 more

Quand j'ai inspecter manuellement les fichiers, je ne vois pas de différence entre les fichiers qui échouent et les fichiers qui passent. Je peux confirmer les fichiers qui passent sont XML valide et n'ont pas de caractères spéciaux ou les terminaisons.

Personne ne sait pourquoi ce qui se passe, et comment je peux l'éviter?

> java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pxa64dev-20061002a (SR3) )
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Linux amd64-64 j9vmxa6423-20061001 (JIT enabled)
J9VM - 20060915_08260_LHdSMr
JIT  - 20060908_1811_r8
GC   - 20060906_AA)
JCL  - 20061002
Il semble que votre FileStream est fermé avant que les données lues début. Vous devrez peut-être chercher à savoir pourquoi il est en cours de fermeture.
Merci, si c'est le cas, bien que je ne peux pas trouver une raison quelconque. Je ne suis pas de toucher les fichiers en dehors de l'javax.xml le code que j'ai posté ci-dessus.

OriginalL'auteur Ina | 2012-04-23