1

我之前曾问过一个关于如何在 stackoverflow 上从 xml 导入文件的问题(阅读此处)。提供给我的解决方案是使用

documentbuilder.parse( xmlhandler.class.getResourceAsStream("shutdownscheduler.xml")); 

"C:\Users\Rohan Kandwal\Documents\NetBeansProjects\Shutdown Scheduler\build\classes\shutdown\scheduler\shutdownscheduler.xml"此解决方案正在选择适合只读目的的 xml 文件 。

但我需要 documentbuilder 从位置访问文件, "C:\Users\Rohan Kandwal\Documents\NetBeansProjects\Shutdown Scheduler\src\shutdown\scheduler以便我可以永久保存对 xml 所做的更新。有没有办法从src文件夹而不是build文件夹访问文件?

4

1 回答 1

1

通常,当您的应用程序应该写入文件时,它必须在具有写入权限的地方执行此操作。您可以确定(在大多数情况下)您的应用程序将被允许具有此类访问权限的唯一地方是用户主目录。您可能已经注意到,其他基于 java 的应用程序通常会".some-application"在您的主文件夹中创建一个名为的目录(在您的情况下"C:\Users\Rohan Kandwal")。他们这样做的原因(其中之一)是写访问。

您应该做同样的事情并且忘记使用Class.getResourceAsStream(...)可写文件。您可以通过System.getProperty("user.home").

请注意,您的示例中使用的原因Class.getResourceAsStream(...)是从您的build目录中获取文件是因为您在 IDE 中运行它。如果您在 IDE 之外运行它,则此路径将更改。这是因为类文件 ( xmlhandler.class) 的路径很可能会改变并Class.getResourceAsStream(...)依赖它来查找资源。

另请注意,src部署应用程序时,您的目录很可能甚至不存在。即使这样做了,也无法知道您的用户是否会将其部署在具有写入权限的位置。因此,您尝试做的事情没有多大意义。

编辑01

这是一个如何做你想做的事的例子。这将为您的应用程序创建一个主目录,您可以在其中以任何您希望的方式编写文件。如果您要在应用程序运行之间保留的文件不存在,它将被创建并填充您的资源文件的内容。请注意,这只是一个示例。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ConfigDir {

    private static final String APP_DIR = ".myappdir";
    private static final String FILE_NAME = "shutdownscheduler.xml";

    private File fillFileFromTemplate(InputStream template, File file) throws FileNotFoundException, IOException {
            OutputStream out = null;
            try {
                out = new FileOutputStream(file);
                int read = 0;
                byte[] bytes = new byte[1024];
                while ((read = template.read(bytes)) != -1) {
                    out.write(bytes, 0, read);
                }
                out.flush();
                return file;
            } catch (FileNotFoundException ex) {
                throw ex;
            } finally {
                if (out != null) {
                    out.close();
                }
            }
        }

    public static void main(String[] argv) throws IOException {        
        String userdir = System.getProperty("user.home"); // user home directory
        // OR if you know that your program will run from a directory that has write access
        // String userdir = System.getProperty("user.dir"); // working directory
        if (!userdir.endsWith(System.getProperty("file.separator"))) {
            userdir += System.getProperty("file.separator");
        }
        String myAppDir = userdir + APP_DIR;
        File myAppDirFile = new File(myAppDir);
        myAppDirFile.mkdirs(); // create all dirs if they do not exist
        String myXML = myAppDir + System.getProperty("file.separator") + FILE_NAME;
        File myXMLFile = new File(myXML); // this is just a descriptor        
        ConfigDir cd = new ConfigDir();        
        if (!myXMLFile.exists()) {
            // if the file does not exist, create one based on your template
            // replace "ConfigDir" with a class that has your xml next to it in src dir
            InputStream template = ConfigDir.class.getResourceAsStream(FILE_NAME);  
            cd.fillFileFromTemplate(template, myXMLFile);
        }

        // use myXMLFile java.io.File instance for read/write from now on
        /*
        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
        Document document=(Document)documentbuilder.parse(myXMLFile);
        document.getDocumentElement(); 
        ...
        */        
    }    
}
于 2013-01-17T13:26:25.993 回答