在文件路径中使用斜杠和反斜杠的奇怪行为

时间:2015-01-26 14:17:08

标签: java windows file backslash slash

在Java中使用文件路径时,我们遇到了一些奇怪的问题。问题是,有时,在Windows中工作时,在路径中使用斜杠和反斜杠创建的文件的操作会失败。作为一项规则,我们正在用反斜杠替换斜杠,但我们无法确定为什么有时候操作失败而其他操作失败。

具体来说,操作是file.delete()。如果完全失败,它不会抛出任何类型的异常。

3 个答案:

答案 0 :(得分:4)

您完全不应该使用File.delete();如果操作失败,它不会为您提供有意义的响应。

使用Files.delete(Path)Files.deleteIfExists(Path)删除文件(由Path表示,请参阅Paths.get(String…)File.toPath()),因为这些方法会引发一个有意义的{ {1}}失败,而只有后者返回IOException,表示成功或不存在但所有其他条件都标有异常。

Windows API中确实存在以静默方式处理斜杠作为分隔符的函数,但由于未指定哪些J​​ava API方法将使用哪些本机函数,因此您不能依赖于此方面的任何特定行为。使用boolean API时,您应始终使用File.separatorCharFileSystems.getDefault().getSeparator()所示的分隔符。

答案 1 :(得分:0)

除非您使用反斜杠,否则Java会将它们视为转义码。例如,这就是换行符(\n)和制表符(\t)的工作方式。

来自JavaDoc on Characters and Escape Sequences

  

以反斜杠(\)开头的字符是转义序列,对编译器具有特殊含义。

所以正在发生的事情是你的文件路径可能被视为转义序列。该链接有一些关于什么类型的转义码的详细信息。

所以如果你刚刚这样做了:

  File.delete("c:\this.txt")
  // Converted to "c:      his.txt" (because of the tab)

如果可以的话,我建议加倍反斜杠(\\)或转到所有正斜杠。

答案 2 :(得分:0)

File.delete如果失败则不会抛出异常;相反,它返回一个布尔值,指示删除是否失败。来自Javadoc:

  

当且仅当文件或目录被成功删除时才返回true; false否则

如果您在删除失败时想要例外,则需要自己提出:

if (!myfile.delete()) {
     throw new IOException("Couldn't delete file " + myfile.getPath());
}