Getting the Current Working Directory in Java
我想使用
1 2 3 4 |
输出:
我的输出不正确,因为C驱动器不是我的当前目录。在这方面需要帮助。
1 2 3 4 5 6 |
这将打印应用程序初始化的完整绝对路径。
请参阅:http://docs.oracle.com/javase/tutorial/essential/io/pathops.html
使用EDCOX1、5和EDCOX1(6),您可以执行以下操作来显示Java认为是当前的路径。这是为7和上,并使用NIO。
1 2 3 |
这将输出
以下是Java 7和UP的工作(请参阅文档)。
1 2 3 | import java.nio.file.Paths; Paths.get(".").toAbsolutePath().normalize().toString(); |
这将为您提供当前工作目录的路径:
1 | Path path = FileSystems.getDefault().getPath("."); |
这将为您提供工作目录中名为"foo.txt"的文件的路径:
1 | Path path = FileSystems.getDefault().getPath("Foo.txt"); |
编辑:要获取当前目录的绝对路径:
1 | Path path = FileSystems.getDefault().getPath(".").toAbsolutePath(); |
这是我的解决方案
是什么让您认为c:windowssystem32不是您当前的目录?
换言之,除非从命令行启动Java,否则C:Windows Stave32可能是您的CWD。也就是说,如果双击以启动程序,则CWD不太可能是双击的源目录。
编辑:这看起来对于旧的Windows和/或Java版本来说是正确的。
使用
这在JAR文件中也可以正常工作。你可以用
1 2 3 4 5 6 |
1 | this.getClass().getClassLoader().getResource("").getPath() |
我在评论中发现这个解决方案比其他解决方案更好,而且更易于携带:
通常,作为文件对象:
您可能希望使用完整的限定字符串,如"d:/a/b/c",执行以下操作:
1 | getCwd().getAbsolutePath() |
我在Linux上,这两种方法的结果相同:
1 2 3 4 5 6 7 |
当前的工作目录在不同的Java实现中有不同的定义。对于Java 7之前的某些版本,没有一致的方法来获得工作目录。您可以通过使用EDCOX1(0)来启动Java文件并定义一个变量来保存信息。
类似的东西
1 | java -D com.mycompany.workingDir="%0" |
不太对,但你知道。然后
在Linux上,当您从终端运行JAR文件时,它们都将返回相同的
1 2 3 |
如果你的
1 | MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile(); |
这将返回一个带有JAR文件绝对路径的
使用windows user.dir会按预期返回目录,但在以提升的权限(以管理员身份运行)启动应用程序时不会返回目录,在这种情况下,会得到C:windowssystem32
我希望你想访问包括包在内的当前目录,即如果你的Java程序是在EDCOX1×3中,并且你想打印到EDCOX1×4,那么你可以试试下面的代码:
1 2 3 4 5 6 |
注意:此代码仅在使用OracleJRE的Windows中测试。
提到它只在
我在同一个目录中有2个
问题是,当您从
Warnings!
- 在我做过的所有测试中,下面的内容似乎都很有效文件夹名为
;][[;'57f2g34g87-8+9-09!2#@!$%^^&() 或()%&$%^@# 的它运作良好。 - 我使用的
ProcessBuilder 如下:
?……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //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 |
??
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | /** * 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; } |
假设您试图在Eclipse、NetBean或独立于命令行运行项目。我有一个方法来解决它
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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
最好的,
这里的答案对我来说都不管用。以下是工作原理:
1 2 3 | java.nio.file.Paths.get( getClass().getProtectionDomain().getCodeSource().getLocation().toURI() ); |
编辑:我的代码中的最终版本:
1 2 3 4 5 6 7 | 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() |
这是当前目录名
1 2 3 |
这是当前目录路径
1 |