非静态等效于 java.nio.file.Paths.get()

Non-static equivalent to java.nio.file.Paths.get()

一些背景知识: 我是 运行 沙盒模式下的 Jenkins 共享库,我无法使用任何 Java/Groovy 静态方法。一个简单的解决方案是关闭沙盒模式,但我必须使用它。另一个限制:new java.io.File(...) 不允许调用。

是否有任何非静态 functions/methods 可以将连接时形成路径字符串的字符串序列转换为路径——即 java.nio.file.Paths.get() 的行为?

编辑: 我知道它可以手动完成,非常乏味,但我想看看是否存在任何现有功能可以做到这一点。

试试这个:

public static Path getPath(String ... pathArr) {
    if (pathArr.length == 0)
        throw new IllegalArgumentException();
    StringBuilder path = new StringBuilder();
    for (String s : pathArr)
        path.append("/").append(s);
    return new File(path.toString()).toPath();
}

我测试过,它适用于不存在的路径

println new File("/home/usr", "x.txt").toPath()
println new File("/home/usr/", "/x.txt").toPath()
println new File("/home/usr//x.txt").toPath()
println new File("/home", "usr/x.txt").toPath()

上面的所有内容给出了结果:

/home/usr/x.txt

似乎在Groovy Sandbox的限制下,没有这样的现有功能可以模仿java.nio.file.Paths.get(...)的用法而不创建新的file对象。我在将文件 'stems'(UNIX 或 DOS 格式)转换为 UNIX 样式 absolute/relative 路径的特定情况下使用的解决方法使用了混乱的正则表达式匹配和字符串连接。它确实模仿了 java.nio.file.Paths.get(...).

的调用
def mergePaths = { String first, String... rest ->
    return first.replaceAll(/(\$)|(\/$)/, '').replaceAll(/(\)/, '/') + '/' +
        rest.collect { it ->
            it.replaceAll(/(^\)|(^\/)|(\$)|(\/$)/, '')
        }.collect { it ->
            it.replaceAll(/(\)/, '/')
        }.join('/')
}