Java 如何动态更新绝对路径

Java 如何动态更新绝对路径,java,string,absolute-path,Java,String,Absolute Path,给定以下传入路径,例如 C:\cresttest\parent_3\child_3_1\child_3_1_.txt 如何在上面的路径之间更新并添加新的目录来构造下面的结果 C:\cresttest\NEW_PATH\parent_3\child_3_1\child_3_1_.txt 目前,我使用多个子字符串来识别传入路径,但传入路径是随机和动态的。使用子字符串并放置我的新路径需要更多的代码行或不必要的处理,是否有任何API或方法可以轻松更新并将我的新目录添加到绝对路径之间?通过使用,您可以

给定以下传入路径,例如

C:\cresttest\parent_3\child_3_1\child_3_1_.txt
如何在上面的路径之间更新并添加新的目录来构造下面的结果

C:\cresttest\NEW_PATH\parent_3\child_3_1\child_3_1_.txt
目前,我使用多个子字符串来识别传入路径,但传入路径是随机和动态的。使用子字符串并放置我的新路径需要更多的代码行或不必要的处理,是否有任何API或方法可以轻松更新并将我的新目录添加到绝对路径之间?

通过使用,您可以:

Path incomingPath = Paths.get("C:\\cresttest\\parent_3\\child_3_1\\child_3_1_.txt");
//getting C:\cresttest\, adding NEW_PATH to it
Path subPathWithAddition = incomingPath.subpath(0, 2).resolve("NEW_PATH");
//Concatenating C:\cresttest\NEW_PATH\ with \parent_3\child_3_1\child_3_1_.txt
Path finalPath = subPathWithAddition.resolve(incomingPath.subpath(2, incomingPath.getNameCount()));
然后可以通过调用
finalPath.toUri()

注意:这并不取决于路径中的任何名称,而是取决于目录深度,您可以在
子路径中编辑该深度


注2:您可以将创建的
Path
实例数量减少到一个,我创建了三个以提高可读性。

您只需在第二个反斜杠处插入一个路径,如下所示:

String path="C:\\cresttest\\parent_3\\child_3_1\\child_3_1_.txt";

final String slash="\\\\";
path=path.replaceFirst(slash+"[^"+slash+"]+"+slash, "$0NEW_PATH"+slash);

System.out.println(path);

这将用自身(通过
$0
引用)替换第一次出现的
\\arbirydirname\\
,然后是
新路径\\

分隔符的源代码表示形式看起来有点奇怪(
“\\\\”
),因为在Java
字符串中编写正则表达式时,必须对反斜杠进行两次转义

如果您希望您的操作独立于平台,您可以将该行替换为

final String slash = Pattern.quote(FileSystems.getDefault().getSeparator());

当然,那么,输入路径也必须为平台的正确格式。

您可以使用以下简单的正则表达式替换:

path = path.replaceAll(":.\\w+", "$0\\\\NEW_PATH");
如果对路径分隔符使用
/
而不是
\
,则代码会更简单。例如,比较:

String path = "C:\\cresttest\\parent_3\\child_3_1\\child_3_1_.txt";
path = path.replaceAll(":.\\w+", "$0\\\\NEW_PATH");


Java可以在windows上处理任何一个分隔符,但在linux上只有
/
起作用,因此为了使代码可移植且更可读,宁愿使用
/
只是为了好玩,不确定这是否是您想要的

public static String addFolderToPath(String originalPath, String newFolderName, int position){
    String returnString = "";
    String[] pathArray = originalPath.split("\\\\");

    for(int i = 0; i<pathArray.length; i++){
        returnString = returnString.concat(i==position ? "\\" + newFolderName : "");
        returnString = returnString.concat(i!=0 ? "\\" + pathArray[i] : "" + pathArray[i]);

    }
    return returnString;  
}
运行:


为了帮助您,我们需要知道插入新文件夹的标准是什么。。。“C:\cresttest”部件是否已修复?或者这一个也可以改变吗?您可能应该看看如何使用,尤其是它的
子路径
方法。@ParkerHalo C:\cresttest部分不是固定的,这是动态的,可以是任何内容。我必须在第一个目录之后添加新路径。然后保持剩余路径不变。因此,如果任何部分已修复。。。你能至少给出一个期望的改变行为的模式吗?谢谢,我运行并得到了输出,为cresttest\parent\u 3\NEW\u PATH\child\u 3\u 1\child\u 3\u 1\u1.txt。是否可以获得c:\\以及结果关于
finalPath.ToAbsolutionPath().toURI()
?如果这不起作用,您可以自己附加“C:\”(有点脏,但如果它对您的用例起作用,我想没关系)
public static String addFolderToPath(String originalPath, String newFolderName, int position){
    String returnString = "";
    String[] pathArray = originalPath.split("\\\\");

    for(int i = 0; i<pathArray.length; i++){
        returnString = returnString.concat(i==position ? "\\" + newFolderName : "");
        returnString = returnString.concat(i!=0 ? "\\" + pathArray[i] : "" + pathArray[i]);

    }
    return returnString;  
}
System.out.println(addFolderToPath("c:\\abc\\def\\ghi\\jkl", "test", 1));
System.out.println(addFolderToPath("c:\\abc\\def\\ghi\\jkl", "test", 2));
System.out.println(addFolderToPath("c:\\abc\\def\\ghi\\jkl", "test", 3));
System.out.println(addFolderToPath("c:\\abc\\def\\ghi\\jkl", "test", 4));
c:\test\abc\def\ghi\jkl
c:\abc\test\def\ghi\jkl
c:\abc\def\test\ghi\jkl
c:\abc\def\ghi\test\jkl