是否有一个 Java 实用程序可以将字符串路径转换为使用正确的文件分隔符字符?

问题描述 投票:0回答:11

我已经开发了许多在 Java 中操作文件的类。我正在 Linux 机器上工作,并且一直在愉快地输入

new File("path/to/some/file");
。到了提交的时候,我意识到该项目的其他一些开发人员正在使用 Windows。我现在想调用一个方法,该方法可以接受
"/path/to/some/file"
形式的字符串,并根据操作系统返回正确分隔的路径。

例如:

"path/to/some/file"
在 Windows 上变为
"path\\to\\some\\file"

在 Linux 上它只返回给定的字符串。

我意识到敲出一个可以做到这一点的正则表达式不会花很长时间,但我不想重新发明轮子,而是更喜欢经过适当测试的解决方案。如果它内置在 JDK 中就好了,但如果它是一些小型 F/OSS 库的一部分,那也很好。

那么是否有一个 Java 实用程序可以将字符串路径转换为使用正确的文件分隔符字符?

java string file-io cross-platform java-6
11个回答
51
投票

Apache Commons
(再次)来救援。
Commons IO
方法
FilenameUtils.separatorsToSystem(String path)
会做你想做的事。

不用说了,

Apache Commons IO
会做的更多,值得一看


18
投票

A

"/path/to/some/file"
实际上works 在 Windows Vista 和 XP 下。

new java.io.File("/path/to/some/file").getAbsoluteFile()

> C:\path\to\some\file

但它仍然不可移植,因为 Windows 有多个。所以必须以某种方式选择根目录。相对路径应该没有问题

编辑:

Apache commons io not 帮助 unix 和 windows 以外的环境。 Apache io 源代码

public static String separatorsToSystem(String path) { 
    if (path == null) {
     return null;
    }
    if (isSystemWindows()) {
      return separatorsToWindows(path);
    } else {
      return separatorsToUnix(path);
    }
}

8
投票

这就是 Apache commons-io 所做的,展开成几行代码:

String separatorsToSystem(String res) {
    if (res==null) return null;
    if (File.separatorChar=='\\') {
        // From Windows to Linux/Mac
        return res.replace('/', File.separatorChar);
    } else {
        // From Linux/Mac to Windows
        return res.replace('\\', File.separatorChar);
    }
}

所以如果你想避免额外的依赖,就使用它。


3
投票

在新的 Java 7 中,他们包含了一个名为 Paths 的类,这使您可以完全按照自己的意愿行事(请参阅http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

这里有一个例子:

String rootStorePath = Paths.get("c:/projects/mystuff/").toString();

2
投票

您可以选择使用

System.getProperty("file.separator")

构建代表路径的字符串?


2
投票

对于 7 年后尝试这样做的任何人,apache commons separatorsToSystem 方法已移至 FilenameUtils 类:

FilenameUtils.separatorsToSystem(String path)

2
投票

我创建这个函数来检查字符串是否包含

\
字符,然后将它们转换为
/

public static String toUrlPath(String path) {
  return path.indexOf('\\') < 0 ? path : path.replace('\\', '/');
}

public static String toUrlPath(Path path) {
  return toUrlPath(path.toString());
}

1
投票
String fileName = Paths.get(fileName).toString();

与 Windows 完美配合,至少即使是混合路径,例如

c:\users\用户名/我的项目\我的文件/我的文件夹

变成

c:\users\username\myproject\myfiles\myfolder

抱歉,还没有检查 Linux 会如何处理上面的内容,但 Linux 文件结构又是不同的,所以您不会搜索这样的目录


1
投票

我认为Java Paths中有这个漏洞。

String rootStorePath = Paths.get("c:/projects/mystuff/").toString();

如果您在具有您需要使用的文件系统的系统上运行它,则可以正常工作。正如所指出的,它使用了当前的操作系统文件系统。

我需要处理 windows 和 linux 之间的路径,比如将一个文件从一个文件复制到另一个文件。在使用“/”时,我想如果您使用的是所有 Java 命令,但我需要进行 sftp 调用,所以使用 / 或

file.separator
等...对我没有帮助。我不能使用
Path()
,因为它将我的转换为我“现在”运行的默认文件系统。

Java需要的是:
在 Windows 系统上:

Path posixPath = Paths.get("/home/mystuff", FileSystem.Posix );
stays /home/mystuff/  and does not get converted to \\home\\mystuff

on linux system:
String winPath = Paths.get("c:\home\mystuff", FileSystem.Windows).toString();

保持

c:\home\mystuff
并且不会转换为
/c:/home/mystuff

类似于使用字符集:

URLEncoder.encode( "whatever here", "UTF-8" ).getBytes();

附言我也不想加载整个 apache io jar 文件来做一些简单的事情。在这种情况下,他们无论如何都没有我的建议。


0
投票

不应该说:

"path"+File.Seperator+"to"+File.Seperator+"some"+File.Seperator+"file"

0
投票

在 Scala 中,以下代码帮助我们从

windows-compliant
兼容路径生成
linux
路径名。

  def osAwareFilename(path: String) : String =  {
    val pathArr = path.split("/")
    if (System.getProperty("os.name").contains("Windows")) {
      pathArr.mkString("\\")
    }
    else path
  }
© www.soinside.com 2019 - 2024. All rights reserved.