2012-01-03 15 views
1

以下のコードでは、xmls.get(i)が拡張子.xmlのファイルの絶対パスであるArrayList xmlsからxmlファイルを選択しようとしています。このファイルをDocumentで解析できない場合、例外がスローされ、ファイルは別のディレクトリに移動されます。ただし、destFileディレクトリにコピーすることはできますが、ファイルを移動または削除することはできません。 f.exists()f.canRead()f.canWrite()、f.canExecuteための真の最後のif文の戻り値が、あなたはjava.io以来、ファイルオブジェクトのclose()を呼び出す示唆答えわからないf.renameTo(destFile);ファイルの削除/移動に失敗する

for(int i=0; i<xmls.size(); i++){ 
    boolean delete = false; 

    try { 
     File f = new File(xmls.get(i)); 
     File destFile = new File(structDir + "/badXMLs/" + f.getName()); 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(f); 
     doc.getDoctype(); 

    } catch (Exception e) { 
     File f = new File(xmls.get(i)); 
     File destFile = new File(structDir + "/badXMLs/" + f.getName()); 

     System.out.println(f.getName()); 
     delete = true; 
    } 

    if(delete){ 
     File f = new File(xmls.get(i)); 
     File destFile = new File(structDir + "/badXMLs/" + f.getName()); 

     System.out.println(f.exists()); 
     System.out.println(f.canRead()); 
     System.out.println(f.canWrite()); 
     System.out.println(f.canExecute()); 

     System.out.println(f.renameTo(destFile)); 
    } 
} 
+0

目的地のディレクトリが別のマウントポイントにあるという理由の1つは、その場合ですか? – fge

+0

'} catch(Exception e){' - このコードは*すべての例外をキャッチします;あなたが興味を持っている特定の例外を捕らえるべきです( 'ファイルはドキュメントによって解析できません')。それ以外の場合は、ファイルに 'NullPointerException'やその他のバグがある場合、ファイルを削除しようとします – artbristol

答えて

3

デフォルトのDocumentBuilderは、例外が発生したときにファイルを閉じません。少なくとも窓の下に、あなたはそれを削除するか、名前を変更することはできませんので、それは、それを閉じていない

FileInputStream fis = null; 

try { 
    File f = new File(xmls.get(i)); 
    File destFile = new File(structDir + "/badXMLs/" + f.getName()); 
    fis = new FileInputStream(f); 

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document doc = db.parse(fis); // parse the FileInputStream, not the File 
    doc.getDoctype(); 

} catch (Exception e) { 
    if (fis != null) { 
     fis.close(); 
    } 

    File f = new File(xmls.get(i)); 
    File destFile = new File(structDir + "/badXMLs/" + f.getName()); 

    System.out.println(f.getName()); 
    delete = true; 
} 

:この問題を回避する最も簡単な方法は次のように、FileInputStreamをを使用して、それを自分で閉じることです。そのたびにDocumentBuilderを作成する必要はありません。

1

にfalseを返します。 .Fileにはそのようなメソッドはありませんが、私は彼らが正しい方向に向かっていると思います。

私は、FileInputStreamを使用して閉じることに切り替えることをお勧めします。

parseメソッドは、FileオブジェクトかFileInputStreamのどちらかを取ることができるので、okにする必要があります。

関連する問題