web-dev-qa-db-ja.com

ファイルをクラスパスに保存するにはどうすればよいですか

クラスがある場所にあるファイルを保存/ロードするにはどうすればよいですか?以前はその場所への物理パスがなく、動的にそのファイルを見つけたいと思っています。

ありがとう

編集:

XMLファイルをロードして読み書きしたいのですが、どう対処すればよいかわかりません。

14
Doron Sinai

一般的なケースではできません。クラスローダーから読み込まれるリソースは、ディレクトリ内のファイル、jarファイルに埋め込まれたファイル、ネットワーク経由でダウンロードされたファイルなど、何でもかまいません。

6
gabuzo

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ファイルにある場合、これは機能しません。ファイルが展開され、書き込み可能であることを確認できる場合は、URLgetResource()からFileに変換します。

_URL url = classLoader.getResource("com/example/file.ext");
File file = new File(url.toURI().getPath());
// ...
_

次に、それを使って FileOutputStream を作成できます。

関連する質問:

37
BalusC

クラスがファイルシステムからロードされている場合は、以下を試すことができます。

String basePathOfClass = getClass()
   .getProtectionDomain().getCodeSource().getLocation().getFile();

そのパスでファイルを取得するには、使用できます

File file = new File(basePathOfClass, "filename.ext");
12
Peter Lawrey

new File(".").getAbsolutePath() + "relative/path/to/your/files";

8
user489041

これはピーターの応答の拡張です:

現在のクラスと同じクラスパスにファイルが必要な場合(例: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);
}
_
4
ScrappyDev

システムプロパティドキュメント によると、「Java.class.path」プロパティとしてこれにアクセスできます。

string classPath = System.getProperty("Java.class.path");
1
Wim Coenen