Я пытаюсь провести рефакторинг некоторого унаследованного кода, используя java.io.File
для использования java.nio.file.Path
.
Меня укусил тот факт, что Path лучше поддерживает абсолютные пути к файлам, потому что многие из у значений, которые я получаю, есть ведущий sla sh (/
), в то время как они должны представлять относительные пути. Конкатенация строк в этом случае проще, но я пытаюсь отойти от String
/ File
для представления путей к файлам.
Старое поведение заключалось в том, что new File(parent, child)
возвращал новый File
, представляющий
- дочерний файл / каталог в родительском каталоге, независимо от того, начался ли child с
/
.
Новое поведение состояло в том, что parent.resolve(child)
вернул новый Path
, представляющий либо
- дочерний файл / каталог в родительском каталоге
- child как root (если он начинался с
/
)
I Я думаю, что новый способ может обеспечить более чистый код, но при рефакторинге унаследованного приложения он может содержать незначительные ошибки.
Какой самый лучший / самый чистый способ вернуть старое (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();
}
}
По сути, мне нужен метод, который принимает родительский путь, и дочернюю строку, которая возвращает мне родительский + дочерний путь независимо от был ли у ребенка ведущий /
.
сом как-то так, но без манипуляций со строками, которые зависят от того, что я знаю, что в конфигурации будет использоваться /
(а не \
):
private static Path resolveSafely(Path parent, String child) {
child = child.startsWith("/")
? child.substring(1)
: child;
parent.resolve(child);
}