通常,当您的应用程序应该写入文件时,它必须在具有写入权限的地方执行此操作。您可以确定(在大多数情况下)您的应用程序将被允许具有此类访问权限的唯一地方是用户主目录。您可能已经注意到,其他基于 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();
...
*/
}
}