クラスがある場所にあるファイルを保存/ロードするにはどうすればよいですか?以前はその場所への物理パスがなく、動的にそのファイルを見つけたいと思っています。
ありがとう
編集:
XMLファイルをロードして読み書きしたいのですが、どう対処すればよいかわかりません。
一般的なケースではできません。クラスローダーから読み込まれるリソースは、ディレクトリ内のファイル、jarファイルに埋め込まれたファイル、ネットワーク経由でダウンロードされたファイルなど、何でもかまいません。
ClassLoader#getResource()
または getResourceAsStream()
を使用して、クラスパスからURL
またはInputStream
として取得します。
_ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/file.ext");
// ...
_
または、現在のクラスと同じパッケージにある場合は、次のようにして取得することもできます。
_InputStream input = getClass().getResourceAsStream("file.ext");
// ...
_
保存は別の話です。ファイルがJARファイルにある場合、これは機能しません。ファイルが展開され、書き込み可能であることを確認できる場合は、URL
をgetResource()
からFile
に変換します。
_URL url = classLoader.getResource("com/example/file.ext");
File file = new File(url.toURI().getPath());
// ...
_
次に、それを使って FileOutputStream
を作成できます。
クラスがファイルシステムからロードされている場合は、以下を試すことができます。
String basePathOfClass = getClass()
.getProtectionDomain().getCodeSource().getLocation().getFile();
そのパスでファイルを取得するには、使用できます
File file = new File(basePathOfClass, "filename.ext");
new File(".").getAbsolutePath() + "relative/path/to/your/files";
これはピーターの応答の拡張です:
現在のクラスと同じクラスパスにファイルが必要な場合(例:project/classes):
_URI uri = this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI();
File file = new File(new File(uri), PROPERTIES_FILE);
FileOutputStream out = new FileOutputStream(createPropertiesFile(PROPERTIES_FILE));
prop.store(out, null);
_
別のクラスパスにファイルが必要な場合(例:progect/test-classes)、this.getClass()
を_TestClass.class
_のようなものに置き換えます。
_Properties prop = new Properties();
System.out.println("Resource: " + getClass().getClassLoader().getResource(PROPERTIES_FILE));
InputStream in = getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILE);
if (in != null) {
try {
prop.load(in);
} finally {
in.close();
}
}
_
_Properties prop = new Properties();
prop.setProperty("Prop1", "a");
prop.setProperty("Prop2", "3");
prop.setProperty("Prop3", String.valueOf(false));
FileOutputStream out = null;
try {
System.out.println("Resource: " + createPropertiesFile(PROPERTIES_FILE));
out = new FileOutputStream(createPropertiesFile(PROPERTIES_FILE));
prop.store(out, null);
} finally {
if (out != null) out.close();
}
_
_private File createPropertiesFile(String relativeFilePath) throws URISyntaxException {
return new File(new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()), relativeFilePath);
}
_
システムプロパティドキュメント によると、「Java.class.path」プロパティとしてこれにアクセスできます。
string classPath = System.getProperty("Java.class.path");