【问题标题】:How to deal with different file.separator on Windows and UNIX in java如何在java中处理Windows和UNIX上不同的file.separator
【发布时间】:2012-06-28 09:32:43
【问题描述】:

我正在审查我的代码

我的 Java 应用程序使用 Java 6 在 Windows 和 Unix 上运行并处理文件。我知道我可以使用 file.separator 以独立于文件系统的方式获取文件分隔符,但是如果我曾经直接使用指定 windows 文件分隔符字符,因为 '\' 这也是我无法操作的 Java 转义字符文件路径。因此,在我的代码中,我总是通过将 \' 替换为 '/' 来以 unix 表示法存储文件路径,并且这些路径存储在数据库中,所以我认为那里也存在转义问题。所以我错觉尝试使用 file.separator 也会失败,因为它会返回 '\' 而不是 '\' 但现在意识到只需要 \ 如果我自己在引号中明确指定它。

现在我认为这都是不必要的,只要我总是使用 file.separator,我就不需要进行这种转换,对吗?

编辑: 发现一个似乎有问题的案例

"C:\Fred\test1.txt".split("\\\\");
"C:\Fred\test1.txt".split(System.getProperty("file.separator"));

如果我想用 \ 分割字符串,我将它加倍,因为 \ 在正则表达式中具有特殊含义,因此使用 file.separator 的行失败并显示

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
 ^
    at java.util.regex.Pattern.error(Pattern.java:1713)
    at java.util.regex.Pattern.compile(Pattern.java:1466)
    at java.util.regex.Pattern.<init>(Pattern.java:1133)
    at java.util.regex.Pattern.compile(Pattern.java:823)

但在 unix 上没有这样的要求,对应的 '/' 不应该被转义

编辑 2: 这个问题在Splitting filenames using system file separator symbol 之前被问过,解决方案归结为在输入周围使用 Pattern.quote() 或尝试使用文件方法而不是正则表达式。如果可以以独立于系统的方式查看文件,我会更喜欢它,我不认为 Java 7 中的 Path 有同样的问题。

编辑 3: 还看到从 db 读取/写入的问题,为此创建了一个单独的问题 Storing Windows Path in Database and retrieving with Hibernate using java

【问题讨论】:

  • 对于编辑 2:Pattern.quote(File.Seperator) 在这两种情况下都有效吗?在 Windows 中,它将返回 4 个引号,在 Unix 中返回 2 - 这是您需要的吗?
  • 是的,Pattern.quote() 确实有效,这就是我所做的,但由于 Windows 路径名,我不得不采取一些特殊步骤,这很遗憾。

标签: java file


【解决方案1】:

是的,你是对的——如果你使用 File.Seperator,你不需要任何额外的转义,因为在 Windows 中它已经为你转义了。来自javadocumentation

separatorChar

public static final char separatorChar

The system-dependent default name-separator character. 
This field is initialized to contain the first character of the value of the system property file.separator. 
On UNIX systems the value of this field is '/';
on Microsoft Windows systems it is '\\'. 

【讨论】:

  • 添加了使用正则表达式时的问题
猜你喜欢
  • 1970-01-01
  • 2015-08-05
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2023-03-26
  • 2017-12-07
  • 1970-01-01
相关资源
最近更新 更多