使用 java 8 在文件名和扩展名之间添加中缀



在我的代码中,我想转换一个形式的路径

/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);
}

相关内容

  • 没有找到相关文章

最新更新