【问题标题】:Does Java have a path joining method? [duplicate]Java有路径连接方法吗? [复制]
【发布时间】:2010-10-17 06:06:12
【问题描述】:

完全重复:

combine paths in java

我想知道Java中是否有这样的方法。以这个 sn-p 为例:

// this will output a/b
System.out.println(path_join("a","b"));
// a/b 
System.out.println(path_join("a","/b");

【问题讨论】:

标签: java file file-io path


【解决方案1】:

这涉及 Java 版本 7 及更早版本。

引用good answer to the same question

如果您希望稍后将其作为字符串返回,您可以调用 getPath()。事实上,如果你真的想模仿 Path.Combine,你可以写这样的东西:

public static String combine (String path1, String path2) {
    File file1 = new File(path1);
    File file2 = new File(file1, path2);
    return file2.getPath();
}

【讨论】:

  • 在 Java 8 中不起作用。更好的选择:导入 java.nio.file.Paths;路径 path = Paths.get(mydir, "myfile");
  • @MarcWittmann,当你在 Java 8 中这样做时会发生什么?
  • 使用 Java 7 的 nio 解决方案要短得多:Paths.get(path1, path2)
  • 请注意路径/路径不适用于 jar-s,仅适用于文件系统。参见例如。 stackoverflow.com/questions/941754/…
【解决方案2】:

试试:

String path1 = "path1";
String path2 = "path2";

String joinedPath = new File(path1, path2).toString();

【讨论】:

  • getPath()getAbsolutePath() 会不会比 toString() 更好?
  • 供将来参考:toString() 与 File 类的 getPath() 相同。
  • @fstanis:与toString() 相比,getPath() 仍然更具可读性(假设它们返回相同的内容)
【解决方案3】:

一种方法是获取系统属性,为您提供操作系统的路径分隔符,this tutorial 解释了如何。然后,您可以使用file.separator 使用标准字符串连接。

【讨论】:

    【解决方案4】:

    这是一个开始,我认为它不会完全按照您的意愿工作,但它至少会产生一致的结果。

    import java.io.File;
    
    public class Main
    {
        public static void main(final String[] argv)
            throws Exception
        {
            System.out.println(pathJoin());
            System.out.println(pathJoin(""));
            System.out.println(pathJoin("a"));
            System.out.println(pathJoin("a", "b"));
            System.out.println(pathJoin("a", "b", "c"));
            System.out.println(pathJoin("a", "b", "", "def"));
        }
    
        public static String pathJoin(final String ... pathElements)
        {
            final String path;
    
            if(pathElements == null || pathElements.length == 0)
            {
                path = File.separator;
            }
            else
            {
                final StringBuilder builder;
    
                builder = new StringBuilder();
    
                for(final String pathElement : pathElements)
                {
                    final String sanitizedPathElement;
    
                    // the "\\" is for Windows... you will need to come up with the 
                    // appropriate regex for this to be portable
                    sanitizedPathElement = pathElement.replaceAll("\\" + File.separator, "");
    
                    if(sanitizedPathElement.length() > 0)
                    {
                        builder.append(sanitizedPathElement);
                        builder.append(File.separator);
                    }
                }
    
                path = builder.toString();
            }
    
            return (path);
        }
    }
    

    【讨论】:

    • 使用该平台。正如其他答案所示,Java 会为用户处理这个问题,所以真的没有必要再推出一个。
    • 因为 File 构造函数很昂贵(就时间而言)。它与文件系统交互(取决于实现)。没有必要故意编写速度较慢的代码。话虽如此,应该测量速度,因此我的代码可能较慢。此外,我提供的答案适用于不基于文件的事物,因此更加灵活。
    • 我很抱歉,但是对于这样的事情的速度是次要的问题,特别是对于许多只想知道如何以正确方式进行操作的网站而言。 * 重新实现现有的 Java 库功能 * 强制执行特定于操作系统的路径约定(至少可以在默认情况下进行参数注入) * 问题是关于路径连接,以使其更灵活地接受接口
    • “我真的很抱歉,但是这样的事情的速度是次要的问题,特别是对于许多只想知道如何做正确方法的人关心的网站”这就是为什么我们已接受答案。我的回答在技术上没有任何问题,它有效,它解决了一个问题(速度),并且它展示了如果不是文件如何做同样的事情。您不能说速度对此无关紧要,如果它被调用数百万次怎么办?
    • " 它有效,它解决了一个问题(速度)" 正如您在上面提到的,没有基准我们不“知道”它更快。您提出了这一点,如果这是目标,请不要在没有一些基准的情况下吹捧速度。 “它展示了如果不是文件,如何做同样的事情。”您在示例中使用 File.separator,我看不出它如何移植到各种非基于文件的系统中,您能解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2011-10-12
    相关资源
    最近更新 更多