我之前曾问过一个关于如何在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
文件夹访问文件?
答案 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();
...
*/
}
}