にメインクラスがあるとしましょうC:\Users\Justian\Documents\
。プログラムが にあることを示すにはどうすればよいC:\Users\Justian\Documents
ですか?
ハードコーディングはオプションではありません。別の場所に移動した場合に適応できる必要があります。
フォルダーに大量の CSV ファイルをダンプし、プログラムにすべてのファイルを認識させ、データを読み込んで操作したいと考えています。そのフォルダに移動する方法を知りたいだけです。
にメインクラスがあるとしましょうC:\Users\Justian\Documents\
。プログラムが にあることを示すにはどうすればよいC:\Users\Justian\Documents
ですか?
ハードコーディングはオプションではありません。別の場所に移動した場合に適応できる必要があります。
フォルダーに大量の CSV ファイルをダンプし、プログラムにすべてのファイルを認識させ、データを読み込んで操作したいと考えています。そのフォルダに移動する方法を知りたいだけです。
1 つの方法は、システム プロパティ System.getProperty("user.dir");
を使用することです。これにより、「プロパティが初期化されたときの現在の作業ディレクトリ」が得られます。これはおそらくあなたが望むものです。java
実際の .jar ファイルがマシン上の別の場所にある場合でも、コマンドが発行された場所を確認します。この場合、処理するファイルがあるディレクトリにあります。ほとんどの場合、実際の .jar ファイルのディレクトリを持つことはあまり役に立ちません。
以下は、.class ファイルまたは .jar ファイルのどこに .class ファイルがあるかに関係なく、コマンドが呼び出された場所から現在のディレクトリを出力します。
public class Test
{
public static void main(final String[] args)
{
final String dir = System.getProperty("user.dir");
System.out.println("current dir = " + dir);
}
}
あなたがいて/User/me/
、上記のコードを含む.jarファイルが/opt/some/nested/dir/
コマンドjava -jar /opt/some/nested/dir/test.jar Test
にある場合は、 current dir = /User/me
.
また、おまけとして、優れたオブジェクト指向のコマンド ライン引数パーサーの使用についても検討する必要があります。Java Simple Argument Parser であるJSAPを強くお勧めします。これによりSystem.getProperty("user.dir")
、動作をオーバーライドするために別のものを使用したり、代わりに渡すことができます。はるかに保守可能なソリューション。これにより、プロセスへのディレクトリの受け渡しが非常に簡単になり、user.dir
何も渡されなかった場合にフォールバックできるようになります。
を使用しCodeSource#getLocation()
ます。これは、JAR ファイルでも問題なく機能します。で取得CodeSource
できProtectionDomain#getCodeSource()
、 はProtectionDomain
で取得できますClass#getProtectionDomain()
。
public class Test {
public static void main(String... args) throws Exception {
URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
System.out.println(location.getFile());
}
}
OPのコメントに従って更新します。
フォルダーに大量の CSV ファイルをダンプし、プログラムにすべてのファイルを認識させ、データを読み込んで操作したいと考えています。そのフォルダに移動する方法を知りたいだけです。
それには、プログラムでの相対パスをハードコーディング/知る必要があります。代わりに、そのパスをクラスパスに追加して、使用できるようにすることを検討してくださいClassLoader#getResource()
File classpathRoot = new File(classLoader.getResource("").getPath());
File[] csvFiles = classpathRoot.listFiles(new FilenameFilter() {
@Override public boolean accept(File dir, String name) {
return name.endsWith(".csv");
}
});
または、そのパスをmain()
引数として渡します。
File currentDirectory = new File(new File(".").getAbsolutePath());
System.out.println(currentDirectory.getCanonicalPath());
System.out.println(currentDirectory.getAbsolutePath());
次のようなものを出力します。
/path/to/current/directory
/path/to/current/directory/.
File.getCanonicalPath()
チェックされた IOException をスローすることに注意してください。../../../
メイン クラスがローカル ハードディスク上のファイルにあると誰が言いましたか? 多くの場合、クラスは JAR ファイル内にバンドルされ、ネットワーク経由でロードされたり、オンザフライで生成されることもあります。
では、あなたが本当にやりたいことは何ですか?クラスがどこから来たのかを仮定しない方法がおそらくあるでしょう。