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