我已经开发了许多在 Java 中操作文件的类。我正在 Linux 机器上工作,并且一直在愉快地输入
new File("path/to/some/file");
。到了提交的时候,我意识到该项目的其他一些开发人员正在使用 Windows。我现在想调用一个方法,该方法可以接受 "/path/to/some/file"
形式的字符串,并根据操作系统返回正确分隔的路径。
例如:
"path/to/some/file"
在 Windows 上变为 "path\\to\\some\\file"
。我意识到敲出一个可以做到这一点的正则表达式不会花很长时间,但我不想重新发明轮子,而是更喜欢经过适当测试的解决方案。如果它内置在 JDK 中就好了,但如果它是一些小型 F/OSS 库的一部分,那也很好。
那么是否有一个 Java 实用程序可以将字符串路径转换为使用正确的文件分隔符字符?
Apache Commons
(再次)来救援。 Commons IO
方法 FilenameUtils.separatorsToSystem(String path)
会做你想做的事。
不用说了,
Apache Commons IO
会做的更多,值得一看
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);
}
}
这就是 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);
}
}
所以如果你想避免额外的依赖,就使用它。
在新的 Java 7 中,他们包含了一个名为 Paths 的类,这使您可以完全按照自己的意愿行事(请参阅http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html)
这里有一个例子:
String rootStorePath = Paths.get("c:/projects/mystuff/").toString();
您可以选择使用
System.getProperty("file.separator")
构建代表路径的字符串?
对于 7 年后尝试这样做的任何人,apache commons separatorsToSystem 方法已移至 FilenameUtils 类:
FilenameUtils.separatorsToSystem(String path)
我创建这个函数来检查字符串是否包含
\
字符,然后将它们转换为 /
public static String toUrlPath(String path) {
return path.indexOf('\\') < 0 ? path : path.replace('\\', '/');
}
public static String toUrlPath(Path path) {
return toUrlPath(path.toString());
}
String fileName = Paths.get(fileName).toString();
与 Windows 完美配合,至少即使是混合路径,例如
c:\users\用户名/我的项目\我的文件/我的文件夹
变成
c:\users\username\myproject\myfiles\myfolder
抱歉,还没有检查 Linux 会如何处理上面的内容,但 Linux 文件结构又是不同的,所以您不会搜索这样的目录
我认为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 文件来做一些简单的事情。在这种情况下,他们无论如何都没有我的建议。
不应该说:
"path"+File.Seperator+"to"+File.Seperator+"some"+File.Seperator+"file"
在 Scala 中,以下代码帮助我们从
windows-compliant
兼容路径生成 linux
路径名。
def osAwareFilename(path: String) : String = {
val pathArr = path.split("/")
if (System.getProperty("os.name").contains("Windows")) {
pathArr.mkString("\\")
}
else path
}