在c# /.NET中有System.IO.Path.Combine()的Java等价程序吗?或者任何代码来完成这个?
这个静态方法将一个或多个字符串组合成一个路径。
在c# /.NET中有System.IO.Path.Combine()的Java等价程序吗?或者任何代码来完成这个?
这个静态方法将一个或多个字符串组合成一个路径。
当前回答
这也适用于Java 8:
Path file = Paths.get("Some path");
file = Paths.get(file + "Some other path");
其他回答
在Java 7中,你应该使用resolve:
Path newPath = path.resolve(childPath);
虽然对于使用不必要的不同API的File来说,NIO2 Path类似乎有点多余,但实际上它更加优雅和健壮。
注意,Paths.get()(由其他人建议)没有重载获取Path,并且执行Paths.get(Path . tostring (), childPath)与resolve()不是一回事。从Paths.get()文档:
注意,虽然这个方法非常方便,但使用它将意味着对默认文件系统的假定引用,并限制了调用代码的实用性。因此,它不应该用于用于灵活重用的库代码中。一个更灵活的选择是使用一个现有的Path实例作为锚,例如: 路径dir =… 路径Path = dir.resolve("file");
要解决的姐妹函数是优秀的相对化:
Path childPath = path.relativize(newPath);
为了加强JodaStephen的回答,Apache Commons IO有FilenameUtils。示例(Linux):
assert org.apache.commons.io.FilenameUtils.concat("/home/bob", "work\\stuff.log") == "/home/bob/work/stuff.log"
它是平台独立的,可以生成系统所需的任何分隔符。
如果只需要字符串,可以使用com.google.common.io.Files
Files.simplifyPath("some/prefix/with//extra///slashes" + "file//name")
得到
"some/prefix/with/extra/slashes/file/name"
下面是一个处理多路径部分和边缘条件的解决方案:
public static String combinePaths(String ... paths)
{
if ( paths.length == 0)
{
return "";
}
File combined = new File(paths[0]);
int i = 1;
while ( i < paths.length)
{
combined = new File(combined, paths[i]);
++i;
}
return combined.getPath();
}
我知道距离Jon最初的回答已经有很长时间了,但我对OP有类似的要求。
通过扩展Jon的解决方案,我想出了下面的方法,这将占用一个或多个路径段占用尽可能多的路径段。
使用
Path.combine("/Users/beardtwizzle/");
Path.combine("/", "Users", "beardtwizzle");
Path.combine(new String[] { "/", "Users", "beardtwizzle", "arrayUsage" });
这里为其他有类似问题的人编写代码
public class Path {
public static String combine(String... paths)
{
File file = new File(paths[0]);
for (int i = 1; i < paths.length ; i++) {
file = new File(file, paths[i]);
}
return file.getPath();
}
}