Comment ajouter une nouvelle ligne à StringBuilder


234

J'ai un StringBuilderobjet,

StringBuilder result = new StringBuilder();
result.append(someChar);

Maintenant, je veux ajouter un caractère de nouvelle ligne au StringBuilder. Comment puis-je le faire?

result.append("/n"); 

Ne marche pas. Donc, je pensais à écrire une nouvelle ligne en utilisant Unicode. Est-ce que cela vous aidera? Si oui, comment puis-je en ajouter un?


23
Je pensais que oui "\n", ou System.getProperty("line.separator").
Alvin Wong

Un retour à la ligne n'est pas nécessairement un caractère LINE FEED (LF) (Ascii / Unicode 10). Comme l'indique la bonne réponse , en Java, vous pouvez en obtenir un (LINE FEED ou un saut de ligne spécifique à la plate-forme).
Basil Bourque

Réponses:


510

Ça devrait être

r.append("\n");

Mais je vous recommande de faire comme ci-dessous,

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

System.getProperty("line.separator")vous offre une nouvelle ligne dépendante du système en java. De Java 7, il existe également une méthode qui renvoie directement la valeur:System.lineSeparator()


87
+1 pour le raccourci System.lineSeparator. La plus grande question est de savoir pourquoi il n'y a pas de StringBuilder#appendLine()méthode.
Patrick M

14
System.lineSeparator()la documentation mentionne "Renvoie la chaîne de séparateur de ligne dépendante du système.". Ce n'est pas indépendant de la plateforme. Utilisez ce code si vous devez écrire une chaîne qui sera utilisée par le système d'exploitation sous-jacent, sinon utilisez '\n'.
tuscland

2
@tuscland - Pourquoi ne pas simplement utiliser System.lineSeparator () tout le temps? Pourquoi '\ n' est-il une meilleure option par défaut?
RyanfaeScotland

16
Non, System.lineSeparator()doit être utilisé lorsque vous traitez avec des ressources non portables (c'est-à-dire des ressources spécifiques au système d'exploitation sous-jacent). Il a une valeur différente selon que vous exécutez Java sur Windows (\ r \ n) ou Unix (\ n). Si vous utilisez System.lineSeparator()tout le temps, vous produirez donc des fichiers non portables.
tuscland

6
Incroyable, il n'y a pas déjà de appendLinesurcharge StringBuilder.
Josh M.

22

Une autre option consiste à utiliser Apache Commons StrBuilder, qui possède les fonctionnalités qui manquent dans StringBuilder.

StrBuilder.appendLn ()

Depuis la version 3.6, StrBuilder est déconseillé au profit de TextStringBuilder qui a les mêmes fonctionnalités


5
... et depuis Java 8 il y a StringJoiner , qui " est utilisé pour construire une séquence de caractères séparés par un délimiteur et commençant éventuellement par un préfixe fourni et se terminant par un suffixe fourni. " L'utilisation de "\ n" comme délimiteur entraînerait de nouveaux (sauf pour la dernière). En interne, il utilise un StringBuilder. La même approche pourrait être réalisée à l'aide de Google Guava Joiner, je suppose.
jechterhoff

1
... et maintenant c'est le cas deprecated. Veuillez utiliser org.apache.commons.text.TextStringBuilder.
Ashok MA

16

L'évasion devrait être faite avec \, non /.

Alors r.append('\n');ou ça r.append("\n");marchera ( StringBuildera surchargé les méthodes charet le Stringtype).



2

Je crée une classe originale similaire à StringBuidler et je peux ajouter une ligne en appelant la méthode appendLine (String str).

public class StringBuilderPlus {

    private StringBuilder sb;

    public StringBuilderPlus(){
         sb = new StringBuilder();
    }

    public void append(String str)
    {
        sb.append(str != null ? str : "");
    }

    public void appendLine(String str)
    {
        sb.append(str != null ? str : "").append(System.getProperty("line.separator"));
    }

    public String toString()
    {
        return sb.toString();
    }
}

Usage:

StringBuilderPlus sb = new StringBuilderPlus();
sb.appendLine("aaaaa");
sb.appendLine("bbbbb");
System.out.println(sb.toString());

Console:

aaaaa
bbbbb

1

Vous pouvez également utiliser le caractère séparateur de ligne dans String.format(Voirjava.util.Formatter ), qui est également indépendant de la plate-forme.

c'est à dire:

result.append(String.format("%n", ""));

Si vous devez ajouter plus d'espaces de ligne, utilisez simplement:

result.append(String.format("%n%n", ""));

Vous pouvez également utiliser StringFormatpour formater votre chaîne entière, avec un ou des sauts de ligne à la fin.

result.append(String.format("%10s%n%n", "This is my string."));

0

Pour Kotlin,

StringBuilder().appendln("your text");

Bien qu'il s'agisse d'une question java, c'est également le premier résultat google pour kotlin, qui pourrait être utile.


La question est étiquetée sous "java". Pas besoin de poster une solution qui n'est même pas pour la langue liée à la question.
chntgomez

@chntgomez J'ai cherché un moyen d'ajouter une nouvelle ligne à StringBuilder dans Kotlin et
j'ai

0

En plus de la réponse de KS de créer une classe StringBuilderPlus et d'utiliser le modèle d'adaptateur pour étendre une classe finale, si vous utilisez des génériques et renvoyez l'objet StringBuilderPlus dans les nouvelles méthodes append et appendLine, vous pouvez utiliser les StringBuilders de nombreuses méthodes d'ajout pour tous les types différents, tout en reprenant la possibilité de chaîne de chaîne plusieurs commandes d'ajout ensemble, comme indiqué ci-dessous

public class StringBuilderPlus {

    private final StringBuilder stringBuilder;

    public StringBuilderPlus() {
        this.stringBuilder = new StringBuilder();
    }

    public <T> StringBuilderPlus append(T t) {
        stringBuilder.append(t);
        return this;
    }

    public <T> StringBuilderPlus appendLine(T t) {
        stringBuilder.append(t).append(System.lineSeparator());
        return this;
    }

    @Override
    public String toString() {
        return stringBuilder.toString();
    }

    public StringBuilder getStringBuilder() {
        return stringBuilder;
    }
}

vous pouvez ensuite l'utiliser exactement comme la classe StringBuilder d'origine:

StringBuilderPlus stringBuilder = new StringBuilderPlus();
stringBuilder.appendLine("test")
    .appendLine('c')
    .appendLine(1)
    .appendLine(1.2)
    .appendLine(1L);

stringBuilder.toString();

-2

Pour Android , utilisez ceci pour lire et écrire!

private void writeToFile(String message) {
        try {
            OutputStream outputStream = openFileOutput("todoList.txt",Context.MODE_PRIVATE);
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
            outputStreamWriter.write(message);
            outputStreamWriter.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String readFromFile() throws IOException {

        String result = "";
        InputStream inputStream = openFileInput("todoList.txt");

        if (inputStream != null) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String tempString = "";
            StringBuilder stringBuilder = new StringBuilder();

            while ( (tempString = bufferedReader.readLine()) != null ) {

                stringBuilder.append(tempString);
                stringBuilder.append("\n");
            }
            inputStream.close();
            result = stringBuilder.toString();
        }
        return result;
    }

1
Ce n'est même pas une réponse à la question
chntgomez
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.