Получение многострочного ввода и объединение его в единую строку для выполнения чего-либо в консольном приложении Java

#java #console-application #stringbuilder

#java #консольное приложение #stringbuilder

Вопрос:

Конечная цель — взять многострочный пользовательский ввод и объединить все это в одну строку, которую можно использовать позже в моем коде. Когда я использую приведенный ниже код, каждая отдельная строка печатается идеально в качестве выходных данных. Однако, когда я использую закомментированный код, мой конечный результат неверен.

 System.out.println("Enter a string: ");

StringBuilder sb1 = new StringBuilder();
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
    System.out.println(scanner.nextLine());
    // String line = scanner.nextLine();
    // sb1.append(line);
}

// System.out.println(sb1.toString());
  

Ответ №1:

Я предполагаю, что вы хотите новую строку после каждого ввода, поэтому после

sb1.append(line);

Добавить

sb1.append(System.getProperty("line.separator"));

Редактировать: (потому что я не знаю, как размещать код в комментариях) В основном это будет продолжать запрашивать ввод до тех пор, пока пользователь не введет «exit», который затем выйдет из цикла while и распечатает строку. Вы можете добавить запятые или пробелы, чтобы разделить их после добавления строки.

Я не уверен, была ли ваша первоначальная проблема в том, что вы не выходили из цикла, или потому, что вы дважды вызывали nextLine print и назначали его line

     public static void main(String[] args) {
        System.out.println("Enter a string: ");
        StringBuilder sb = new StringBuilder();
        try (Scanner scanner = new Scanner(System.in)) {
            String input;
            while (!(input = scanner.nextLine()).equals("exit")) {
                sb.append(input);
            }
        }
        System.out.println(sb.toString());
    }
  

Комментарии:

1. Моя цель — принять все строки и объединить их в одну строку. Которое будет использоваться в другом месте моего кода.

2. @BlakeRivell Хм, то, что я опубликовал с тем, что вы объединили, должно дать вам строку с вводом новую строку после каждого ввода, который, насколько я понимаю, является тем, что вы хотите?

3. Я не хочу сохранять строки. Я хочу, чтобы это была однострочная строка.

4. @BlakeRivell Ну, не совсем уверен, какой формат вы хотите, но посмотрите на основной пост еще раз

5. ваш ответ — это именно то, что я пытался в своем посте. Если вы запустите код, он даже не примет пользовательский ввод, он просто отключится. С какой проблемой я сталкиваюсь. Возможно, это потому, что я использую Java 12… Я не знаю.

Ответ №2:

Вы можете попробовать это.

 private static String readFile(String pathname) throws IOException {

 File file = new File(pathname);
    StringBuilder fileContents = new StringBuilder((int)file.length());        

    try (Scanner scanner = new Scanner(file)) {
        while(scanner.hasNextLine()) {
            fileContents.append(scanner.nextLine() );
        }
        return fileContents.toString();
    }
}
  

Этот код будет считывать все строки из текстового файла и выдавать нам в виде одной строки в качестве возвращаемого объекта.

Комментарии:

1. Я не читаю здесь из файла. Я читаю пользовательский ввод в консольном приложении.

Ответ №3:

Ниже приводится pom.xml файл для вашей справки:

 <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                        http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>json_example</groupId>
  <artifactId>json_example</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <dependency>
        <groupId>javax.json</groupId>
        <artifactId>javax.json-api</artifactId>
        <version>1.1.4</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.1.4</version>
    </dependency>
  </dependencies>
</project>
  

Затем добавьте зависимые от maven файлы jar в свой classpath.

 import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;

public static void main(String[] args) {
    System.out.println("Enter a valid JSON string: ");

    try (// Create JsonReader from Json.
        JsonReader reader = Json.createReader(System.in)) {
        // Get the JsonObject structure from JsonReader.
        JsonObject jsonObj = reader.readObject();
        System.out.println(jsonObj.toString());
    } catch (Exception e) {
        e.printStackTrace();
    }

}
  

Комментарии:

1. Я запускаю debug в IntelliJ и вставляю многострочную строку json, затем нажимаю enter, и независимо от того, сколько раз нажимаю enter, ничего не происходит. Но я попробую ваш код завтра.

2. Возможно, это не очень хорошая идея, чтобы пользователь вставлял форматированный Json в консольное приложение, и я должен делать это по-другому, например, указывать на файл или что-то в этом роде. Но это должно быть возможно, верно? Моя конечная цель — передать введенный пользователем форматированный json в окончательный JsonParser parser = Json.createParser(новый StringReader(userJsonStr)); Перед передачей его сюда мне нужно удалить все пробелы и все разрывы строк. В противном случае анализатор выдаст ошибку.

3. Я думаю, что ввод Json в консольном приложении был бы просто для тестирования и отладки.