在学习文件分隔符时发现了一个令人困惑的问题
假设文件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的文件系统)说
- 是正确的,因为Java需要使用另一个反斜杠转义反斜杠。
- 也是正确的,因为Java在处理路径时会将斜杠转换为正确的斜杠。
醇>
答案 0 :(得分:1)
请记住,反斜杠(\)是Java中的一个特殊字符。如果要在String中放置单反斜杠字符,则必须将其写为:
"\\"
以上是长度为1的字符串。
每个操作系统都有一个字符,用作路径组件之间的分隔符。无论如何,您必须在路径组件之间指定一个字符。 *
选择2和3是正确的,因为它们在路径组件之间放置了单个字符。
选择4在路径组件之间放置两个字符,这是不正确的。正斜杠/
不是Java中的特殊字符;如果你写两次,它只是两个字符。
选择1不是合法的Java。反斜杠是一个特殊的字符;在字符串文字中,反斜杠开始escape sequence,而"\j"
不是有效的转义序列之一。 "\b
"是有效但不会做你想要的;特别是,它会产生一个(不可见)字符,而不是反斜杠后面跟b
。
回答你的最后一个问题:Linux或OS X中没有C:
,所以虽然"C:/book/java"
是一个语法上合法的路径,但它不存在(除非有人决定创建自己的目录名称在当前目录中C:
,这是不太可能的,几乎肯定不是你想要的。)
*从技术上讲,路径可以有多个连续的分隔符,但这样做毫无意义。
答案 1 :(得分:1)
这个逻辑能否正确4?
鉴于问题是
假设文件
c:\book\java
存在。以下哪一个 代码行创建一个表示文件的对象? (选择全部 适用。)
- 新文件(“c:\ book \ java”);
- 新文件(“c:\ book \ java”);
- 新文件(“c:/ book / java”);
- 新文件(“c:// book // java”);
- 以上都不是
醇>
2和3显然是正确的。那么,4“中的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" )
绝对是“创建一个代表文件的对象”,也是一个正确答案。
任何不存在的论据都是不正确的。问题是字符串是否“创建表示文件的对象”。 C://book//java
可以证明确实如此。
答案 2 :(得分:0)
正斜杠不是转义字符,反斜杠是转义字符。它需要两个反斜杠来表示文件路径中的单个文件分隔符,但只有一个正斜杠表示单个文件分隔符 - 正斜杠加倍,表示一行中有两个文件分隔符。
如果您更改为Mac或Linux,那么问题的前提是,文件c:\book\java
没有任何意义。
这个问题的诀窍是你必须考虑文件分隔符以及Java中的字符串如何同时被转义。