2016-10-05 3 views
2

В моем приложении я проверяю значение в файле xml, скажем some.xml и перемещая файл в другой каталог в зависимости от результата этого чтения.JDOM `SaxBuilder` не выпускает неверный файл

Когда some.xml неисправен, SaxBuilder выбрасывает JDOMException, но не выпускает файл. Когда я пытаюсь переместить some.xml после этого, я получаю сообщение об ошибке, которое some.xml используется другим процессом.

мой код это (не относящиеся к делу детали удаляется):

private static String getName(Path fullPath) { 
    File f = fullPath.toFile(); 
    SAXBuilder saxBuilder = new SAXBuilder(); 
    Document doc = null; 
    String result = ""; 
    try { 
     doc = saxBuilder.build(f); 
     result = doc.getRootElement().getChild("imageControl").getText(); 
    } catch (JDOMException | IOException e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 

так - после запуска этого, на malinformed XML передается в, что malinformed файл XML остается открытым по SaxBulider-- не может двигаться это в моем последующем методе.

Как это исправить?

Единственное, о чем я могу сейчас думать, это сделать временную копию xml и сделать вышеприведенное чтение на копии taht. но это далеко не самое лучшее.

Я использую JDOM 2.0.6 на Java 1.7

ТИА.

// -----------------------------

EDIT:

следующие исправления в соответствующие линии не сделать его:

try (InputStream is = new FileInputStream(f)){ 
     doc = saxBuilder.build(f); 

проблема определенно в этом методе. это все работает ожидаемым образом, когда я прокомментирую его вызов.

// -------------------------------------------- ---

РЕДАКТИРОВАТЬ-2

Нету - опечатка.

try (InputStream is = new FileInputStream(f)){ 
     doc = saxBuilder.build(is); 

работает.

+1

Попытайтесь использовать 'build (InputStream)' или 'build (Reader)' методы вместо этого и закройте stream/reader в блоке finally в явном виде. – Sergi

+0

@Sergi С чуть более подробной информацией, которая должна быть ответом, а не комментарием. Кроме того, я подозреваю, что JDOM 'SaxBuilder (File)' забывает закрыть ввод. –

+0

@ Sergi напишите это как ans, и я соглашусь. еще не пробовал, но шд работал. – user6762070

ответ

0

Похоже, что SaxBuilder не закрывает ресурсы, поэтому попробуйте использовать методы build(InputStream) или build(Reader) и закройте поток/reader в блоке finally явно.
Я согласен с @Jim Garrison, что JDOM, вероятно, забывает закрыть ввод в случае исключения.

+0

не работал - см. Мое редактирование – user6762070

+0

@ user6762070 Что касается вашего отредактированного ответа: ваш код по-прежнему использует файл, а не поток из-за опечатки. Это будет 'saxBuilder.build (is)', в то время как у вас есть 'saxBuilder.build (f)' – Sergi

+0

ах - все хорошо сейчас. спасибо – user6762070

Смежные вопросы