メインクラスがにあるとし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ファイルがどこにあるか、.classまたは.jarファイルに関係なく、コマンドが呼び出された場所から現在のディレクトリを出力します。
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()
引数として渡します。
getLocation()
メソッドから返されたものをそのまま使用してください。他のものは明らかに機能しないでしょう。
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 をスローする ことに注意してください。../../../
this.getClass().getClassLoader().getResource("").getPath()
私はちょうど使用しました:
import java.nio.file.Path;
import java.nio.file.Paths;
...
Path workingDirectory=Paths.get(".").toAbsolutePath();
Paths.get("").toAbsolutePath();
Paths.get("my/file").toAbsolutePath()
得るなら/my/file
、それは間違いなくcwdではありません。
現在のソースコードの絶対パスが必要な場合、私の提案は次のとおりです。
String internalPath = this.getClass().getName().replace(".", File.separator);
String externalPath = System.getProperty("user.dir")+File.separator+"src";
String workDir = externalPath+File.separator+internalPath.substring(0, internalPath.lastIndexOf(File.separator));
メインクラスはローカルハードディスクのファイルにあると誰が言っていますか?クラスはJARファイル内にバンドルされることが多く、ネットワーク経由でロードされることもあれば、オンザフライで生成されることもあります。
では、実際にやりたいことは何ですか?おそらく、クラスがどこから来たのかを想定しない方法があります。