Bir dosyadaki tüm metni okuma
Java 11, küçük dosyaları satır sonlandırıcılarını koruyarak okumak için readString () yöntemini ekledi String
:
String content = Files.readString(path, StandardCharsets.US_ASCII);
Java 7 ve 11 arasındaki sürümler için, bir yardımcı program yöntemiyle sarılmış kompakt, sağlam bir deyim:
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
Dosyadaki metin satırlarını okuma
Java 7 bir katma metin satırı gibi bir dosyayı okumak için kolaylık yöntemini bir olarak temsil List<String>
. Bu yaklaşım "kayıplıdır" çünkü çizgi ayırıcılar her çizginin sonundan çıkarılır.
List<String> lines = Files.readAllLines(Paths.get(path), encoding);
Java 8, Files.lines()
a Stream<String>
. Yine, bu yöntem kayıptır çünkü hat ayırıcılar soyulmuştur. Bir ederse IOException
dosya okunurken karşılaşıldığında, bir sarılır UncheckedIOException
beri, Stream
kontrol istisnalar atmak lambdas kabul etmez.
try (Stream<String> lines = Files.lines(path, encoding)) {
lines.forEach(System.out::println);
}
Bunun Stream
için bir close()
çağrı gerekir ; Bu API üzerinde kötü bir şekilde belgelenmiştir ve birçok insanın bile Stream
bir close()
yöntemi olduğunu fark etmediğinden şüpheleniyorum . Gösterildiği gibi bir ARM bloğu kullandığınızdan emin olun.
Dosya dışında bir kaynakla çalışıyorsanız lines()
, BufferedReader
bunun yerine yöntemi kullanabilirsiniz .
Bellek kullanımı
Satır sonlarını koruyan ilk yöntem, geçici olarak dosyanın boyutunun birkaç katı bellek gerektirebilir, çünkü kısa bir süre için ham dosya içeriği (bayt dizisi) ve kodu çözülmüş olsa bile her biri 16 bit olan kod çözme karakterleri dosyada 8 bit gibi) aynı anda bellekte bulunur. Kullanılabilir belleğe göre küçük olduğunu bildiğiniz dosyalara başvurmak en güvenli yöntemdir.
İkinci yöntem olan satırları okumak genellikle bellek açısından daha verimlidir, çünkü kod çözme için girdi bayt tamponunun tüm dosyayı içermesi gerekmez. Bununla birlikte, kullanılabilir belleğe göre çok büyük dosyalar için hala uygun değildir.
Büyük dosyaları okumak için, programınız için bir akıştaki bir metni okuyan, işleyen ve daha sonra aynı sabit boyutlu bellek bloğunu yeniden kullanan farklı bir tasarıma ihtiyacınız vardır. Burada "büyük" bilgisayar özelliklerine bağlıdır. Günümüzde, bu eşik birçok gigabayt RAM olabilir. Üçüncü yöntem, a'yı kullanmak Stream<String>
, girdilerinizin "kayıtlarının" tek tek satırlar olması durumunda bunu yapmanın bir yoludur. ( readLine()
Yöntemini kullanmak BufferedReader
bu yaklaşımın prosedürel eşdeğeridir.)
Karakter kodlaması
Orijinal yazıdaki örnekte eksik olan bir şey karakter kodlamasıdır. Platform varsayılanının istediğiniz gibi olduğu bazı özel durumlar vardır, ancak bunlar nadirdir ve seçiminizi haklı çıkarmanız gerekir.
StandardCharsets
Sınıf tüm Java çalıştırmalar gerekli kodlamaların bazı sabitleri tanımlar:
String content = readFile("test.txt", StandardCharsets.UTF_8);
Platform varsayılan edinilebilir sınıfın kendisi:Charset
String content = readFile("test.txt", Charset.defaultCharset());
Not: Bu yanıt büyük ölçüde Java 6 sürümümün yerini alıyor. Java 7'nin yardımcı programı kodu güvenli bir şekilde basitleştirir ve eşlenen bir bayt tamponu kullanan eski yanıt, eşlenen tampon çöp toplanana kadar okunan dosyanın silinmesini önledi. Eski sürümü bu yanıttaki "düzenlenmiş" bağlantı üzerinden görüntüleyebilirsiniz.