当前位置: 首页 > 知识库问答 >
问题:

Java Swing将变量分配给URL

景景胜
2023-03-14

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

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

下面是代码--

服务器框架。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);          
    }     

历史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");
        }
    }

我已经把xml文件放在项目目录的src文件夹中。这个问题似乎出现在docBuilder.parse()中,因为每次在函数中生成异常时,它只接受字符串而不是网址,因为文件的系统路径不同于文件的javapath。

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

共有2个答案

谭桐
2023-03-14

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

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

高峻
2023-03-14

问题就出在这里:

StreamResult result = new StreamResult(new File(filePath));

您似乎已经知道,URL不是文件路径,您不能将其视为文件路径。您根本无法执行new File(filePath)并期望它永远工作。存储在filePath中的字符串根本不是文件路径,而是一个URL。

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

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

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

File resultFile = File.createTempFile("history", ".xml");
StreamResult result = new StreamResult(resultFile);

附带说明:始终公开捕获异常的堆栈跟踪,或者使用日志语句、异常链接,或者至少调用printStackTrace()。此外,不要捕获java.lang.异常;您不应该抑制程序员错误,如NullPointerExc0019、IndexOutOfBoundsExc0019、IllegalArgumentExc0019等。相反,只捕获需要捕获的异常:

} catch (ParserConfigurationException | SAXException | IOException | TransformerException ex) {
 类似资料:
  • 问题内容: 假设我有一个功能 现在,我想将函数分配给一个名为的变量,这样,如果我使用,它将再次调用该函数。如果我只是做作业,它就会返回。 问题答案: 您根本不调用该函数。 括号告诉蟒蛇,你调用的函数,所以当你把它们放在那里,它调用的功能,并指定值 返回 的(在这种情况下)。

  • 目前,我遇到了一个与将Golang变量分配给Javascript变量相关的问题。我正在使用Golang模板,因此,我从后端发送了一个JSON变量,就像这样: 如您所见,我有一个切片,将其转换为Json,然后将Json转换为string,并将其发送到模板。然后,在前端我需要把它赋给一个变量,它应该是有效的JSON,我有这个: 但是,我得到的是语法错误:预期的属性名,得到的是“{” 所以,我的问题是:

  • 我是helm的新手,我希望能够使用配置映射和共享环境变量将gitlab项目变量写入文件。 我为每个环境(其中

  • 问题内容: 我正在使用以下代码: 该值不警报。怎么了 问题答案: 实质上:

  • 问题内容: 在上面,这是硬代码。我想将 变量 分配 给值。即,均值=注册; 让我知道! 问题答案: 您的问题不是很清楚。我假设变量是在Servlet中声明的,因为在JSP中使用Java是一种不好的做法。为了能够在转发到JSP的Servlet之间共享变量,您需要将此变量设置为request属性: 然后在JSP中,您可以使用JSP EL获得“ registration”属性的值: 您应该阅读Java

  • 问题内容: 我一直在使用IIFE中和,并一直在使用的结构如下: 方法1: 但是,我经常看到以下情况,其中将变量分配给 方法2: 注意: 此问题 不是 关于此模式是什么或IIFE是什么。这与为什么要 在IIFE上 使用返回变量及其与Angular实践的关系有关。 在Angular方法1中工作正常,但是在我看到的许多原始JS示例中,都使用了方法2。我的假设是,封装在其中的任何内容都可以通过它进行调用。