Ich komme aus Perl und vermisse sicher die "Here-Document" -Methode zum Erstellen einer mehrzeiligen Zeichenfolge im Quellcode:
$string = <<"EOF" # create a three-line string
text
text
text
EOF
In Java muss ich umständliche Anführungszeichen und Pluszeichen in jeder Zeile haben, wenn ich meine mehrzeilige Zeichenfolge von Grund auf verkette.
Was sind bessere Alternativen? Meine Zeichenfolge in einer Eigenschaftendatei definieren?
Bearbeiten : Zwei Antworten besagen, dass StringBuilder.append () der Plus-Notation vorzuziehen ist. Könnte jemand erläutern, warum er so denkt? Es sieht für mich überhaupt nicht besser aus. Ich suche nach einem Weg, um die Tatsache zu umgehen, dass mehrzeilige Zeichenfolgen kein erstklassiges Sprachkonstrukt sind, was bedeutet, dass ich ein erstklassiges Sprachkonstrukt (Zeichenfolgenverkettung mit Plus) definitiv nicht durch Methodenaufrufe ersetzen möchte.
Bearbeiten : Um meine Frage weiter zu klären, mache ich mir überhaupt keine Sorgen um die Leistung. Ich mache mir Sorgen um Wartbarkeit und Designprobleme.
string1 + string2
ein neues Zeichenfolgenobjekt zuweisen und die Zeichen aus beiden Eingabezeichenfolgen kopieren. Wenn Sie n Strings addieren, führen Sie n-1 Zuweisungen und ungefähr (n ^ 2) / 2 Zeichenkopien durch. StringBuilder hingegen kopiert und ordnet weniger häufig neu zu (obwohl es immer noch beides tut, wenn Sie die Größe seines internen Puffers überschreiten). Theoretisch gibt es Fälle, in denen der Compiler + konvertieren könnte, um StringBuilder zu verwenden, aber in der Praxis, wer weiß.Antworten:
Stephen Colebourne hat einen Vorschlag zum Hinzufügen mehrzeiliger Zeichenfolgen in Java 7 erstellt.
Außerdem unterstützt Groovy bereits mehrzeilige Zeichenfolgen .
quelle
Es hört sich so an, als ob Sie ein mehrzeiliges Literal erstellen möchten, das in Java nicht vorhanden ist.
Ihre beste Alternative werden Saiten sein, die nur
+
zusammen passen. Einige andere Optionen, die bereits erwähnt wurden (StringBuilder, String.format, String.join), sind nur vorzuziehen, wenn Sie mit einem Array von Zeichenfolgen begonnen haben.Bedenken Sie:
Versus
StringBuilder
:Versus
String.format()
:Versus Java8
String.join()
:Wenn Sie das Newline für Ihr spezielles System wollen, müssen Sie entweder die Verwendung
System.lineSeparator()
oder Sie verwenden können ,%n
inString.format
.Eine andere Möglichkeit besteht darin, die Ressource in eine Textdatei einzufügen und nur den Inhalt dieser Datei zu lesen. Dies ist für sehr große Zeichenfolgen vorzuziehen, um ein unnötiges Aufblähen Ihrer Klassendateien zu vermeiden.
quelle
String.format
Version ist, dass Sie das Format mit der Anzahl der Zeilen synchron halten müssen.Wenn Sie in Eclipse die Option "Escape-Text beim Einfügen in ein Zeichenfolgenliteral" aktivieren (unter Einstellungen> Java> Editor> Eingabe) und eine mehrzeilige Zeichenfolge in Anführungszeichen einfügen, wird automatisch
"
und\n" +
für alle Ihre Zeilen hinzugefügt .quelle
\r
s, das Eclipse unter Windows einfügt?Dies ist ein alter Thread, aber eine neue, recht elegante Lösung (mit nur 4 oder 3 kleinen Nachteilen) besteht darin, eine benutzerdefinierte Anmerkung zu verwenden.
Überprüfen Sie: http://www.adrianwalker.org/2011/12/java-multiline-string.html
Ein von dieser Arbeit inspiriertes Projekt wird auf GitHub gehostet:
https://github.com/benelog/multiline
Beispiel für Java-Code:
Die Nachteile sind
<%= variable %>
) enthalten :-)Und Sie müssen wahrscheinlich Eclipse / Intellij-Idea so konfigurieren, dass Ihre Javadoc-Kommentare nicht automatisch neu formatiert werden.
Man mag dies seltsam finden (Javadoc-Kommentare sind nicht dazu gedacht, etwas anderes als Kommentare einzubetten), aber da dieser Mangel an mehrzeiligen Zeichenfolgen in Java am Ende wirklich ärgerlich ist, finde ich dies die am wenigsten schlimmste Lösung.
quelle
Eine andere Möglichkeit kann darin bestehen, lange Zeichenfolgen in einer externen Datei zu speichern und die Datei in eine Zeichenfolge einzulesen.
quelle
@
Syntax für C # ist viel sauberer.Dies ist etwas, das Sie niemals verwenden sollten , ohne darüber nachzudenken, was es tut. Aber für einmalige Skripte habe ich dies mit großem Erfolg verwendet:
Beispiel:
Code:
quelle
String.join
Java 8 hat eine neue statische Methode hinzugefügt,
java.lang.String
die eine etwas bessere Alternative bietet:String.join( CharSequence delimiter , CharSequence... elements )
Es benutzen:
quelle
"\n"
wird kein Handbuch benötigt und ist sich der Portabilität bewusst!JEP 355: Textblöcke (Vorschau) soll diese Funktionalität abdecken. Derzeit wird JDK 13 als Vorschaufunktion verwendet. Erlauben, etwas zu schreiben wie:
Vor diesem JEP in JDK12 zielte JEP 326: Raw String Literals darauf ab, eine ähnliche Funktion zu implementieren, die jedoch endgültig zurückgezogen wurde.
quelle
Wenn Sie Ihre Zeichenfolgen in einer Eigenschaftendatei definieren, sieht es viel schlechter aus. IIRC, es wird aussehen wie:
Im Allgemeinen ist es eine vernünftige Idee, keine großen Zeichenfolgen in die Quelle einzubetten. Möglicherweise möchten Sie sie als Ressourcen laden, möglicherweise in XML oder einem lesbaren Textformat. Die Textdateien können entweder zur Laufzeit gelesen oder in eine Java-Quelle kompiliert werden. Wenn Sie sie am Ende in der Quelle platzieren, empfehle ich, die
+
an die Vorderseite zu setzen und unnötige neue Zeilen wegzulassen:Wenn Sie neue Zeilen haben, möchten Sie möglicherweise einige Verknüpfungs- oder Formatierungsmethoden:
quelle
Pluspunkte werden in StringBuilder.append konvertiert, außer wenn beide Zeichenfolgen Konstanten sind, damit der Compiler sie zur Kompilierungszeit kombinieren kann. Zumindest ist das in Suns Compiler so, und ich würde die meisten vermuten, wenn nicht alle anderen Compiler dasselbe tun würden.
Damit:
generiert normalerweise genau den gleichen Code wie:
Auf der anderen Seite:
ist das gleiche wie:
Das heißt, es gibt keine Strafe, wenn Sie Ihre String-Literale über mehrere Zeilen mit Pluszeichen für die Lesbarkeit aufteilen.
quelle
In der IntelliJ IDE müssen Sie nur Folgendes eingeben:
Positionieren Sie dann den Cursor innerhalb der Anführungszeichen und fügen Sie die Zeichenfolge ein. Die IDE erweitert es in mehrere verkettete Zeilen.
quelle
Leider verfügt Java nicht über mehrzeilige Zeichenfolgenliterale. Sie müssen entweder Zeichenfolgenliterale verketten (wobei + oder StringBuilder die beiden am häufigsten verwendeten Ansätze sind) oder die Zeichenfolge aus einer separaten Datei einlesen.
Bei großen mehrzeiligen Zeichenfolgenliteralen würde ich gerne eine separate Datei verwenden und diese mit
getResourceAsStream()
(einer Methode derClass
Klasse) einlesen . Dies erleichtert das Auffinden der Datei, da Sie sich keine Gedanken über das aktuelle Verzeichnis und den Installationsort Ihres Codes machen müssen. Dies erleichtert auch das Verpacken, da Sie die Datei tatsächlich in Ihrer JAR-Datei speichern können.Angenommen, Sie sind in einer Klasse namens Foo. Mach einfach so etwas:
Das einzige andere Ärgernis ist, dass Java nicht über die Standardmethode "Lesen Sie den gesamten Text dieses Readers in einen String" verfügt. Es ist allerdings ziemlich einfach zu schreiben:
quelle
Die beste Alternative ist jedoch die Verwendung von String.format
quelle
Da Java (noch) nicht native mehrzeilige Zeichenfolgen unterstützt, besteht die einzige Möglichkeit im Moment darin, sie mit einer der oben genannten Techniken zu umgehen. Ich habe das folgende Python-Skript mit einigen der oben genannten Tricks erstellt:
Fügen Sie dies in eine Datei mit dem Namen javastringify.py und Ihre Zeichenfolge in eine Datei mystring.txt ein und führen Sie sie wie folgt aus:
Sie können die Ausgabe dann kopieren und in Ihren Editor einfügen.
Ändern Sie dies nach Bedarf, um Sonderfälle zu behandeln, aber dies funktioniert für meine Anforderungen. Hoffe das hilft!
quelle
Sie können Scala-Code verwenden, der mit Java kompatibel ist und mehrzeilige Zeichenfolgen zulässt, die mit "" "eingeschlossen sind:
(Beachten Sie die Anführungszeichen in der Zeichenfolge) und aus Java:
Ob das bequemer ist ...?
Ein anderer Ansatz, wenn Sie häufig langen Text verarbeiten, der in Ihren Quellcode eingefügt werden sollte, könnte ein Skript sein, das den Text aus einer externen Datei entnimmt und wie folgt in einen mehrzeiligen Java-String umschließt:
damit Sie es einfach ausschneiden und in Ihre Quelle einfügen können.
quelle
Sie können Ihre Anhänge in einer separaten Methode verketten:
In beiden Fällen bevorzugen Sie
StringBuilder
die Plus-Notation.quelle
Das Folgende ist die sauberste Implementierung, die ich bisher gesehen habe. Es verwendet eine Anmerkung, um einen Kommentar in eine Zeichenfolgenvariable umzuwandeln ...
Das Endergebnis ist also, dass die Variable HTML die mehrzeilige Zeichenfolge enthält. Keine Anführungszeichen, keine Pluszeichen, keine Kommas, nur reine Zeichenfolge.
Diese Lösung ist unter der folgenden URL verfügbar ... http://www.adrianwalker.org/2011/12/java-multiline-string.html
Ich hoffe, das hilft!
quelle
Siehe Java Stringfier . Verwandelt Ihren Text in einen StringBuilder-Java-Block, der bei Bedarf ausgeblendet wird.
quelle
quelle
Eine Alternative, die ich noch nicht als Antwort gesehen habe, ist die
java.io.PrintWriter
.Auch die Tatsache, dass
java.io.BufferedWriter
es einenewLine()
Methode gibt, wird nicht erwähnt.quelle
Wenn Sie Googles Guave genauso mögen wie ich, kann dies eine ziemlich saubere Darstellung und eine schöne, einfache Möglichkeit bieten, auch Ihre Zeilenumbruchzeichen nicht fest zu codieren:
quelle
Verwenden Sie
Properties.loadFromXML(InputStream)
. Es sind keine externen Bibliotheken erforderlich.Besser als ein unordentlicher Code (da Wartbarkeit und Design Ihr Anliegen sind), ist es vorzuziehen, keine langen Zeichenfolgen zu verwenden.
Beginnen Sie mit dem Lesen der XML-Eigenschaften:
Dann können Sie Ihre mehrzeilige Zeichenfolge auf eine wartbarere Weise verwenden ...
MultiLine.xml` befindet sich im selben Ordner YourClass:
PS.: Sie können
<![CDATA["
..."]]>
für XML-ähnliche Zeichenfolgen verwenden.quelle
Mit JDK / 12 Early Access Build Nr. 12 können jetzt mehrzeilige Zeichenfolgen in Java wie folgt verwendet werden:
und dies führt zu folgender Ausgabe:
Bearbeiten: Auf Java 13 verschoben
quelle
Eine recht effiziente und plattformunabhängige Lösung wäre die Verwendung der Systemeigenschaft für Zeilentrennzeichen und der StringBuilder-Klasse zum Erstellen von Zeichenfolgen:
quelle
Eine gute Option.
quelle
Java 13 und darüber hinaus
Mehrzeilige Zeichenfolgen werden jetzt in Java über Textblöcke unterstützt . In Java 13 und 14 müssen Sie für diese Funktion die Einstellungen vornehmen
––enable–preview
Option wenn Sie Ihr Projekt erstellen und ausführen. Weitere Informationen finden Sie in dieser Java-Dokumentation .Vor Java 13 schreiben Sie eine Abfrage folgendermaßen:
Dank Java 13-Textblöcken können Sie diese Abfrage wie folgt umschreiben:
Viel lesbarer, oder?
IDE-Unterstützung
IntelliJ IDEA bietet Unterstützung für die Umwandlung älterer
String
Verkettungsblöcke in das neue mehrzeiligeString
Format:JSON, HTML, XML
Die mehrzeilige
String
ist besonders nützlich, wenn Sie JSON, HTML oder XML schreiben.Betrachten Sie dieses Beispiel mithilfe der
String
Verkettung, um ein JSON-Zeichenfolgenliteral zu erstellen:Sie können den JSON aufgrund der entweichenden Zeichen und der Fülle an doppelten Anführungszeichen und Pluszeichen kaum lesen.
Mit Java-Textblöcken kann das JSON-Objekt folgendermaßen geschrieben werden:
Seit ich 2004 C # verwendet habe, wollte ich diese Funktion in Java haben, und jetzt haben wir sie endlich.
quelle
Mehrzeilige Zeichenfolgen sind in Eigenschaftendateien nicht zulässig. Sie können \ n in Eigenschaftendateien verwenden, aber ich denke nicht, dass dies in Ihrem Fall eine gute Lösung ist.
quelle
Ich weiß, dass dies eine alte Frage ist, aber für interessierte Entwickler werden mehrzeilige Literale in # Java12 sein
http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html
quelle
Ich schlage vor, ein von ThomasP vorgeschlagenes Dienstprogramm zu verwenden und dieses dann mit Ihrem Erstellungsprozess zu verknüpfen. Es ist noch eine externe Datei vorhanden, die den Text enthält, aber die Datei wird zur Laufzeit nicht gelesen. Der Workflow lautet dann:
class TextBlock {...
gefolgt von einer statischen Zeichenfolge, die automatisch aus der Ressourcendatei generiert wirdquelle
Wenn eine lange Reihe von + verwendet wird, wird nur ein StringBuilder erstellt, es sei denn, der String wird zur Kompilierungszeit festgelegt. In diesem Fall wird kein StringBuilder verwendet!
StringBuilder ist nur dann effizienter, wenn mehrere Anweisungen zum Erstellen des Strings verwendet werden.
Hinweis: Es wird nur ein StringBuilder erstellt.
Machen Sie es so klar und einfach wie möglich.
quelle