Java Swing将变量分配给URL

Java Swing将变量分配给URL,java,xml,swing,netbeans,jar,Java,Xml,Swing,Netbeans,Jar,您好,我正在开发一个swing聊天应用程序,其中聊天历史记录存储在一个xml文件中。 在NetBeans项目中完成后,我能够获取xml文件并将其显示在表中 但是当转换成jar文件时,我无法使用xml文件。 我尝试过各种方法,例如getClass().getResource()方法,但它检索URL而不是字符串,如果使用toString()方法将其转换为字符串,则无法将其用作解析xml文件的有效路径 下面是代码--> ServerFrame.java public class Server

您好,我正在开发一个swing聊天应用程序,其中聊天历史记录存储在一个xml文件中。 在NetBeans项目中完成后,我能够获取xml文件并将其显示在表中

但是当转换成jar文件时,我无法使用xml文件。 我尝试过各种方法,例如getClass().getResource()方法,但它检索URL而不是字符串,如果使用toString()方法将其转换为字符串,则无法将其用作解析xml文件的有效路径

下面是代码-->

ServerFrame.java

     public class ServerFrame extends javax.swing.JFrame {

        public String historyFile;
        public HistoryFrame historyFrame;
        public History hist;  }

        public ServerFrame() {
           historyFile=this.getClass().getResource("History.xml").toString();}


 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

            hist = new History(historyFile);               
            historyFrame = new HistoryFrame(hist);
            historyFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            historyFrame.setLocation(this.getLocation());
            historyFrame.setVisible(true);          
    }     
History.java

public class History {

    public String filePath;

    public History(String filePath){

        this.filePath = filePath;
    }

    public void addMessage(Message msg, String time){

        try {
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.parse(filePath);

            Node data = doc.getFirstChild();

            Element message = doc.createElement("message");
            Element _sender = doc.createElement("sender"); _sender.setTextContent(msg.sender);
            Element _content = doc.createElement("content"); _content.setTextContent(msg.content);
            Element _recipient = doc.createElement("recipient"); _recipient.setTextContent(msg.recipient);
            Element _time = doc.createElement("time"); _time.setTextContent(time);

            message.appendChild(_sender); message.appendChild(_content); message.appendChild(_recipient); message.appendChild(_time);
            data.appendChild(message);

            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File(filePath));
            transformer.transform(source, result);

       } 
           catch(Exception ex){
        System.out.println("Exceptionmodify xml");
       }
    }

    public void FillTable(HistoryFrame frame){

        DefaultTableModel model = (DefaultTableModel) frame.jTable1.getModel();

        try{
            File fXmlFile = new File(filePath);
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();

            NodeList nList = doc.getElementsByTagName("message");

            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;
                    model.addRow(new Object[]{getTagValue("sender", eElement), getTagValue("content", eElement), getTagValue("recipient", eElement), getTagValue("time", eElement)});
                }
            }
        }
        catch(Exception ex){
            System.out.println("Filling Exception");
        }
    }
公共类历史记录{
公共字符串文件路径;
公共历史记录(字符串文件路径){
this.filePath=filePath;
}
public void addMessage(消息消息,字符串时间){
试一试{
DocumentBuilderFactory docFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder=docFactory.newDocumentBuilder();
Document doc=docBuilder.parse(文件路径);
节点数据=doc.getFirstChild();
元素消息=doc.createElement(“消息”);
元素_sender=doc.createElement(“sender”);_sender.setTextContent(msg.sender);
元素_content=doc.createElement(“内容”);_content.setTextContent(msg.content);
元素_recipient=doc.createElement(“收件人”);_recipient.setTextContent(msg.recipient);
元素_time=doc.createElement(“时间”);_time.setTextContent(时间);
message.appendChild(_发件人);message.appendChild(_内容);message.appendChild(_收件人);message.appendChild(_时间);
data.appendChild(消息);
TransformerFactory TransformerFactory=TransformerFactory.newInstance();
Transformer Transformer=transformerFactory.newTransformer();
DOMSource=新的DOMSource(doc);
StreamResult=newstreamresult(新文件(filePath));
变换(源、结果);
} 
捕获(例外情况除外){
System.out.println(“例外修改xml”);
}
}
公共空白填充表(HistoryFrame){
DefaultTableModel=(DefaultTableModel)frame.jTable1.getModel();
试一试{
File fXmlFile=新文件(filePath);
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
documentdoc=dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList=doc.getElementsByTagName(“消息”);
对于(int-temp=0;temp
我已将xml文件放在项目目录的src文件夹中。问题似乎出在docBuilder.parse()中,因为每次函数中都会生成异常,它只接受字符串而不接受URL,因为文件的系统路径与文件的javapath不同


我只需要在执行期间访问jar中的xml文件。所谓访问,我指的是jar文件中xml文件的正确文件路径,不需要文件内容。

从IDE运行时,您实际上不会创建jar文件,因此您可以从目录结构中获取资源。打包应用程序时,您将创建jar文件时,资源突然与zip文件相对。从这样的资源中读取是可能的,但不应执行写入操作,因为这会更改您的包


您可能需要在jar位置之外配置一个特定位置,用于检索和写入xml文件。

从IDE运行时,您实际上不会创建jar文件,因此可以从目录结构中获取资源。打包应用程序时,您将创建jar文件,而资源会突然丢失相对于zip文件。从这样的资源中读取是可能的,但不应进行写入,因为这样会更改您的包

您可能需要在jar位置之外配置一个特定的位置,用于检索和写入xml文件。

问题在于:

StreamResult result = new StreamResult(new File(filePath));
正如您已经知道的,URL不是文件路径,您不能将其视为文件路径。您根本无法执行
新建文件(filePath)
,并期望它能够正常工作。存储在
filePath
中的字符串根本不是文件路径,而是URL

但您有一个更基本的问题:资源是只读的。您不能对它进行写入,句号。所有Java应用程序都部署在.jar或.war文件中,即使您可以访问原始存档(并且不能保证您可以),您也可能没有写入它的权限(特别是在Windows中,它可能会被锁定),即使您可以编写它,应用程序也不会看到更改

简而言之,您不应该尝试写入资源

相反,请将资源视为一组默认值,并选择一个可靠的位置(例如临时文件或用户主目录中的文件)来写入新数据:

File resultFile = File.createTempFile("history", ".xml");
StreamResult result = new StreamResult(resultFile);
附带说明:始终使用日志语句、异常链接或至少调用printStackTrace()公开捕获的异常的堆栈跟踪。此外,不要捕获java.lang.Exception;您不应该抑制诸如NullPointerException、IndexOutOfBoundsException、IllegalArgumentException等程序员错误
} catch (ParserConfigurationException | SAXException | IOException | TransformerException ex) {