Java中与平台无关的路径


69

我知道文件的相对路径,并希望将其作为File对象在Linux和Windows上进行处理。

在Java中指定平台独立路径的最佳方法是什么?

Answers:


56

File类包含可用于特定平台的文件路径下面的公共成员:

static String pathSeparator
系统相关的路径分隔符,为方便起见,用字符串表示。
static char pathSeparatorChar
系统相关的路径分隔符。
static String separator
系统相关的默认名称分隔符,为方便起见,用字符串表示。 static char separatorChar
取决于系统的默认名称分隔符。


1
我曾尝试pathSeparator在应用程序中使用,但在OS X上使用冒号(:)。如果将其扔到文件路径中,则OS X会将其解释为文件夹名称中的正斜杠字符。例如:foo我没有在用户的桌面上创建一个命名文件夹,而是意外地Desktop/foo在用户的文件夹中创建了一个从字面上命名的文件夹。但是,使用纯正斜杠(/)可以按预期工作。
aapierce

29
这个答案需要更好的解释。pathSeparatorpathSeparatorChar参考系统PATH变量中使用的分隔符。问题是指向文件路径,而不是PATH变量。因此,separatorseparatorChar应该被使用。
RossBille '16

105

只需使用/。我已经使用23.5年了。没问题。


31
@Downvoter现在已经16年了,我仍然从未遇到过问题。你的意思是?
2013年

1
如果我使用Java在/ opt / template中搜索文件,这是否等同于Windows中的c:// opt / template?
约翰·亚历山大·贝茨

6
在某些新的操作系统没有提出新的异国路径分隔符之前,它将一直有效!如果JVM可以处理该特定OS路径分隔符转换的“ /”,那也许就算可行!因此,通常“ /”是一个安全的选择,但是使用显式路径分隔符是将来的可靠选择。
Mohnish 2014年

2
@AechoLiu这只是另一个答案。没有比这更权威的了,这至少是基于证据的。正确的引用应来自JLS或JVM规范或Javadoc。
user207421 '16

1
@EJP对不起,我读了Update,看到了Now, I'm sure I've seen it documented那个答案中的单词。因此,我认为这应该是正确的。我今天遇到这个问题,并在SO中找到了答案。您和那个答案将帮助我解决该问题。我只是不想在这个分析器中投下反对票,因为我知道你是对的。
AechoLiu

15

您可以在Java中使用任何路径分隔符,它在Unix和Windows上均可使用。如果仍要使用系统路径分隔符,则可以使用该File.separator属性,根据当前系统为您提供正确的属性。

对于根,可以使用listRoots(),它为您提供一组根,在Unix系统上只有一个元素,而在Windows上则与驱动器一样多。


pathSeparator将检索路径之间的特定于平台的分隔符(对于Windows,Unix为':';对于Windows为':')。我认为在这种情况下,分隔符更为合适。
耶隆·罗森伯格

2
pathSeparator是PATH环境变量中不同条目的分隔符。对于这个问题,File.separator将是正确的选择。
ThomasLötzer2010年

2
“您可以在Java中使用任何路径分隔符,它可以在Unix和Windows上运行。” -错误。如果在Unix上使用反斜杠(),则不会将其识别为文件路径分隔符,而是会将其解释为文件名(Unix文件名允许包含反斜杠)。
Neeme Praks

@ColinHebert只要讨论路径分隔符,答案就不对。
user207421 '16


4

Java对于File对象中的路径非常聪明。我只使用“ ../foo/bar”之类的东西,并且在这两个平台以及MacOSX上均可使用。


3

Java 7也支持在Paths这里使用

该路径是通过调用默认FileSystem的getPath方法获得的。

然后,您可以通过调用以下命令从中获取文件:

File fileSystemObtainedFile = Paths.get("C:\\foo\\bar.txt").toFile();


0

仅晚了10年。...“使用'/'没关系”只有一半正确(好的,四分之三)。您必须考虑数据的来源。

如果在Java中获得路径,它将使用'/'如果在Java中创建路径,它将理解'/'

但是输入到程序的路径呢?

假设我有一系列创建配置文件(属性)的脚本。假设配置变量之一是INTERESTING_FILE,我们将其生成为包含路径的文件名。现在假设我要从中提取实际的文件名,所以我说

String[] filename = INTERESTING_FILE.split("/");

但是,这在Windows系统上是不正常的

String[] filename = INTERESTING_FILE.split(pathSeparator);

将会起作用(就像通过Paths类清洗它一样)。

我想要指出的是,我不认为'/'在每种情况下都会起作用。


实际上并没有回答问题。
james.garriss
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.