【问题标题】:Remove filename from a URL/Path in java从 java 中的 URL/路径中删除文件名
【发布时间】:2014-03-16 18:16:52
【问题描述】:

如何从 URL 或字符串中删除文件名?

String os = System.getProperty("os.name").toLowerCase();
        String nativeDir = Game.class.getProtectionDomain().getCodeSource().getLocation().getFile().toString();

        //Remove the <name>.jar from the string
        if(nativeDir.endsWith(".jar"))
            nativeDir = nativeDir.substring(0, nativeDir.lastIndexOf("/"));

        //Load the right native files
        for(File f : (new File(nativeDir + File.separator + "lib" + File.separator + "native")).listFiles()){
            if(f.isDirectory() && os.contains(f.getName().toLowerCase())){
                System.setProperty("org.lwjgl.librarypath", f.getAbsolutePath()); break;
            }
        }

这就是我现在所拥有的,并且有效。据我所知,因为我使用“/”它只适用于 Windows。我想让它独立于平台

【问题讨论】:

标签: java string filepath platform-independent


【解决方案1】:

考虑使用org.apache.commons.io.FilenameUtils

您可以使用任何风格的文件分隔符提取基本路径、文件名、扩展名等:

String url = "C:\\windows\\system32\\cmd.exe";

String baseUrl = FilenameUtils.getPath(url);
String myFile = FilenameUtils.getBaseName(url)
                + "." + FilenameUtils.getExtension(url);

System.out.println(baseUrl);
System.out.println(myFile);

给予,

windows\system32\
cmd.exe

带有网址; String url = "C:/windows/system32/cmd.exe";

它会给;

windows/system32/
cmd.exe

【讨论】:

  • 我没有FilenameUtils 我无法导入 org.apache.commons.io.FilenameUtils。
  • @yemto can't import 会是“不应该”或“不知道什么库有它”?
  • @PopoFido 哦,我不喜欢使用库,尤其是对于应该这么简单的东西。
  • 驱动器号呢?
【解决方案2】:

利用java.nio.file; (在 J2SE 1.7 之后引入的 afaik)这简单地解决了我的问题:

Path path = Paths.get(fileNameWithFullPath);
String directory = path.getParent().toString();

【讨论】:

  • 不适用于 HTTP URL,问题中没有特别提到,但浏览这些答案的人可能会感兴趣。
【解决方案3】:

您正在另一行中使用 File.separator。为什么不将它也用于您的 lastIndexOf()?

nativeDir = nativeDir.substring(0, nativeDir.lastIndexOf(File.separator));

【讨论】:

  • 因为它为我的系统返回了错误的东西。但它并不关心它是否变成 C:\something\something\something/something
  • File.separator 返回取决于您的系统的文件分隔符。所以在 Windows 上你会得到“\”,而在 Unix 上你会得到“/”。这就是你应该使用 File.separator 的原因。
  • Game.class.getProtectionDomain().getCodeSource().getLocation().getFile().toString() 返回 D:/Dropbox/NetBeansProjects/System.out.println(File.separator) 返回 \ 所以这是错误的。我有 Windows 7 64 位
  • 好吧,如果该方法总是返回“/”,您可能需要先执行替换以确保在任何情况下都保持相同的状态。 String.replace() 可能会有所帮助
  • 请注意,为了获得 文件名,表达式应该类似于 nativeDir.substring(nativeDir.lastIndexOf(File.separator) + 1)(所以子字符串 from 是分隔符,结束)。
【解决方案4】:

标准库从 Java 7 开始可以处理这个问题

Path pathOnly;

if (file.getNameCount() > 0) {
  pathOnly = file.subpath(0, file.getNameCount() - 1);
} else {
  pathOnly = file;
}

fileFunction.accept(pathOnly, file.getFileName());

【讨论】:

  • path.getNameCount() 文档说:“路径中的元素数,如果此路径仅代表根组件,则为 0”这可能会导致问题...
【解决方案5】:
File file = new File(path);
String pathWithoutFileName = file.getParent();

其中 path 可以是“C:\Users\userName\Desktop\file.txt”

【讨论】:

    【解决方案6】:

    Kotlin 解决方案:

    val file = File( "/folder1/folder2/folder3/readme.txt")
    val pathOnly = file.absolutePath.substringBeforeLast( File.separator )
    println( pathOnly )
    

    产生这个结果:

    /文件夹1/文件夹2/文件夹3

    【讨论】:

      【解决方案7】:

      使用File.separator 代替“/”。它是/\,具体取决于平台。如果这不能解决您的问题,请使用FileSystem.getSeparator():您可以传递不同的文件系统,而不是默认的。

      【讨论】:

      • 我愿意。但是 File.separator 返回一个“\”,而 nativeDir 使用“/”
      • 那么不应该这样工作吗? if(nativeDir.endsWith(".jar")){ int index = Math.max(nativeDir.lastIndexOf("/"), nativeDir.lastIndexOf("\\")); nativeDir = nativeDir.substring(0, index); }
      • 添加了更多信息。这应该可以解决与本机目录的差异。
      【解决方案8】:

      我使用正则表达式解决了这个问题。

      对于窗户:

      String path = "";
      String filename = "d:\\folder1\\subfolder11\\file.ext";
      String regEx4Win = "\\\\(?=[^\\\\]+$)";
      String[] tokens = filename.split(regEx4Win);
      if (tokens.length > 0)
         path = tokens[0]; // path -> d:\folder1\subfolder11
      

      【讨论】:

        【解决方案9】:

        请尝试以下代码:

        file.getPath().replace(file.getName(), "");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-04
          • 2019-08-18
          • 1970-01-01
          • 2015-08-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多