我需要获取目录的路径。该目录包含找到主要方法的Java文件。
所以我已经搜索了stackoverflow,但仍然没有找到答案。
我已经使用了以下方法,但没有成功:
File file = new File("name.java");
String path = file.getCanonicalPath();
System.out.println(path);
输出为:/home/aaa/dev/robot/name.java
String cwd = System.getProperty("user.dir");
System.out.println("Current working directory : " + cwd);
当前工作目录:/ home / aaa / dev / robot
File resourcesDirectory = new File("src/test/resources");
System.out.println(resourcesDirectory.getAbsolutePath());
/ home / aaa / dev / robot / src / test / resources
我真正需要的是以下内容:
/ home / aaa / dev / robot / src / main / java / com / aaa / robot
其中找到了 name.java 。
我在Linux上。
答案 0 :(得分:1)
这将帮助您:
import java.io.File;
public class Test {
public static void main(String[] args) {
String name = Test.class.getName().replace(".", File.separator);
String path = System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "java" + File.separator + name.substring(0, name.lastIndexOf(File.separator));
System.out.println(path);
}
}
答案 1 :(得分:1)
由于后一个代码无法按预期运行,因此我对其进行了更新。
String canSubString = canonicalPath.substring(0,canonicalPath.lastIndexOf("/")); //+/- 1 character, just check the output.
String classname = canonicalPath.substring( canonicalPath.lastIndexOf("/") + 1);
String command = "find " + canSubString + " -name " + classname;
Process p = Runtime.getRuntime().exec(command);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
System.out.println(in.readLine());
从这里开始,请不要继续阅读。
您可以在代码中调用命令行工具find,然后只在那里查找,因为我们假设您实际上知道Main的名称。
因此请在您的终端中致电以了解其作用:
找到/ home / aaa / dev / -name“ name.java”
现在,我们需要将其与Java结合起来。
Process p = Runtime.getRuntime().exec("find /home/aaa/dev/ -name 'name.java'");
尽管如此,您仍然需要获取输出。不习惯从Java调用命令行工具,我只是将输出写入文件
Process p = Runtime.getRuntime().exec("find /home/aaa/dev/ -name 'name.java' > /tmp/pathtomain" );
这时,您将在/ tmp / pathtomain中找到所需的路径。默认情况下,/ tmp文件夹在系统关闭时为空,因此,如果没有敏感信息,则无需删除该文件。
最后,您需要从该文件中读出。
Scanner scanner = new Scanner(new FileInputStream(new File("/tmp/pathtomain")));
String path = "";
while(scanner.hasNext()) {
path += scanner.nextLine() + "\n";
}
如果文件名仅存在一次,则将导致单行字符串。如果您想找到一些通用名称(例如Main)的Mainclass路径,它将变得更加困难。
如果获得的行数更多,则可以考虑使用可以从代码中提取的任何信息对其进行正则表达式。