Platforma bağımlı yeni bir satır karakteri nasıl alabilirim?


542

Java'da platforma bağımlı bir yeni satırı nasıl edinebilirim? Her "\n"yerde kullanamam .


Lütfen kabul edilen cevapları değiştirmeyi düşünün. İkinci cevap daha uygundur.
Gri

Yanıtlar:


364

Line.separator özelliğine ek olarak, java 1.5 veya daha yenisini ve String.format (veya diğer biçimlendirme yöntemleri) kullanıyorsanız %n,

Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY%n", c); 
//Note `%n` at end of line                                  ^^

String s2 = String.format("Use %%n as a platform independent newline.%n"); 
//         %% becomes %        ^^
//                                        and `%n` becomes newline   ^^

Daha fazla ayrıntı için Formatter için Java 1.8 API'sine bakın.


7
Teşekkür ederim! Eminim System.getProperty ("line.separator"); kullanımları vardır, ancak görmekten bıktım: "Line 1" + System.getProperty ("line.separator") + "Line 2"
Buttons840

43
"Satır 1" + System.getProperty ("satır.ayırıcı") + "Satır 2" gerçekten gördüğüm en çirkin şeylerden biri. Sadece başka bir yerde sabit ilan etmek daha az acı verici olurdu.
abahgat

4
bu en azından bir dize log4j deyimine girerek çalışmaz. Sonunda bir satırsonu ile örnek oluşturmak sorunu potansiyel olarak gizliyor. Ayrıca, String s2 sadece '%% n' kullanarak kafa karıştırıyor
Stealth Rabbi

6
Dizeniz %kullanıcı girdisinden içeriyorsa bunu kullanmayın !
Konstantin Weitz

8
@KonstantinWeitz, sorunu String.format(s + "%n")kolayca çözülebilir String.format("%s%n", s). Biçim gövdesi olarak kullanıcı girdilerinin dahil edilmesi her zaman risklidir (aynı şekilde eval()).
Franklin Yu

710

Java 7'nin artık bir System.lineSeparator()yöntemi var.


8
lineSeperator(int)Sık sık kendimi bir kerede 2 kullanarak buldum gibi, hat ayırıcıları bir dizi döndüren aşırı yüklenmiş bir yöntem sağlamak için çok güzel olurdu .
Kon

10
@Kon Bu yanıta göre :String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer

4
Java 11 ile:System.lineSeparator().repeat(5)
Jacob G.

4
@JacobG Gloating durdurmak .. bazılarımız hala Java 7 sıkışmış.
Andrew T Finnell

@AndrewTFinnell Daha iyi bir iş bulurdum <:-P Kapsayıcı yok -> Java 11 yok, bu yüzden daha iyi maaş için kalıyorsun, gloat yapabiliriz :-D
Aubergine

650

Kullanabilirsiniz

System.getProperty("line.separator");

çizgi ayırıcı almak için


4
Java 7 System.lineSeparator()ayrıntılarını eklemek ister misiniz, bu yüzden bu soruya kesin bir cevap var mı?
Gri


31

Bu da mümkündür: String.format("%n") .

Ya da String.format("%n").intern()birkaç bayt kaydetmek için.


7
Bu Alex B'nin cevabı ile aynı.
13'te

16
Şimdi görüyorum. Cevabının etrafında çok fazla sorulmamış şeyler yazdı. ;-)
ceving

Bunu yapmayı denedim ama dosyayı not defterinde görüntülediğimde, yeni satırı tanımıyor.
mr5

1
@ mr5 notepadbir dosyanın içeriğini görüntülemek için doğru araç değildir. hexdumpVeya tuşunu kullanın od.
ceving

@ceving Windows ortamındayım ve yeni satırın birleşimi olacağını bekliyordum\r\n
mr5

22

Commons-lang kitaplığı adı verilen mevcut sabit alanı vardır SystemUtils.LINE_SEPARATOR


19
Evet, platformdan bağımsız yeni bir hat almak için bir üçüncü taraf kütüphanesi kurun! #facepalm
Shervin Asgari

23
@Shervin elbette bunu yapmazsınız, ancak üzerinde çalıştığım birçok proje zaten commons-lang ve Java'nın eski bir sürümünü kullanıyor. Eğer zaten commons-lang kullanıyorsanız, bu mantıklı bir cevaptır. Bunu belirtmem gerektiğini hissetmedim, açıkça yanılmışım.
lexicalscope

2
Bu, zaten bu kütüphaneyi kullanan projeler için iyi bir öneri, teşekkürler!
Alexis Leclerc

13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

Yukarıdaki snippet'te, platformlardan bağımsız olarak yeni bir satırla ayrılmış iki dize olacaktır.



-3

String + String vb. Kullanarak dizeler eklemekten kaçının, bunun yerine StringBuilder kullanın.

String separator = System.getProperty( "line.separator" );
StringBuilder lines = new StringBuilder( line1 );
lines.append( separator );
lines.append( line2 );
lines.append( separator );
String result = lines.toString( );

20
Bu çoğu durumda önemli değil, Coding Horror'dan Jeff Atwood bu tür mikro optimizasyon hakkında bir blog yazısı yaptı . "Yapmayın" gibi iddialarda bulunmadan önce her zaman metrikler yapın string + string.
12'de

6
Jeff'in makalesinin sadece yürütme süresine değdiği için biraz kapalı olabileceğini söyleyebilirim. Java'da dize birleştirme sadece yürütme hızı ile ilgili değildir, aynı zamanda GC'nin temizlenmesi için bellekte ne kadar çöp bıraktığınızdır, bu da GC'nin daha sık çalışmasına neden olabilir. Ortamınıza ve yapılandırmanıza bağlı olarak bu bir sorun olabilir veya olmayabilir.
Aralık'ta Lajcik

7
Lajcik, gerçekten çok fazla dize manipülasyonu yapanlar dışında tüm durumlar için ön optimizasyon olduğundan şüpheleniyorum. StringBuffer, küçük birleştirme gereksinimleri için bir anti-kalıptır. Birçok durumda, yukarıda belirtilen çok satırlı örnek yerine okunabilir String1 + separator + String2 olmasını tercih ederim. Ayrıca, SB ekleyerek bellek ve GC'nin olumlu etkilenip etkilenmediğini test etmenizi öneririm. Pek çok durumda değil sanırım. Test etmeye değmezse, muhtemelen önceden optimize edilmiştir ve okunabilirliğe odaklanacağım.
Richard Watson

31
Bir String1 + String2 yapmak, modern derleyicilerde yeni StringBuilder (String1) .append (String2) yapmakla aynıdır, bu nedenle tek satırlı bir dize concat için hiç optimizasyon yoktur. StringBuilder genellikle sadece döngülerde veya özyinelemeli yöntemlerde buna değer. Ama her neyse, bu orijinal sorunun kapsamı dışında olabilir.
user327961

@ user327961: gerçek hikaye. En sevdiğiniz IDE ve bir hata ayıklayıcıyı kullanarak bunu kolayca kanıtlayabilirsiniz.
Atmocreations
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.