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