Как использовать аргумент разрыва строки

Я написал самый простой 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. Как получить результат из двух строк?

Ответ 1

РЕДАКТИРОВАТЬ: Этот ответ для исходного вопроса, понимаемого как

Почему, когда я пишу Hello\nHello на Java, а затем распечатываю его, я получаю две строки текста, но когда я пишу Hello\nHello в своем терминале и Hello\nHello его моей программе Java в качестве аргумента, я получаю одну строку текста?

Если ты имеешь ввиду

Есть ли способ передать один строковый аргумент моей Java-программе, которая печатается в несколько строк?

смотрите ответ @DodgyCodeException, который лучше подходит для этой формулировки.


Когда вы определяете String как "Hello\nHello" в Java, она не содержит символа '\'. Это escape-последовательность для перевода строки: "\n" - это всего лишь один символ. Однако, когда вы используете эту строку в качестве аргумента для вашей программы (поэтому строка определяется снаружи), "\n" интерпретируется как два символа: '\' и 'n'. Вы должны заменить эти два символа разрывом строки, зная, что для соответствия '\' вы должны экранировать его с помощью '\':

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

Что касается переносимости, вы также можете использовать System.lineSeparator() в качестве строки замены.

Ответ 2

Если вы используете Unix-подобную ОС, такую как GNU/Linux или MacOS, или оболочку Bash в любой другой системе (например, Cygwin в Windows), просто добавьте аргумент командной строки в одинарные кавычки, и вы можете вставить любые количество новых строк и все равно будет рассматриваться как один аргумент:

$ 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 Command Processor по умолчанию (cmd.exe). В этом случае вы можете использовать следующую технику.

Вы можете использовать метод StringEscapeUtils.unescapeJava из Apache Commons Text. Затем вы сможете передавать аргументы командной строки и интерпретировать их точно как [*] как литеральную строку в исходном коде:

import static org.apache.commons.text.StringEscapeUtils.unescapeJava;

public class Helloworld {

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

}

[*] Запрет любых оставшихся ошибок в методе Apache.

Ответ 3

Видимо, вы не можете сделать это сразу, но следующий трюк даст вам то, что вам нужно:

System.out.println(String.format(args[0]));

Здесь используется формат String #, и новая строка передается как последовательность преобразования для новой строки. (см. синтаксис строки формата).

Поэтому вызовите свою программу с помощью

java Helloworld "hello%nnworld"

распечатает

hello
workd

и если вам нужно вывести %n, тогда вы можете процитировать '%' с другим '%', т.е.

java Helloworld "hello%%nnworld"

Вышеприведенное будет печатать:

hello%nnworld