给出下面的传入路径,例如
C:\cresttest\parent_3\child_3_1\child_3_1_.txt
如何在上述路径之间更新和添加新目录以构建以下结果
C:\cresttest\NEW_PATH\parent_3\child_3_1\child_3_1_.txt
目前我使用多个subString来识别传入路径,但传入路径是随机和动态的。使用子字符串并放置我的新路径需要更多的代码行或不必要的处理,是否有任何API或方法可以在绝对路径之间轻松更新和添加我的新目录?
答案 0 :(得分:4)
使用java.nio.file.Path,您可以执行以下操作:
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()
注意:这不依赖于路径中的任何名称,但这取决于目录深度,您可以在subpath
调用中编辑。
注意2:你可能会减少你对一个Path
实例的数量,我做了三个以提高可读性。
答案 1 :(得分:1)
你可以在第二个反斜杠上插入一个路径,如下所示:
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);
这会将第一次出现的\\arbitrarydirname\\
替换为自身(通过$0
引用),后跟NEWPATH\\
。
分隔符的源代码表示看起来有点奇怪("\\\\"
),因为在Java String
文字中编写正则表达式时,反斜杠必须转义两次。
如果您希望操作与平台无关,则可以用
替换该行final String slash = Pattern.quote(FileSystems.getDefault().getSeparator());
当然,输入path
也必须采用正确的平台格式。
答案 2 :(得分:0)
您可以使用这个简单的正则表达式替换:
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");
与
String path = "C:/cresttest/parent_3.child_3_1/child_3_1_.txt";
path = path.replaceAll(":.\\w+", "$0/NEW_PATH");
Java可以在Windows上处理任何分隔符,但在Linux上只有/
可用,因此为了使代码可移植且更具可读性,请使用/
。
答案 3 :(得分:0)
只是为了好玩,不确定这是否是你想要的
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