如何使用换行符参数

kk *_*luo 15 java

我写了最简单的Hello,World!应用:

public class Helloworld {

    public static void main(String[] args) {
        System.out.println("Hello\nHello");
    }
}
Run Code Online (Sandbox Code Playgroud)

运行时,结果是:

Hello
Hello
Run Code Online (Sandbox Code Playgroud)

但如果我Hello\nHello用作参数,

public class Helloworld {

    public static void main(String[] args) {
        System.out.println(args[0]);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是Hello\nHello.如何获得两行结果?

Ale*_*x M 14

编辑:这个答案是针对原来的问题理解为

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

如果你的意思是

有没有办法将一个字符串参数传递给我的java程序,它在多行上打印?

请参阅@ DodgyCodeException的答案,它更适合该配方.


在Java中定义Stringas "Hello\nHello"时,它不包含任何'\'字符.它是换行符的转义序列:"\n"只是一个字符.但是,当您使用此字符串作为程序的参数时(因此字符串在外部定义),将"\n"被解释为两个字符:'\''n'.你必须用换行符替换这两个字符,知道要匹配'\'你必须用它来逃避它'\':

System.out.println(args[0].replace("\\n", "\n"));
Run Code Online (Sandbox Code Playgroud)

对于可移植性问题,您还可以使用System.lineSeparator()替换字符串.

  • 很好的答案,但请注意,您提出的解决方案意味着用户将再也无法将两个字符"\n"作为参数传递. (3认同)
  • 这个解决方案将用'Hello \````Hello`替换用户输入`Hello \\nHello`,即用户仍然无法逃脱"魔法反斜杠". (2认同)

Dod*_*ion 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
Run Code Online (Sandbox Code Playgroud)

这不适用于默认的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]));
    }

}
Run Code Online (Sandbox Code Playgroud)

[*]禁止Apache方法中的任何剩余错误.


A4L*_*A4L 6

显然你不能马上做到,但做下面的技巧会得到你所需要的:

System.out.println(String.format(args[0]));
Run Code Online (Sandbox Code Playgroud)

这里使用String#format ,新行作为新行的转换序列传递.(请参阅格式字符串语法).

所以用你的程序打电话

java Helloworld "hello%nnworld"
Run Code Online (Sandbox Code Playgroud)

将打印

hello
workd
Run Code Online (Sandbox Code Playgroud)

如果你需要输出%n自己,那么你可以引用'%'和另一个'%'即

java Helloworld "hello%%nnworld"
Run Code Online (Sandbox Code Playgroud)

以上将打印:

hello%nnworld
Run Code Online (Sandbox Code Playgroud)

  • 我第一次想到和你一样的答案,但是有一个不必要的副作用:如果有人用'Hello%sHello`或类似的方法调用程序,程序将抛出异​​常.我认为`%n`比`\n`更好但我不同意让用户输入`printf`或`String.format`的输入 (2认同)