Java перезаписывает файлы с результатом потока - PullRequest
1 голос
/ 08 февраля 2011

Я создал простой класс для создания XML-документа.Однако, если я вызываю метод более одного раза при создании документа с тем же именем, файл не перезаписывается.Как я могу заставить класс автоматически перезаписывать существующие файлы с таким же именем?

import java.io.File;</p>

<p>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;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;</p>

<p>import org.w3c.dom.Document;
import org.w3c.dom.Element;</p>

<p>public class XMLCreater {
    public static void CreateXMLDoc(String name, String root, String[] elements, String[] children) throws TransformerConfigurationException {
        try {
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.newDocument();
            Element rootElement = doc.createElement(root);
            doc.appendChild(rootElement);</p>

<code>        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();
    }
}
</code>

}

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

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

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

...

synchronized (XMLCreater.class) {
    StreamResult result = new StreamResult(new File(dir + "\\XML\\" + name + ".xml"));
    transformer.transform(source, result);
}
1 голос
/ 08 февраля 2011

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

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(); }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...