C:\Users\Justian\Documents\
にメインクラスがあるとします。 C:\Users\Justian\Documents
にあることをプログラムに示すにはどうすればよいですか?
ハードコーディングはオプションではありません。別の場所に移動する場合は適応できる必要があります。
CSVファイルをフォルダーにダンプし、プログラムにすべてのファイルを認識させ、データをロードして操作したい。そのフォルダーに移動する方法を知りたいだけだ。
1つの方法は、 システムプロパティSystem.getProperty("user.dir");
を使用することです。これにより、「プロパティが初期化されたときの現在の作業ディレクトリ」が得られます。これはおそらくあなたが望むものです。実際の.jarファイルがマシン上のどこかに存在する場合でも、Java
コマンドが発行された場所を確認します。実際の.jarファイルのディレクトリを持っていることは、ほとんどの場合それほど有用ではありません。
以下は、.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
を出力します。
また、ボーナスとして、優れたオブジェクト指向のコマンドライン引数パーサーを使用する必要があります。 JSAP 、Java Simple Argument Parserを強くお勧めします。これにより、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をスローしますが、../../../
のようなものを削除することに注意してください
this.getClass().getClassLoader().getResource("").getPath()
私はちょうど使用しました:
import Java.nio.file.Path;
import Java.nio.file.Paths;
...
Path workingDirectory=Paths.get(".").toAbsolutePath();
現在のソースコードの絶対パスが必要な場合、私の提案は次のとおりです。
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));
現在の作業ディレクトリを取得する場合は、次の行を使用します
System.out.println(new File("").getAbsolutePath());
メインクラスがローカルハードディスク上のファイルにあると言うのは誰ですか?クラスは、多くの場合、JARファイル内にバンドルされ、ネットワーク経由でロードされたり、オンザフライで生成されることもあります。
それで、あなたが実際にやりたいことは何ですか?おそらく、クラスがどこから来たのかを推測しない方法があります。