Mengingat string yang tidak terlalu panjang, apa cara terbaik untuk membacanya baris demi baris?
Saya tahu Anda dapat melakukannya:
BufferedReader reader = new BufferedReader(new StringReader(<string>));
reader.readLine();
Cara lain adalah dengan mengambil substring pada eol:
final String eol = System.getProperty("line.separator");
output = output.substring(output.indexOf(eol + 1));
Adakah cara lain yang lebih sederhana untuk melakukannya? Saya tidak punya masalah dengan pendekatan di atas, hanya tertarik untuk mengetahui apakah ada di antara Anda tahu sesuatu yang mungkin terlihat lebih sederhana dan lebih efisien?
Jawaban:
Anda juga dapat menggunakan
split
metode String:Ini memberi Anda semua baris dalam array berguna.
Saya tidak tahu tentang kinerja split. Ini menggunakan ekspresi reguler.
sumber
line.separator
dan orang lain membacanya di windows menggunakanline.separator
, itu masih berpunuk. Itu bukan coders tidak kompeten dari melakukan hal-hal bodoh, hanya saja hal-hal (tidak selalu) bekerja.Ada juga
Scanner
. Anda dapat menggunakannya sepertiBufferedReader
:Saya pikir ini adalah pendekatan yang sedikit lebih bersih dari yang disarankan.
sumber
Karena saya sangat tertarik pada sudut efisiensi, saya membuat kelas uji kecil (di bawah). Hasil untuk 5.000.000 baris:
Seperti biasa, waktu yang tepat dapat bervariasi, tetapi rasio tetap berlaku namun sering saya menjalankannya.
Kesimpulan: persyaratan "lebih sederhana" dan "lebih efisien" dari OP tidak dapat dipenuhi secara bersamaan,
split
solusinya (dalam kedua inkarnasi) lebih sederhana, tetapiReader
implementasinya mengalahkan yang lain.sumber
lines()
fungsi mengembalikan aStream<String>
dari baris, yang dapat Anda kumpulkan ke dalam daftar jika Anda mau, atau memproses arus.Menggunakan Apache Commons IOUtils Anda dapat melakukannya dengan baik
Itu tidak melakukan sesuatu yang pintar, tetapi bagus dan kompak. Ini akan menangani stream juga, dan Anda bisa mendapatkan
LineIterator
juga jika Anda mau.sumber
IOUtils.readlines(Reader)
melemparIOException
. Meskipun ini mungkin tidak akan pernah terjadi dengan StringReader, Anda harus menangkap atau mendeklarasikannya.Solusi menggunakan
Java 8
fitur sepertiStream API
danMethod references
atau
sumber
Sejak Java 11, ada metode baru
String.lines
:Pemakaian:
sumber
Anda dapat menggunakan api streaming dan StringReader yang dibungkus dengan BufferedReader yang mendapat baris () stream output di java 8:
Memberi
Sama seperti di readLine BufferedReader, karakter baris baru itu sendiri tidak termasuk. Semua jenis pemisah baris baru didukung (dalam string yang sama genap).
sumber
Anda juga bisa menggunakan:
Jika itu tidak berhasil coba ganti
\n
dengan\r\n
.sumber
Atau gunakan percobaan baru dengan klausa sumber daya yang dikombinasikan dengan Pemindai:
sumber
Anda dapat mencoba ekspresi reguler berikut:
Kode:
Keluaran:
sumber
Pendekatan termudah dan paling universal adalah dengan hanya menggunakan regex
Linebreak matcher
\R
yang cocokAny Unicode linebreak sequence
:@lihat https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html
sumber