Java 如何使用换行参数

Java 如何使用换行参数,java,Java,我写的最简单的问候,世界!应用程序: 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(Str

我写的最简单的问候,世界!应用程序:

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
。如何获得两行结果?

编辑::此答案适用于理解为的原始问题

为什么当我用Java写
Hello\nHello
并打印它时,我会得到两行文本,但当我在终端中写
Hello\nHello
并将其作为参数传递给Java程序时,我会得到一行文本

如果你是说

有没有一种方法可以将一个字符串参数传递给我的java程序,让它打印在多行上

请参阅@DodgyCodeException's,它更适合该公式


在Java中将
字符串定义为
“Hello\nHello”
时,它不包含
“\”
字符。这是换行符的转义序列:
“\n”
只是一个字符。 但是,当您将此字符串用作程序的参数时(因此字符串是在外部定义的),
“\n”
将被解释为两个字符:
'\'
'n'
。您必须用换行符替换这两个字符,因为要匹配
'\'
,您必须用
'\'
对其进行转义:

System.out.println(args[0].replace("\\n", "\n"));

出于可移植性考虑,您还可以使用
System.lineSeparator()
作为替换字符串。

显然,您不能立即执行此操作,但执行以下操作将获得所需的内容:

System.out.println(String.format(args[0]));
此处使用,新行作为新行的转换序列传递。(见附件)

因此,请使用

java Helloworld "hello%nnworld"
将打印

hello
workd
如果需要输出
%n
本身,则可以用另一个“%”引用“%”,即

java Helloworld "hello%%nnworld"
以上将打印:

hello%nnworld

如果您使用的是类似Unix的操作系统,如GNU/Linux或MacOS,或任何其他系统(如Windows上的Cygwin)上的Bash shell,则只需将命令行参数括在单引号中,您可以插入任意数量的换行符,它仍将被视为一个参数:

$ 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

[*]禁止Apache方法中任何剩余的bug。

@BrankVictoria我认为这不是问题所在-问题在于命令行参数如何到达java@Hulk你说得对,我不明白这个问题。控制台确实有可能格式化字符串。我的意思是,如果您输入“Hello\nHello”,args[0]包含的内容将是“Hello\\nHello”,您知道,现在我很好奇。。。我从来都不需要这样的东西。。。通常,当我需要新行作为参数时,我会使用一个包含我需要的所有属性的文件输入…如果您在任何系统上使用Linux或MacOS或Bash shell,那么您可以使用
java Helloworld“line oneline two”
其中
意味着您按下Enter键,使这两行显示在单独的行上。单引号将它们保留为单个参数。@DodgyCodeException正确,您是唯一真正理解问题的人!所有的答案都是试图在伤害已经造成之后修复它。问题更多的是将换行符作为参数传递给您的程序,而不是特定的程序或Java。答案很好,但请注意,您提出的解决方案意味着用户将永远无法将两个字符“\n”作为参数传递。如果您的参数包含
”\n应解释为换行符的
,以及应保留为两个字符的
“\n”,那么您应该找到更好的解决方案。也就是说,使用多个参数,或者用Java定义字符串。此解决方案将用户输入的
Hello\\nHello
替换为
Hello\

Hello
,也就是说,用户仍然无法转义“神奇反斜杠”。这是一种很有技巧的做法,如果用户需要,无法转义换行字符,会导致问题。是的,Alex,有时用户可能希望使用“\n”,有时用户可能希望使用换行符。一个好的系统(如多奇的答案所示)将允许这两种情况。你是对的,我想有多种方法可以解释最初的问题。我在Java端给出了一个变通方法(没有额外的库),DodgyCodeException在shell端给出了一个变通方法。我更新了我的答案以反映这一点。
System.out.printf(“%s%n”,args[0])逐字打印命令行参数(即,它将打印“Hello%nworld”)。大概您的意思是
System.out.printf(args[0]).yes,因为它被解释为format和String。如果遇到格式化序列,format将需要一个参数。实际上,在这种情况下,参数应该作为文件传递,或者让应用程序从stdin读取。我首先想到的是与您相同的答案,但有一个不必要的副作用:如果有人用
Hello%sHello
或类似的方式调用该程序,该程序将抛出异常。我认为
%n
\n
好,但我不同意让用户为
printf
String.format
键入输入。这是一个很好的答案,因为它是通用的!如果您现在将上面的评论考虑在内(真正的问题是您将字母
`和
n`作为参数传递,根本不会有问题,如果您对程序的shell调用已经正确解释了
\n
),那就太完美了@马斯托夫感谢;完成。@mastov+许多shell(至少
ksh bash zsh
)可以用“ANSI-C报价”(dollarsign然后quotemark)来完成,比如
java HelloWorld$'line one\nline two'
,或者如果你需要更好的控制,比如
java HelloWorld“hey nonny$var1”$\n''ibble gibble$var2”
@dave\u thompson\u 085谢谢你,我知道。但重要的信息是:以某种方式接受换行符实际上是shell的任务。在损害发生后在Java中摆弄字符串主要是治愈症状,并且会让许多pro用户感到困惑
import static org.apache.commons.text.StringEscapeUtils.unescapeJava;

public class Helloworld {

    public static void main(String[] args) {
        System.out.println(unescapeJava(args[0]));
    }

}