Java перезапись файлов с потоковым результатом

I created a simple class to create an XML document. However, if I call the method more than once while creating a document of the same name the file does not overwrite. How could I make the class automatically overwrite existing files of the same name?

import java.io.File;

import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; импорт javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document; import org.w3c.dom.Element;

открытый класс XMLCreater {public static void CreateXMLDoc (имя строки, корень строки, элементы String [], дочерние элементы String []) выбрасывает исключение TransformerConfigurationException {попробуйте {DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance (); DocumentBuilder docBuilder = docFactory.newDocumentBuilder (); Документ doc = docBuilder.newDocument (); Элемент rootElement = doc.createElement (root); doc.appendChild (rootElement);

for (int i = 0; i < elements.length; i ++) { Element element = doc.createElement(elements[i]); element.appendChild(doc.createTextNode(children[i])); rootElement.appendChild(element); } TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); File dir = new File(System.getProperty("user.dir")); StreamResult result = new StreamResult(new File(dir + "\\XML\\" + name + ".xml")); transformer.transform(source, result); } catch(ParserConfigurationException pce){ pce.printStackTrace(); } catch(TransformerException tfe) { tfe.printStackTrace(); } }

}


person Bob    schedule 08.02.2011    source источник
comment
Что происходит вместо этого? Какая версия Java?   -  person BalusC    schedule 08.02.2011


Ответы (2)


Я выполнил ваш код со следующими операторами:

public static void main (String[] args) 
{
    XMLCreater x = new XMLCreater();
    String[] s = {"A","B","C"};
    try 
    {
        x.CreateXMLDoc("k","root",s,s);
        x.CreateXMLDoc("k","root",s,s);
        x.CreateXMLDoc("fakih","root",s,s);
    }
    catch (TransformerConfigurationException exception) 
    { exception.printStackTrace(); }
}

И он красиво перезаписывает существующие файлы, никаких проблем с перезаписью, проверьте сами.

person Juvanis    schedule 08.02.2011
comment
То, что я имею в виду под перезаписью, запускает программу несколько раз ... Если вы запустите программу после того, как она создаст файл, то, если вы снова запустите программу, она попытается перезаписать файл, за исключением того, что файл станет пустым ... - person Bob; 08.02.2011

Скажу честно ... Я не могу воспроизвести вашу проблему. У меня отлично работает, когда я запускаю эту программу несколько раз в цикле for. Вы уверены, что случайно не открыли файл результатов и не заблокировали его перед запуском программы?

Если вас беспокоит одновременное выполнение вашей программы несколькими потоками, возможно, вы можете применить блок synchronized, чтобы два потока не пытались записать один и тот же файл, например: -

...

synchronized (XMLCreater.class) {
    StreamResult result = new StreamResult(new File(dir + "\\XML\\" + name + ".xml"));
    transformer.transform(source, result);
}
person limc    schedule 09.02.2011