【发布时间】: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 路径名,我不得不采取一些特殊步骤,这很遗憾。