从包的src文件夹获取xml文件

时间:2013-01-17 10:35:52

标签: xml swing

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

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

此解决方案是从中选择xml文件  "C:\Users\Rohan Kandwal\Documents\NetBeansProjects\Shutdown Scheduler\build\classes\shutdown\scheduler\shutdownscheduler.xml"这对于只读目的是好的。

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

1 个答案:

答案 0 :(得分:1)

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

您应该这样做并忘记将Class.getResourceAsStream(...)用于可写文件。您可以通过System.getProperty("user.home")获取主目录的路径。

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

另请注意,部署应用程序时,您的src目录很可能甚至不存在。即使它确实如此,也无法知道您的用户是否将其部署在具有写访问权限的位置。所以你要做的事情没有多大意义。

<强> Edit01

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

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