現在の作業ディレクトリにアクセスしたい
String current = new Java.io.File( "." ).getCanonicalPath();
System.out.println("Current dir:"+current);
String currentDir = System.getProperty("user.dir");
System.out.println("Current dir using System:" +currentDir);
出力:
Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32
Cドライブは私の現在のディレクトリではないので、私の出力は正しくありません。この点で助けが必要です。
public class JavaApplication1 {
public static void main(String[] args) {
System.out.println("Working Directory = " +
System.getProperty("user.dir"));
}
}
これはあなたのアプリケーションが初期化された場所から 完全な絶対パスを表示します。
参照してください: http://docs.Oracle.com/javase/tutorial/essential/io/pathOps.html
Java.nio.file.Path
とJava.nio.file.Paths
を使って、次のようにして、Javaが現在のパスであると考えていることを示すことができます。これは7以降で、NIOを使用しています。
Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);
これはCurrent relative path is: /Users/george/NetBeansProjects/Tutorials
を出力します。私の場合は、そこからクラスを実行したところです。絶対パスを作成していることを示すために先行の区切り文字を使用しないで相対パスを作成する場合は、この相対パスを開始点として使用します。
以下はJava 7以降で動作します(ドキュメントは here を参照)。
import Java.nio.file.Paths;
Paths.get(".").toAbsolutePath().normalize().toString();
これであなたの現在の作業ディレクトリのパスがわかります。
Path path = FileSystems.getDefault().getPath(".");
これにより、作業ディレクトリ内の "Foo.txt"というファイルへのパスがわかります。
Path path = FileSystems.getDefault().getPath("Foo.txt");
編集: 現在のディレクトリの絶対パスを取得するには、次の手順を実行します。
Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();
これは私のための解決策です
File currentDir = new File("");
c:\ windows\system32 が現在のディレクトリではないと思われる理由は何ですか? user.dir
プロパティは明示的に "ユーザーの現在の作業ディレクトリ"になります。
言い換えれば、コマンドラインからJavaを起動しない限り、 c:\ windows\system32 がおそらくあなたのCWDです。つまり、ダブルクリックしてプログラムを起動した場合、CWDがダブルクリックしたディレクトリになることはほとんどありません。
編集 :これは古いウィンドウやJavaバージョンにのみ当てはまるようです。
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());
}
}
私はコメントでこの解決策を見つけました。
String cwd = new File("").getAbsolutePath();
this.getClass().getClassLoader().getResource("").getPath()
通常、Fileオブジェクトとしては、
File getCwd() {
return new File("").getAbsoluteFile();
}
"D:/ a/b/c"のような完全修飾文字列が欲しいかもしれません:
getCwd().getAbsolutePath()
私はLinuxを使っていて、以下の両方のアプローチで同じ結果が得られます。
@Test
public void aaa()
{
System.err.println(Paths.get("").toAbsolutePath().toString());
System.err.println(System.getProperty("user.dir"));
}
現在の作業ディレクトリは、Javaの実装によって定義が異なります。 Java 7より前のバージョンでは、作業ディレクトリを取得するための一貫した方法がありませんでした。 -D
を付けてJavaファイルを起動し、情報を保持するための変数を定義することでこれを回避できます。
何かのようなもの
Java -D com.mycompany.workingDir="%0"
それは全く正しくありませんが、あなたはアイデアを得ます。それからSystem.getProperty("com.mycompany.workingDir")
...
Linux terminal から jar ファイルを実行すると、両方とも同じString
を返します。 "/ home/CurrentUser" jarファイルはどこにありますか。 jarファイルを起動するときに、端末で現在どのディレクトリを使用しているかによって異なります。
Paths.get("").toAbsolutePath().toString();
System.getProperty("user.dir");
Class
を持つmain
がMainClass
と呼ばれる場合は、次のことを試してください。
MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();
これは jar ファイルの 絶対パス を持つString
を返します。
Windowsのuser.dirを使用すると、期待どおりにディレクトリが返されますが、管理者権限でアプリケーションを起動したときには実行されません。その場合はC:\ WINDOWS\system32になります。
これはWindows
でのみチェックされますが、他のオペレーティングシステムでも完璧に動作すると思います[Linux,MacOs,Solaris
] :)。
同じディレクトリに 2 .jar
ファイルがありました。 1つの.jar
ファイルから、同じディレクトリーにあるもう1つの.jar
ファイルを開始したいと思いました。
問題は、cmd
から起動すると、現在のディレクトリがsystem32
になることです。
警告!
;][[;'57f2g34g87-8+9-09!2#@!$%^^&()
や()%&$%^@#
というフォルダー名でも、私が行ったすべてのテストでうまくいくようです。ProcessBuilder
を使っています。???? ..
//The class from which i called this was the class `Main`
String path = getBasePathForClass(Main.class);
String applicationPath= new File(path + "application.jar").getAbsolutePath();
System.out.println("Directory Path is : "+applicationPath);
//Your know try catch here
//Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()`
ProcessBuilder builder = new ProcessBuilder("Java", "-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();
//...code
???? getBasePathForClass(Class<?> classs)
:
/**
* Returns the absolute path of the current directory in which the given
* class
* file is.
*
* @param classs
* @return The absolute path of the current directory in which the class
* file is.
* @author GOXR3PLUS[StackOverFlow user] + bachden [StackOverFlow user]
*/
public static final String getBasePathForClass(Class<?> classs) {
// Local variables
File file;
String basePath = "";
boolean failed = false;
// Let's give a first try
try {
file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".Zip")) {
basePath = file.getParent();
} else {
basePath = file.getPath();
}
} catch (URISyntaxException ex) {
failed = true;
Logger.getLogger(classs.getName()).log(Level.WARNING,
"Cannot firgue out base path for class with way (1): ", ex);
}
// The above failed?
if (failed) {
try {
file = new File(classs.getClassLoader().getResource("").toURI().getPath());
basePath = file.getAbsolutePath();
// the below is for testing purposes...
// starts with File.separator?
// String l = local.replaceFirst("[" + File.separator +
// "/\\\\]", "")
} catch (URISyntaxException ex) {
Logger.getLogger(classs.getName()).log(Level.WARNING,
"Cannot firgue out base path for class with way (2): ", ex);
}
}
// fix to run inside Eclipse
if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
|| basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
basePath = basePath.substring(0, basePath.length() - 4);
}
// fix to run inside netbeans
if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
basePath = basePath.substring(0, basePath.length() - 14);
}
// end fix
if (!basePath.endsWith(File.separator)) {
basePath = basePath + File.separator;
}
return basePath;
}
私はあなたがあなたのJavaプログラムがc:\myApp\com\foo\src\service\MyTest.Java
にあり、c:\myApp\com\foo\src\service
まで印刷したいなら、パッケージを含む現在のディレクトリにアクセスしたいと思います、それであなたは以下のコードを試すことができます:
String myCurrentDir = System.getProperty("user.dir")
+ File.separator
+ System.getProperty("Sun.Java.command")
.substring(0, System.getProperty("Sun.Java.command").lastIndexOf("."))
.replace(".", File.separator);
System.out.println(myCurrentDir);
注: このコードは、Oracle JREを搭載したWindowsでのみテストされています。
プロジェクトをEclipse内、netbean内、またはコマンドラインから独立させようとしているとします。私はそれを修正する方法を書きました
public static final String getBasePathForClass(Class<?> clazz) {
File file;
try {
String basePath = null;
file = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".Zip")) {
basePath = file.getParent();
} else {
basePath = file.getPath();
}
// fix to run inside Eclipse
if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
|| basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
basePath = basePath.substring(0, basePath.length() - 4);
}
// fix to run inside netbean
if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
basePath = basePath.substring(0, basePath.length() - 14);
}
// end fix
if (!basePath.endsWith(File.separator)) {
basePath = basePath + File.separator;
}
return basePath;
} catch (URISyntaxException e) {
throw new RuntimeException("Cannot firgue out base path for class: " + clazz.getName());
}
}
使用するには、ファイルを読み込むためのベースパスを取得したいすべての場所で、上記のメソッドにアンカークラスを渡すことができます、結果はあなたが必要なものかもしれません:D
ベスト、
ここに投稿された答えのどれも私のために働きませんでした。これはうまくいったことです:
Java.nio.file.Paths.get(
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
);
編集:私のコードの最終版:
URL myURL = getClass().getProtectionDomain().getCodeSource().getLocation();
Java.net.URI myURI = null;
try {
myURI = myURL.toURI();
} catch (URISyntaxException e1)
{}
return Java.nio.file.Paths.get(myURI).toFile().toString()