Pochodząc z Perla, na pewno brakuje mi środka „tutaj-dokument” do tworzenia ciągu wieloliniowego w kodzie źródłowym:
$string = <<"EOF" # create a three-line string
text
text
text
EOF
W Javie muszę mieć nieporęczne cytaty i znaki plus w każdym wierszu, kiedy odkładam mój ciąg multilinii od zera.
Jakie są lepsze alternatywy? Zdefiniować mój ciąg w pliku właściwości?
Edycja : Dwie odpowiedzi mówią, że StringBuilder.append () jest lepsza niż notacja plus. Czy ktoś mógłby wyjaśnić, dlaczego tak uważa? Nie wygląda mi to wcale lepiej. Szukam sposobu na obejście faktu, że ciągi wielowierszowe nie są konstrukcją języka pierwszej klasy, co oznacza, że zdecydowanie nie chcę zastępować konstrukcji języka pierwszej klasy (konkatenacji ciągów z plusem) wywołaniami metod.
Edycja : Aby wyjaśnić moje pytanie, w ogóle nie martwię się o wydajność. Martwię się o problemy związane z utrzymaniem i projektowaniem.
string1 + string2
przydzielasz nowy obiekt ciągu i kopiujesz znaki z obu ciągów wejściowych. Jeśli dodajesz n Ciągów razem, będziesz robił alokacje n-1 i około (n ^ 2) / 2 znaków kopii. Z drugiej strony StringBuilder kopiuje i realokuje rzadziej (choć nadal działa zarówno po przekroczeniu rozmiaru bufora wewnętrznego). Teoretycznie istnieją przypadki, w których kompilator może przekonwertować +, aby użyć StringBuilder, ale w praktyce kto wie.Odpowiedzi:
Stephen Colebourne stworzył propozycję dodania ciągów wieloliniowych w Javie 7.
Ponadto Groovy ma już obsługę ciągów wieloliniowych .
źródło
Wygląda na to, że chcesz zrobić wielowierszowy literał, który nie istnieje w Javie.
Najlepszą alternatywą będą ciągi, które są po prostu
+
razem. Niektóre inne opcje, o których wspominali ludzie (StringBuilder, String.format, String.join) byłyby preferowane tylko, jeśli zacząłeś od tablicy ciągów.Rozważ to:
Kontra
StringBuilder
:Kontra
String.format()
:Versus Java8
String.join()
:Jeśli chcesz nową linię dla swojego konkretnego systemu, musisz albo użyć
System.lineSeparator()
, albo możesz użyć%n
wString.format
.Inną opcją jest umieszczenie zasobu w pliku tekstowym i po prostu odczytanie zawartości tego pliku. Byłoby to preferowane w przypadku bardzo dużych ciągów, aby uniknąć niepotrzebnego wzdęcia plików klas.
źródło
String.format
wersją polega na tym, że format musi być zsynchronizowany z liczbą wierszy.W Eclipse, jeśli włączysz opcję „Escape tekstu podczas wklejania do literału ciągów” (w Preferencje> Java> Edytor> Pisanie) i wkleisz ciąg wielu wierszy z cudzysłowami, automatycznie doda
"
i\n" +
dla wszystkich twoich wierszy.źródło
\r
co Eclipse wprowadza w systemie Windows?Jest to stary wątek, ale nowym dość eleganckim rozwiązaniem (z tylko 4, może 3 małymi wadami) jest użycie niestandardowej adnotacji.
Sprawdź: http://www.adrianwalker.org/2011/12/java-multiline-string.html
Projekt zainspirowany tą pracą jest hostowany na GitHub:
https://github.com/benelog/multiline
Przykład kodu Java:
Wady są
<%= variable %>
) :-)Prawdopodobnie musisz skonfigurować Eclipse / Intellij-Idea, aby nie formatował automatycznie swoich komentarzy Javadoc.
Może się to wydawać dziwne (komentarze Javadoc nie mają na celu osadzania niczego poza komentarzami), ale ponieważ ten brak ciągów wielowierszowych w Javie jest naprawdę denerwujący, uważam to za najgorsze rozwiązanie.
źródło
Inną opcją może być przechowywanie długich ciągów w pliku zewnętrznym i wczytywanie pliku do ciągu.
źródło
@
Składni dla C # jest znacznie czystszy.Jest to coś, czego nigdy nie powinieneś używać bez myślenia o tym, co robi. Ale w przypadku skryptów jednorazowych wykorzystałem to z wielkim sukcesem:
Przykład:
Kod:
źródło
String.join
Java 8 dodała nową metodę statyczną,
java.lang.String
która oferuje nieco lepszą alternatywę:String.join( CharSequence delimiter , CharSequence... elements )
Użyj tego:
źródło
"\n"
jest wymagana żadna instrukcja i jest świadomy przenośności!JEP 355: Bloki tekstowe ( wersja zapoznawcza) ma na celu pokrycie tej funkcjonalności, obecnie jest ukierunkowane na JDK 13 jako funkcję podglądu. Pozwalając napisać coś takiego:
Poprzednio do tego JEP, w JDK12, JEP 326: Raw String Literals miał na celu implementację podobnej funkcji, ale ostatecznie został wycofany.
źródło
Jeśli zdefiniujesz swoje ciągi w pliku właściwości, będzie wyglądać znacznie gorzej. IIRC będzie wyglądać następująco:
Generalnie rozsądnym pomysłem jest nie osadzanie dużych łańcuchów w źródle. Możesz je załadować jako zasoby, być może w formacie XML lub czytelnym formacie tekstowym. Pliki tekstowe można odczytać w czasie wykonywania lub skompilować do źródła Java. Jeśli w końcu umieścisz je w źródle, sugeruję umieszczenie go
+
z przodu i pominięcie niepotrzebnych nowych wierszy:Jeśli masz nowe linie, możesz chcieć zastosować metodę łączenia lub formatowania:
źródło
Plusy są konwertowane na StringBuilder.append, z wyjątkiem sytuacji, gdy oba ciągi są stałymi, dzięki czemu kompilator może je łączyć w czasie kompilacji. Tak przynajmniej jest w kompilatorze Sun i podejrzewam, że większość, jeśli nie wszystkie inne kompilatory, zrobiłyby to samo.
Więc:
zwykle generuje dokładnie ten sam kod, co:
Z drugiej strony:
jest taki sam jak:
Oznacza to, że nie ma kary za łamanie literałów łańcuchowych w wielu wierszach ze znakami plus dla czytelności.
źródło
W IntelliJ IDE wystarczy wpisać:
Następnie umieść kursor w cudzysłowie i wklej ciąg. IDE rozwinie go do wielu połączonych linii.
źródło
Niestety Java nie ma wieloliniowych literałów łańcuchowych. Musisz albo połączyć literały łańcuchowe (używając + lub StringBuilder to dwa najczęstsze podejścia do tego), albo wczytać łańcuch z osobnego pliku.
W przypadku dużych wieloliniowych literałów łańcuchowych byłbym skłonny użyć osobnego pliku i odczytać go za pomocą
getResourceAsStream()
(metodaClass
klasy). Ułatwia to znalezienie pliku, ponieważ nie musisz martwić się o bieżący katalog w porównaniu z miejscem, w którym został zainstalowany kod. Ułatwia także pakowanie, ponieważ plik można zapisać w pliku jar.Załóżmy, że jesteś w klasie o nazwie Foo. Po prostu zrób coś takiego:
Inną irytacją jest to, że Java nie ma standardowej metody „odczytywania całego tekstu z tego czytnika do ciągu”. Jednak dość łatwo jest napisać:
źródło
Ale najlepszą alternatywą jest użycie String.format
źródło
Ponieważ Java nie obsługuje (jeszcze) natywnych ciągów wieloliniowych, jedynym sposobem na razie jest włamanie się do niego przy użyciu jednej z wyżej wymienionych technik. Zbudowałem następujący skrypt Pythona, korzystając z niektórych sztuczek wymienionych powyżej:
Umieść to w pliku o nazwie javastringify.py, a swój ciąg w pliku mystring.txt i uruchom w następujący sposób:
Następnie możesz skopiować wynik i wkleić go do edytora.
Zmodyfikuj to w razie potrzeby, aby obsłużyć specjalne przypadki, ale działa to na moje potrzeby. Mam nadzieję że to pomoże!
źródło
Możesz użyć kodu scala, który jest zgodny z Javą i pozwala na stosowanie ciągów wielowierszowych zawartych w „” „:
(zwróć uwagę na cytaty w ciągu) i z Java:
Czy to jest wygodniejsze ...?
Innym podejściem, jeśli często posługujesz się długim tekstem, który powinien być umieszczony w kodzie źródłowym, może być skrypt, który pobiera tekst z zewnętrznego pliku i otacza go jako ciąg multiline-java:
dzięki czemu możesz łatwo wyciąć i wkleić go do źródła.
źródło
Możesz połączyć swoje załączniki za pomocą osobnej metody, takiej jak:
Tak czy inaczej, wolisz
StringBuilder
notację plus.źródło
Tak naprawdę, to najczystsza implementacja, jaką do tej pory widziałem. Wykorzystuje adnotację do konwersji komentarza na zmienną łańcuchową ...
Zatem końcowy wynik jest taki, że zmienna html zawiera łańcuch wielowierszowy. Bez cudzysłowów, plusów, przecinków, po prostu czysty ciąg.
To rozwiązanie jest dostępne pod następującym adresem URL ... http://www.adrianwalker.org/2011/12/java-multiline-string.html
Mam nadzieję, że to pomaga!
źródło
Zobacz Java Stringfier . W razie potrzeby zamienia tekst w blok java StringBuilder.
źródło
źródło
Alternatywą, której nie widziałem jeszcze jako odpowiedzi, jest
java.io.PrintWriter
.Również fakt, że
java.io.BufferedWriter
istniejenewLine()
metoda, nie został wspomniany.źródło
Jeśli podoba Ci się guawa google tak samo jak ja, może dać dość czystą reprezentację i miły, łatwy sposób, aby nie kodować również znaków nowej linii:
źródło
Zastosowanie
Properties.loadFromXML(InputStream)
. Nie ma potrzeby korzystania z zewnętrznych bibliotek.Lepsze niż nieporządny kod (ponieważ zależy Ci na łatwości konserwacji i projektowaniu), lepiej nie używać długich ciągów.
Zacznij od przeczytania właściwości xml:
możesz użyć swojego ciągu wielowierszowego w bardziej konserwowalny sposób ...
MultiLine.xml` zostanie umieszczony w tym samym folderze YourClass:
PS .: Możesz użyć
<![CDATA["
..."]]>
dla łańcucha podobnego do xml.źródło
W kompilacji # 12 wczesnego dostępu JDK / 12 można teraz używać ciągów wielowierszowych w Javie w następujący sposób:
i to powoduje następujące wyniki:
Edycja: Przełożono na java 13
źródło
Dość wydajnym i niezależnym od platformy rozwiązaniem byłoby użycie właściwości systemowej dla separatorów linii i klasy StringBuilder do budowy ciągów:
źródło
Jedna dobra opcja.
źródło
Java 13 i nowsze wersje
Ciągi wielowierszowe są teraz obsługiwane w Javie przez bloki tekstowe . W Javie 13 i 14 ta funkcja wymaga ustawienia tej
––enable–preview
opcji podczas budowania i uruchamiania projektu. Sprawdź tę dokumentację Java więcej szczegółów.Przed wersją Java 13 możesz napisać zapytanie:
Dzięki blokom tekstowym Java 13 możesz przepisać to zapytanie w następujący sposób:
O wiele bardziej czytelny, prawda?
Obsługa IDE
IntelliJ IDEA zapewnia obsługę transformacji starszych
String
bloków konkatenacji do nowegoString
formatu wielowierszowego :JSON, HTML, XML
Multilinia
String
jest szczególnie przydatna podczas pisania JSON, HTML lub XML.Rozważ ten przykład, używając
String
konkatenacji do zbudowania literału łańcucha JSON:Ledwo możesz odczytać JSON z powodu uciekających znaków i mnóstwa podwójnych cudzysłowów i znaków plus.
W przypadku bloków tekstowych Java obiekt JSON można zapisać w następujący sposób:
Odkąd użyłem C # w 2004 roku, chciałem mieć tę funkcję w Javie, a teraz w końcu ją mamy.
źródło
Ciągi wielowierszowe nie są dozwolone w plikach właściwości. Możesz użyć \ n w plikach właściwości, ale nie wydaje mi się, żeby to było dobre rozwiązanie w twoim przypadku.
źródło
Wiem, że to stare pytanie, jednak dla zaprzęgniętych programistów Literały z wielu linii będą w języku # Java12
http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html
źródło
Sugeruję użycie narzędzia sugerowanego przez ThomasP, a następnie połączenie go z procesem kompilacji. Plik zewnętrzny jest nadal obecny, aby zawierać tekst, ale plik nie jest odczytywany w czasie wykonywania. Przepływ pracy jest wtedy:
class TextBlock {...
do statycznego ciągu, który jest automatycznie generowany z pliku zasobówźródło
Gdy używana jest długa seria +, tworzony jest tylko jeden StringBuilder, chyba że w czasie kompilacji zostanie określony String, w którym to przypadku nie zostanie użyty StringBuilder!
StringBuilder jest bardziej efektywny tylko wtedy, gdy do zbudowania ciągu użyto wielu instrukcji.
Uwaga: Tworzony jest tylko jeden StringBuilder.
Spraw, aby było to tak jasne i proste, jak to tylko możliwe.
źródło