Java - Comment saisir plusieurs Lignes de Texte en Une seule entrée


J'écris actuellement un programme en Java dans lequel j'ai besoin d'obtenir une entrée de l'utilisateur, qui est un morceau de texte. Cependant, j'ai besoin que l'utilisateur puisse entrer plusieurs paragraphes de texte en une seule fois. Cela serait réalisé en collant simplement dans tout le morceau de texte lorsque l'entrée est demandée par le programme. J'utilise le scanner pour l'entrée, et au moment où je colle plusieurs paragraphes dans l'entrée, aucune erreur n'est générée cependant chaque fois que j'imprime la variable dans lequel le texte a été stocké, seule la première section (avant le premier saut de ligne) est sortie. Comment puis-je stocker l'intégralité du texte avec plusieurs sauts de ligne sans demander à l'utilisateur des entrées individuelles pour chaque bloc de texte?

J'ai déjà du code mais il ne gère pas plusieurs lignes:

import java.util.*;

public class ReWrite {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Please paste the essay to be re-written >> ");
    String originalEssay = scanner.nextLine();
    System.out.println(originalEssay);
    System.out.println("I hope that was your essay...");
  }
}
Author: juanotto, 2019-11-13

4 answers

Vous devez avoir un moyen pour l'utilisateur d'indiquer quand il a fini de saisir des données.

Jusqu'à ce que cela se produise, prenez la dernière ligne d'entrée et enregistrez-la. Commencez par une chaîne vide et ajoutez chaque ligne de texte saisi jusqu'à ce que l'utilisateur indique avec un ensemble de caractères prédéterminé qu'il a terminé.

 2
Author: LowKeyEnergy, 2019-11-13 21:52:01

Généralement, vous ne devriez pas essayer d'entrer des morceaux entiers de texte à partir de la ligne de commande. Cependant, si vous voulez lire un texte aussi volumineux, vous pouvez utiliser un BufferedReader et simplement lire jusqu'à la fin du flux. La fin du flux est atteinte lorsque EOF est rencontré. Sur de nombreux systèmes EOF peut être généré en appuyant sur Control-D (mais vous pouvez indiquer qu'un utilisateur).

Le gros avantage de l'utilisation d'une telle méthode générique est que vous pouvez également utiliser divers utilitaires fournis par le système d'exploitation pour pipe un fichier dans votre application.

Un inconvénient est que ce n'est pas une bonne idée de mélanger cela avec un Scanner; évidemment, le scanner est inutile après l'EOF, et l'utiliser avant le texte signifie probablement que le scanner récupère une partie du texte. La fermeture du scanner fermera également le flux d'entrée auquel il est connecté. Un scanner doit souvent regarder vers l'avenir pour voir où un jeton se termine, et il peut avoir à lire dans le texte pour pouvoir le faire.

StringBuilder sb = new StringBuilder();

try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
    CharBuffer buffer = CharBuffer.allocate(1024);

    while (reader.read(buffer) != -1) {
        buffer.flip();
        sb.append(buffer);
        buffer.clear();
    }
}
System.out.printf("Read %d characters", sb.length());

Je n'ai pas fourni de caractère encodage. Pour de telles applications, le codage des caractères de la plate-forme devrait très bien fonctionner.

 2
Author: Maarten Bodewes, 2019-11-14 16:45:30
import java.util.*;

public class ReWrite {
    public static void main(String[] args){

        Scanner scanner = new Scanner(System.in);

        System.out.println("Please paste the essay to be re-written >> ");

        String originalEssay = "";

        System.out.println();

        while(scanner.hasNextLine()){
             originalEssay += scanner.nextLine();
             originalEssay += "\n";
        }

        System.out.println(originalEssay);
        System.out.println("I hope that was your essay...");
    }
}

Vous avez besoin du programme ci-dessus. Vous devez vous assurer que vous vérifiez s'il y a d'autres "lignes" dans l'entrée. Vous le faites en utilisant hasWhileNext (). Espérons que cette aide!

 0
Author: spinyBabbler, 2019-11-13 22:04:39

Vous avez besoin d'un moyen de savoir que l'utilisateur a terminé avec son entrée. J'ai fait un petit exemple avec LE-END comme marqueur (ouais, original n'est-ce pas?)

import java.util.Scanner;

public class DocReader {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder strBuilder = new StringBuilder();

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (!line.equals("THE-END")) {
                strBuilder.append(line + System.lineSeparator());
            } else {
                break;
            }
        }
        System.out.println(strBuilder.toString());
        scanner.close();
    }
}

Cela ajoute un séparateur de ligne supplémentaire à la fin, facile à résoudre si nécessaire. Il serait probablement préférable d'utiliser plusieurs pauses comme marqueur de fin (certains protocoles basés sur du texte le font), par exemple, l'utilisateur appuie 3 fois sur entrée. Cela signifierait qu'ils ne peuvent pas avoir deux lignes vides, donc assez dépendant du cas d'utilisation.

 0
Author: juanotto, 2019-11-13 22:23:47