2011-02-08 5 views
0

나는 XML 문서를 만들기 위해 간단한 클래스를 만들었다. 그러나 동일한 이름의 문서를 만드는 동안 메서드를 두 번 이상 호출하면 파일이 덮어 쓰지 않습니다. 클래스가 자동으로 같은 이름의 기존 파일을 덮어 쓰게 할 수 있습니까? Java가 스트림 결과로 파일을 덮어 쓴다.

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

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

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

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

은}

+0

어떻게됩니까 -이 : 당신은 같은 시간에 프로그램을 실행하는 여러 스레드를 필요없이 해당하는 경우

은, 아마 당신은이 같은, 같은 파일을 작성하려고 두 개의 스레드를 방지하기 위해 synchronized 블록을 적용 할 수 있습니다 대신에? 어떤 자바 버전? – BalusC

답변

1

나는 다음과 같은 문장으로 코드 실행 :

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

을 그리고 멋지게 직접 확인, 기존 파일 덮어 쓰기에 대한 아무런 문제를 덮어 씁니다.

+0

필자가 덮어 쓰는 것은 프로그램을 여러 번 실행하는 것입니다 ... 일단 프로그램을 실행하면 파일이 생성되고 프로그램을 다시 실행하면 파일을 제외하고 파일을 덮어 쓰려고 시도하는 중 빈 파일이됩니다 ... – Bob

1

솔직히 말해서 ... 문제를 재현 할 수 없습니다. for 루프에서이 프로그램을 여러 번 실행하면 잘 작동합니다. 프로그램을 실행하기 전에 우연히 결과 파일을 열어 잠그지 않았습니까?

... 

synchronized (XMLCreater.class) { 
    StreamResult result = new StreamResult(new File(dir + "\\XML\\" + name + ".xml")); 
    transformer.transform(source, result); 
} 
관련 문제