假设我有我的主班C:\Users\Justian\Documents\
。我怎样才能让我的程序显示它在其中C:\Users\Justian\Documents
?
硬编码不是一种选择-如果将其移动到另一个位置,则需要适应性强。
我想将一堆CSV文件转储到一个文件夹中,让程序识别所有文件,然后加载数据并进行操作。我真的只想知道如何导航到该文件夹。
假设我有我的主班C:\Users\Justian\Documents\
。我怎样才能让我的程序显示它在其中C:\Users\Justian\Documents
?
硬编码不是一种选择-如果将其移动到另一个位置,则需要适应性强。
我想将一堆CSV文件转储到一个文件夹中,让程序识别所有文件,然后加载数据并进行操作。我真的只想知道如何导航到该文件夹。
Answers:
一种方法是使用系统属性, 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简单参数解析器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()
参数传递。
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文件中,有时通过网络加载,甚至即时生成。
那么,您实际上想做什么?可能有一种方法可以不对类的来源做出假设。