命令行参数中的转义序列(Java)
据 在Java中将字符串定义为“Hello\nHello”时,它不包含“\” 性格这是换行符的转义序列:“\n”只是 一个字符 当您将此字符串用作 但是,程序(因此字符串是在外部定义的),“\n”是 解释为两个字符:“\”和“n” 为什么不编译包含转义序列的命令行参数呢?我以为命令行参数放在数组字符串[]args中了命令行参数中的转义序列(Java),java,arrays,command-line-arguments,Java,Arrays,Command Line Arguments,据 在Java中将字符串定义为“Hello\nHello”时,它不包含“\” 性格这是换行符的转义序列:“\n”只是 一个字符 当您将此字符串用作 但是,程序(因此字符串是在外部定义的),“\n”是 解释为两个字符:“\”和“n” 为什么不编译包含转义序列的命令行参数呢?我以为命令行参数放在数组字符串[]args中了 字符串[]args将包含args[0]=“Hello\nJava” 命令行参数不是Java源代码,因此Java源代码中字符含义的规则不适用 命令行参数的解释或其他方面由命令解释器负
字符串[]args将包含args[0]=“Hello\nJava” 命令行参数不是Java源代码,因此Java源代码中字符含义的规则不适用 命令行参数的解释或其他方面由命令解释器负责;Java没有得到特别对待。例如,在大多数(全部?)Linux Shell中,\n不会在带引号的字符串中替换:
$ echo 'a \n b'
a \n b
除引号外,反斜杠-n的意思是“字面上的n”,这与“n”完全相同,因为“n”对shell没有任何特殊意义
$ echo a\nb
anb
当然,Java系统可以在命令解释器之后应用自己的处理,但大多数Linux用户会发现这让人困惑;与其他命令相比,Java命令的行为会不一致。转义序列不会被命令外壳转换为相应的字符代码(),因此您想知道的是,为什么
Java
程序在调用它时不会对接收到的参数进行一些处理。原因很简单:按摩是任意的,可能有些用户不希望字符串被解释为人类文本;但是一个字符串,它表示转义代码的任意转换是失败的泛化的其他东西。一些例子:
c:\my\folder\number\n
,在这里您可以找到两个\n
,如果java任意泛化为人类文本,那么这将是一个重大错误ids
,密码,ascii码\?
都将编译成相应的转义码(作为语言的一个特性);但是您可以通过转义来告诉java编译器不要这样做,即\\?
;但这份汇编涉及到了一些问题。在运行时,所有字符串都只不过是char[]
,并且不会对它们应用任意按摩
如果转义符中反斜杠后面的字符不是ASCII b、t、n、f、r、“,”、\、0、1、2、3、4、5、6或7,则为编译时错误。Unicode转义符\u在前面处理(§3.3)
因此String[]args存储由命令解释器right处理的字符串。命令解释器根据自己的规则将命令行分解为参数(此时shell之间相当标准)如果该进程运行的是Java虚拟机,那么JVM可能会将其中的一些参数原封不动地传递给main()函数;我不知道JVM规范是否要求这样做,但根据经验,Linux上的Oracle实现确实如此。