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 的文件系统)说
- & 3. 是正确答案
- is correct because Java requires a backslash to be escaped with another backslash.
- is also correct because Java will convert the slashes to the right one when working with paths..
- 4也能按这个逻辑正确吗?
- 当我更改为 mac/linux 文件系统时 - 答案应该是什么? (更新:我们只是在创建一个文件对象 - 它是否有意义不是这里的问题 - 问题是其中哪一个最终会 return 如上所示的路径 )
正斜杠不是转义字符,反斜杠是转义字符。它需要两个反斜杠来表示文件路径中的单个文件分隔符,但只需要一个正斜杠来表示单个文件分隔符——其中正斜杠加倍,表示一行中的两个文件分隔符。
如果改成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.)
- new File("c:\book\java");
- new File("c:\book\java");
- new File("c:/book/java");
- new File("c://book//java");
- 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
确实做到了这一点。
在学习文件分隔符时发现一个令人困惑的问题
假设文件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 的文件系统)说
- & 3. 是正确答案
- is correct because Java requires a backslash to be escaped with another backslash.
- is also correct because Java will convert the slashes to the right one when working with paths..
- 4也能按这个逻辑正确吗?
- 当我更改为 mac/linux 文件系统时 - 答案应该是什么? (更新:我们只是在创建一个文件对象 - 它是否有意义不是这里的问题 - 问题是其中哪一个最终会 return 如上所示的路径 )
正斜杠不是转义字符,反斜杠是转义字符。它需要两个反斜杠来表示文件路径中的单个文件分隔符,但只需要一个正斜杠来表示单个文件分隔符——其中正斜杠加倍,表示一行中的两个文件分隔符。
如果改成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.)
- new File("c:\book\java");
- new File("c:\book\java");
- new File("c:/book/java");
- new File("c://book//java");
- 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
确实做到了这一点。