有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Java8在文件名和扩展名之间添加中缀的路径

在我的代码中,我想转换表单的路径

/a/path/to/a/file/image.jpg

/a/path/to/a/file/image_resized.jpg

目前,我正在使用以下代码,它使用来自ApacheCommonsIO的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方法可以提取扩展名和basename,而不使用对Apache Commons IO(FilenameUtils)的依赖,也不使用正则表达式(我更喜欢依赖Apache Commons IO而不是使用正则表达式)
  • 连接到Paths.get(existingPath.toString(), "path/to/append");中没有toString()的路径

问题的第二部分在Combine paths in Java中得到答复


共 (5) 个答案

  1. # 1 楼答案

    这个怎么样?可以使用Path#resolveSibling(String)获取相对于original路径的路径。并使用Path#getFileName获取路径中的文件名

    感谢@Holger,我指出我可以使用regex"(.*?)(\\.[^.]+)?$"

    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";
    
  2. # 2 楼答案

    对于这样一个小而简单的任务IMO,您不需要一个库(而且没有java-8不支持这个);我也不知道为什么正则表达式是不可能的

        int where = input.lastIndexOf(".");
    
        String result = input.substring(0, where) + "_resized" + input.substring(where);
        System.out.println(result);
    
  3. # 3 楼答案

    我确信Java8没有任何东西可以处理这个问题。也许您可以从Guava签出文件APIFiles.getFileExtension(fileName)

  4. # 4 楼答案

    因此,我将您的答案合并到以下内容中:

    首先,在java(other stackoverflow question)中提取文件扩展名时,似乎没有java构建的方法

    然后使用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);
    }
    
  5. # 5 楼答案

    这个问题可以通过使用简单的字符串操作来解决,这样的东西不需要库。解决这个问题的方法之一是:

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