我写了最简单的 Hello,World!应用程序:
public class Helloworld {
public static void main(String[] args) {
System.out.println("Hello\nHello");
}
}
运行时,结果为:
Hello
Hello
但是如果我使用Hello\nHello
作为参数,
public class Helloworld {
public static void main(String[] args) {
System.out.println(args[0]);
}
}
结果为Hello\nHello
。如何获得两行结果?
答案 0 :(得分:14)
编辑:此答案适用于原始问题,理解为
当我用Java编写
Hello\nHello
然后打印它时,会得到两行文本,但是当我在终端中编写Hello\nHello
并将其作为参数传递给Java程序时,为什么会这样呢?我收到一行文字?
如果您是故意的
是否可以将一个字符串参数传递给在多行中打印的java程序?
请参见@DodgyCodeException的answer,它更适合该公式。
在Java中将String
定义为"Hello\nHello"
时,它不包含'\'
字符。这是换行符的转义序列:"\n"
只是一个字符。
但是,当您将此字符串用作程序的参数时(因此该字符串定义为 outside ),"\n"
被解释为两个字符:'\'
和{{1} }。您必须用换行符替换这两个字符,知道要匹配'n'
,必须用'\'
对其进行转义:
'\'
出于便携性的考虑,您还可以使用System.out.println(args[0].replace("\\n", "\n"));
作为替换字符串。
答案 1 :(得分:9)
如果您使用的是类似Unix的操作系统(例如GNU / Linux或MacOS),或者是任何其他系统上的Bash shell(例如Windows上的Cygwin),则只需将命令行参数括在单引号中,然后可以插入任意数量的换行符,并且仍将其视为单个参数:
$ java Helloworld 'line one
line two' <-- this is a single argument with an embedded newline
line one <-- it prints out the output on separate lines!
line two
这不适用于默认的Windows命令处理器(cmd.exe)。在这种情况下,您可能需要使用以下技术。
您可以使用Apache Commons Text中的StringEscapeUtils.unescapeJava方法。然后,您将能够传递命令行参数,并像源代码中的文字字符串一样对它们进行完全解释[*]:
import static org.apache.commons.text.StringEscapeUtils.unescapeJava;
public class Helloworld {
public static void main(String[] args) {
System.out.println(unescapeJava(args[0]));
}
}
[*]排除Apache方法中所有剩余的错误。
答案 2 :(得分:6)
显然您不能立即做到,但是执行以下技巧可以满足您的需求:
System.out.println(String.format(args[0]));
在此使用String#format并将新行作为新行的转换顺序传递。 (请参见format string syntax)。
所以用
调用程序java Helloworld "hello%nnworld"
将打印
hello
workd
并且如果您需要自己输出%n
,则可以用另一个'%'引述'%',即
java Helloworld "hello%%nnworld"
上面将打印:
hello%nnworld