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

问题描述 投票:3回答:3

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

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

通过这种逻辑,4也可以是正确的吗?

鉴于问题是

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

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

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证明了这一点。


1
投票

请记住,反斜杠(\)是Java中的一个特殊字符。如果要在String中放置单个反斜杠字符,则必须将其写为:

"\\"

以上是长度为1的字符串。

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

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

选项4在路径组件之间放置两个字符,这是不正确的。正斜杠,/,不是Java中的特殊字符;如果你写两次,它只是两个字符。

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

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

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


0
投票

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

如果你改为Mac或Linux,那么问题的前提是,有一个文件c:\book\java,没有任何意义。

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

© www.soinside.com 2019 - 2024. All rights reserved.