Java BufferedReader: Örnekle Dosya Okuma
⚡ Akıllı Özet
Java BufferedReader, karakterleri tamponlayarak giriş akışından metin okur; bu da satır satır dosya okumayı hızlı ve basit hale getirir.ping içinde bir FileReader BufferedReader ve tuvaletping `readLine` fonksiyonu `null` döndürene kadar tüm dosyayı yazdırır.

Bir dosya nasıl okunur Java?
Java Dosyadan okumak için çeşitli mekanizmalar sağlar. Bunun için en kullanışlı paket şudur: java.iokarın kasları olantract Reader Bu sınıf, karakter akışı okumasını tanımlar. java.io.BufferedReader Bu, satır tabanlı okuma işlemlerinin verimli bir şekilde gerçekleştirilmesinde kullanılan somut alt sınıftır.
Nedir? BufferedReader girişi Java?
BufferedOkuyucu bir Java Bir dosya gibi giriş akışından metin okuyan ve karakterleri, dizileri ve satırları verimli bir şekilde okumak için karakterleri tamponlayan bir sınıftır. Tamponlama olmadan, bir Reader'a yapılan her okuma isteği, altta yatan karakter veya bayt akışına karşı karşılık gelen bir okuma isteğini tetikler.
Bu nedenle sarmanız tavsiye edilir. BufferedReader, herhangi bir Okuyucunun etrafında read() Operasyonlar maliyetli olabilir, örneğin: FileReader hem de InputStreamReaderTipik bir kullanımda dosya yolu okuyucuya şu şekilde iletilir:
// Note the doubled backslash: a single \ starts an escape sequence objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));
Bu, dosyayı yükler. objReaderArdından dosyanın içeriğini döngüyle tarayıp her satırı yazdırıyorsunuz. Aşağıdaki kodda yer alan while döngüsü, dosyanın sonuna ulaşana kadar dosyayı okuyor.
while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); }
strCurrentLine mevcut çizgiyi tutar ve objReader.readLine() Bir String döndürür. Bu nedenle döngü, döndürülen değer null olmadığı sürece devam eder ve dosyanın sonunu işaret eden ilk null değerde durur.
BufferedReader Örneği
Aşağıdaki kod eksiksizdir. Java BufferedReader örneği:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample { public static void main(String[] args) { BufferedReader objReader = null; try { String strCurrentLine; objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt")); while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (objReader != null) objReader.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
Not: MKS finally Blok önemlidir. Şunu garanti eder ki: objReader.close() İstisna oluşup oluşmadığına bakılmaksızın çalışır; bu işlem, temel dosya tanıtıcısını serbest bırakır ve dosyayı korur. bellek yönetimi tahmin edilebilir. İç içe geçmiş try bloğu finally gereklidir çünkü close() kendisi ilan eder IOException.
BufferedReader JDK7 Örneği
JDK 7'den itibaren, try-with-resources ifadesi şunu kaldırır: finally Blok tamamen bloke edilir. Parantez içinde belirtilen herhangi bir kaynak try Bloktan çıkıldığında, bir istisna yayılsa bile, ifade oluşturulma sırasının tersine otomatik olarak kapatılır:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample_jdk7 { private static final String FILENAME = "D:\\DukesDiary.txt"; public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader(FILENAME))) { String strCurrentLine; while ((strCurrentLine = br.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } } }
Bu sürüm daha kısa ve daha güvenli olduğundan, yeni kodlarda tercih edilmesi gereken biçimdir. Dosya okumak, sınıfın yalnızca bir kullanım alanıdır; bir sonraki bölümde, yeni başlayanların ilk olarak başvurduğu alternatifle karşılaştırılacaktır.
BufferedReader mı, Tarayıcı mı: Hangisini Kullanmalı?
Her iki sınıf da metin okur ve yeni başlayanlar genellikle rastgele birini seçer. Farklı problemleri çözerler ve yanlış seçim, girdi binlerce satıra ulaştığında ya beceriksiz manuel ayrıştırma ya da düşük verimlilik olarak ortaya çıkar. Aşağıdaki tabloda bu iki sınıf yan yana gösterilmiştir.
| Görünüş | BufferedOkuyucu | Tarayıcı |
|---|---|---|
| Geri dönüşler | Tüm satırlar dize olarak | Ayrıştırılmış belirteçler ve temel veri türleri |
| Dahili ayrıştırma | Hayır, kendinizi bölersiniz veya dönüştürürsünüz. | Evet — nextInt, sonrakiDouble, sonraki satır |
| Varsayılan arabellek | 8192 karakter | 1024 karakter |
| Büyük dosyalarda hız | Daha hızlı | Daha yavaş, çünkü düzenli ifadelerle tokenleştirme yapılıyor. |
| İplik güvenliği | Synckronize edilmiş | Senkronize değil |
| İçin en iyisi | Büyük dosyaları satır satır okuma | Yazılı değerler gerektiren küçük etkileşimli giriş alanı. |
Klinik BufferDosyada hızlıca gezinmek ve metni kendiniz işlemek istediğinizde edReader, dönüştürme kodu yazmadan girilen değerleri almak istediğinizde ise Scanner kullanılır. Döndürülen her satırı bölmek için... Dize bölme yöntemi verir BufferedReader, tarayıcının sunduğu kolaylıkların çoğunu daha yüksek hızda sunar.
Konsol Girişini Nasıl Okuyabilirsiniz? BufferedOkuyucu
Aynı sınıf, klavye girişini de okur; bu özellik, küçük komut satırı programları ve kodlama yarışması girişleri için kullanışlıdır. System.in Bu bir bayt akışıdır, bu nedenle başka bir yere aktarılamaz. BufferedReader'ı doğrudan kullanın. InputStreamReader Baytları karakterlere dönüştürür ve BufferedReader daha sonra bu köprü üzerine verimli satır okuma özelliği ekler.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ReadConsoleExample { public static void main(String[] args) throws IOException { // Bridge the System.in byte stream to a character stream try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { System.out.print("Enter your name: "); String name = reader.readLine(); System.out.print("Enter your age: "); // readLine always returns text, so convert it explicitly int age = Integer.parseInt(reader.readLine().trim()); System.out.println("Hello " + name + ", age " + age); } } }
Üç ayrıntıyı hatırlamakta fayda var. Birincisi, readLine() Her zaman bir String döndürür, bu nedenle sayısal girişin dönüştürülmesi gerekir. Integer.parseInt veya benzeri ve sayısal olmayan bir giriş hata verir. NumberFormatException — Giriş güvenilir değilse dönüştürmeyi sarmalayın. İkinci olarak, çağırmak .trim() Sondaki satır başı karakterini kaldırır. Windows Konsollar ekleme işlemi yapar, bu da sık sık ayrıştırma hatalarına neden olur. Üçüncüsü, etrafına sarılmış bir okuyucuyu kapatmaktan kaçının. System.in Programın daha sonra konsol girdisine ihtiyacı olması durumunda, sarmalayıcıyı kapatmak, altta yatan akışı o işlem için kalıcı olarak kapatacağından, bu durum geçerlidir.
Çok sayıda değer okuyan programlar için, tek bir satırı okuyup bölmek, farklı bir yöntem kullanmaktan çok daha hızlıdır. readLine() Bu, her çağrının yalnızca tampon boşaldığında işletim sistemine geçmesi nedeniyle tekrar tekrar gerçekleşir. Rekabetçi programcıların bunu tercih etmesinin ana nedeni budur. BufferToplu veri girişi için tarayıcı yerine edReader.
Kod doğru yazılmış olsa bile, birkaç hata tekrar tekrar ortaya çıkıyor.
ortak BufferedReader Hataları ve Nasıl Düzeltilir
köprü BufferedReader hataları, okuma döngüsünün kendisinden ziyade dosya yollarından, kaynak yönetiminden veya karakter kodlamasından kaynaklanır. Aşağıdaki her hata, istisnasını ve çözümünü belirtir.
- Yasadışı kaçış karakteri: Yol, tek bir ters eğik çizgi kullanır, örneğin:
"D:\DukesDiary.txt". Double buna"D:\\DukesDiary.txt"veya eğik çizgi kullanın, bu da Java kabul eder Windows. - Dosya Bulunamadı Hatası: Yol, kaynak dosyaya değil, çalışma dizinine göre belirlenir. Yazdır
new File(name).getAbsolutePath()nerede görmek için Java Aslında bakıyor. - İlk okumada NullPointerException hatası oluştu. Okuyucuya hiçbir zaman atama yapılmadı çünkü kurucu metot bir hata fırlattı ve bu hata yutuldu. Kontrol edin. istisna işleme Döngüden önce.
- Anlamsız veya soru işareti karakterleri: Dosya UTF-8 formatındadır ancak
FileReaderPlatformun varsayılan karakter seti uygulandı. Karakter setini açıkça belirtin, örneğinnew InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8). - Yayın kapatıldı: Okuyucu, döngü içinde kapatıldı veya try-with-resources işlemi bittikten sonra yeniden kullanıldı. Dosya üzerinde her geçiş için yeni bir okuyucu açın.
