通常、アプリケーションがファイルを書き込む場合、書き込みアクセス権のある場所で行う必要があります。アプリがそのようなアクセスを許可されることを (ほとんどの場合) 確実にできる唯一の場所は、ユーザーのホーム ディレクトリです。".some-application"
他の Java ベースのアプリケーションは、通常、ホーム フォルダー (あなたの場合は) にという名前のディレクトリを作成することに気付いたかもしれません"C:\Users\Rohan Kandwal"
。その理由 (その 1 つ) は、書き込みアクセスです。
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();
...
*/
}
}