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

时间:2018-03-04 05:51:47

标签: java io filesystems

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

假设文件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.是正确答案
  2.   
        
    1. 是正确的,因为Java需要使用另一个反斜杠转义反斜杠。
    2.   
    3. 也是正确的,因为Java在处理路径时会将斜杠转换为正确的斜杠。
    4.   
    • 4这个逻辑也能正确吗?
    • 当我改为mac / linux文件系统时 - 应该是什么答案? (更新:我们只创建一个文件对象 - 这是否有意义不是问题 - 问题是哪些最终会返回上面显示的路径

3 个答案:

答案 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存在。以下哪一个   代码行创建一个表示文件的对象? (选择全部   适用。)

     
      
  1. 新文件(“c:\ book \ java”);
  2.   
  3. 新文件(“c:\ book \ java”);
  4.   
  5. 新文件(“c:/ book / java”);
  6.   
  7. 新文件(“c:// book // java”);
  8.   
  9. 以上都不是
  10.   

2和3显然是正确的。那么,4“中的File对象是否创建了一个表示文件”?

的ojbect

是的。

假设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中的字符串如何同时被转义。