我正在尝试使用java.io.File
重构一些旧代码,以改为使用java.nio.file.Path
。
我对Path更好地支持绝对文件路径感到困扰,因为我收到的许多值在表示相对路径时都带有一个斜杠(/
)。字符串连接更容易通过这种方式进行,但是我正尝试从String
/ File
转向代表文件路径。
过去的行为是new File(parent, child)
返回了一个新的File
代表
/
开头。新的行为是parent.resolve(child)
返回了代表其中一个的新Path
/
开头)我认为新方法可以使代码更简洁,但是在重构旧版应用程序时,它可能会引入一些细微的错误。
在使用File
时恢复旧(Path
)行为的最佳/最干净的方法是什么?
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
class Main {
public static void main(String[] args) {
file();
path();
}
public static void file(){
File root = new File("/root");
File relative = new File(root, "relative");
File absolute = new File(root, "/absolute");
System.out.println("File:");
System.out.println(relative.getAbsolutePath()); // prints "/root/relative"
System.out.println(absolute.getAbsolutePath()); // prints "/root/absolute"
System.out.println();
}
public static void path(){
Path root = Paths.get("/root");
Path relative = root.resolve("relative");
Path absolute = root.resolve("/absolute");
System.out.println("Path:");
System.out.println(relative.toAbsolutePath()); // prints "/root/relative"
System.out.println(absolute.toAbsolutePath()); // prints "/absolute" but should print "/root/absolute"
System.out.println();
}
}
基本上我想要的是一个方法,该方法采用一个父路径,一个子字符串返回一个父+子路径,而无论子是否有前导/
。
这样的事情,但是没有依赖我的String操作,知道该配置将使用/
(而不是\
):
private static Path resolveSafely(Path parent, String child) {
child = child.startsWith("/")
? child.substring(1)
: child;
parent.resolve(child);
}
答案 0 :(得分:1)
我能找到的最好方法是:
Fragment
希望这就是您所需要的。