在我的代码中,我想转换一个形式的路径
/a/path/to/a/file/image.jpg
自
/a/path/to/a/file/image_resized.jpg
目前,我正在使用以下代码,该代码使用来自apache commons IO的FilenameUtils
。
public Path resize(Path original) {
String baseName = FilenameUtils.getBaseName(original.toString());
String extension = FilenameUtils.getExtension(original.toString());
return Paths.get(original.getParent().toString(), baseName + "_resized." + extension);
}
我想知道是否可以使用 java 8 功能增强其中一些代码,特别是:
- 是否有一种java-8方法来提取扩展名和基名,而无需使用对Apache Commons IO(FilenameUtils(的依赖,并且没有正则表达式(我更喜欢依赖apache commons IO而不是在这里使用正则表达式(
- 加入路径而无需
toString()
Paths.get(existingPath.toString(), "path/to/append");
问题的第二部分在 Java 中的合并路径中回答
IMO 不需要库来完成这么小而简单的任务(并且没有 java-8 不添加对此的支持(; 我也不知道为什么正则表达式是不可能的
int where = input.lastIndexOf(".");
String result = input.substring(0, where) + "_resized" + input.substring(where);
System.out.println(result);
怎么样? 您可以使用 Path#resolveSibling(String( 获取相对于original
路径的路径。 并使用 Path#get文件名获取 path 中的文件名。
感谢@Holger指出我可以改用正则表达式"(.*?)(\.[^.]+)?$"
。
public Path resize(Path original) {
return original.resolveSibling(original.getFileName().toString()
// v--- baseName
.replaceFirst("(.*?)(\.[^.]+)?$", "$1_resized$2"));
// ^--- extension
}
输出
// v---for printing, I used the `String` here,actually is Paths.get(...)
resize("/a/b/image.jpg") => "/a/b/image_resized.jpg";
resize("/a/b/image.1.jpg") => "/a/b/image.1_resized.jpg";
resize("/a/b/image1") => "/a/b/image1_resized";
我确信 Java8 没有任何可以处理这个问题的东西。也许你可以从Guava查看Files API。Files.getFileExtension(fileName)
这个问题可以通过使用简单的字符串操作来解决,你不需要库来做这样的东西。这个问题的解决方案之一是——
class Solution {
public static void main(String[] args) {
String path = "/a/path/to/a/file/image.jpg";
String[] temp = path.split("/");
String[] tmp = temp[temp.length - 1].split("\.");
tmp[0] = tmp[0] + "-resized";
String fullname = String.join(".", tmp);
temp[temp.length - 1] = fullname;
String newPath = String.join("/", temp);
System.out.print(newPath);
}
}
所以,我把你的答案组合成这个:
首先,似乎没有办法在java中提取文件扩展名进行java构建(其他stackoverflow问题(
然后使用String.lastIndexOf()
是获取扩展名 (Eugene( 的一种简单可靠的方法。最后,使用Path.resolveSibling()
(holi-java( 将新文件名与父路径连接起来。
生成的代码:
public Path resize(Path original) {
String fileName = original.getFileName().toString();
int extIndex = fileName.lastIndexOf(".");
String baseName = fileName.substring(0,extIndex);
String extension = fileName.substring(extIndex);
return original.resolveSibling(baseName+"_resized"+extension);
}