java.io.File 内允许的文件分隔符

File separator allowed within java.io.File

在学习文件分隔符时发现一个令人困惑的问题

假设文件c:\book\java存在。以下哪行代码创建了一个代表该文件的对象? (选择所有适用项。)

1. new File("c:\book\java"); 2. new File("c:\book\java"); 3. new File("c:/book/java"); 4. new File("c://book//java"); 5. None of the above

这本书(假设一个基于 dos 的文件系统)说

  1. & 3. 是正确答案
  1. is correct because Java requires a backslash to be escaped with another backslash.
  2. is also correct because Java will convert the slashes to the right one when working with paths..

正斜杠不是转义字符,反斜杠是转义字符。它需要两个反斜杠来表示文件路径中的单个文件分隔符,但只需要一个正斜杠来表示单个文件分隔符——其中正斜杠加倍,表示一行中的两个文件分隔符。

如果改成Mac或者Linux,那么问题的前提,有一个文件c:\book\java,就没有意义了。

这个问题的诀窍是你必须同时考虑文件分隔符和 Java 中的字符串如何转义。

请记住,反斜杠 (\) 是 Java 中的特殊字符。当你想在字符串中放置一个单反斜杠字符时,你必须将它写成:

"\"

上面是一个长度为1的String。

每个 OS 都有一个字符作为路径组件之间的分隔符。无论如何,您必须在路径组件之间指定 一个字符*

选项 2 和 3 是正确的,因为它们在路径组件之间放置了一个 单个字符

选项 4 在路径组件之间放置了两个字符,这是不正确的。正斜杠 / 不是 Java 中的特殊字符;写两遍就是两个字

选项 1 不合法 Java。反斜杠是一个特殊字符;在字符串文字中,反斜杠开始 escape sequence,并且 "\j" 不是有效的转义序列之一。 "\b" 是有效的,但不会做你想做的事;特别是,它会产生一个(不可见的)字符,而不是反斜杠后跟 b

回答你的最后一个问题:Linux 或 OS X 中没有 C:,因此虽然 "C:/book/java" 是语法上合法的路径,但它不会存在(除非有人决定在当前目录中创建自己的名为 C: 的目录,这不太可能,而且几乎肯定不是您想要的)。

* 从技术上讲,路径可以有多个连续的分隔符,但这样做没有意义。

Can 4 also be correct by this logic?

鉴于问题是

Suppose that the file c:\book\java exists. Which of the following lines of code creates an object that represents the file? (Choose all that apply.)

  1. new File("c:\book\java");
  2. new File("c:\book\java");
  3. new File("c:/book/java");
  4. new File("c://book//java");
  5. None of the above

2和3显然是正确的。那么,4"create an ojbect that represents the file"中的File对象呢?

是的。

假设C:\book\java存在,这个代码

public static void main( String[] args ) throws IOException
{
    File f = new File( args[ 0 ] );
    System.err.printf( "args[0]: %s\n", args[ 0 ] );
    System.err.printf( "Path: %s\n", f.getCanonicalPath() );
}

产生这个输出:

args[0]: C://book//java
Path: C:\book\java

所以new File( "C://book//java" )绝对"creates an object that represents the file"也是正确答案。

任何不是它的论点都是不正确的。问题是字符串是否为"creates an object that represents the file"。 C://book//java 确实做到了这一点