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.

  • ???? Temel Amaç: BufferedReader, okuma işlemleri maliyetli olan herhangi bir Reader'ı sarmalayarak, temel akışa karşı yapılan bireysel okuma işlemlerini azaltır.
  • 🔁 Okuma Döngüsü: `readLine` fonksiyonu her çağrıda bir satır döndürür ve dosyanın sonunda `null` değeri döndürür; bu nedenle, bu sonuç üzerinde bir `while` döngüsü tüm dosyayı tarar.
  • 🧱 Kaçış Yolları: A Windows bir yolun içinde Java Dizenin çift ters eğik çizgi içermesi gerekiyor, aksi takdirde derleyici geçersiz kaçış dizisini reddeder.
  • ♻️ Kaynak Yayınlama: Okuyucunun kapatılması, altta yatan dosya tanıtıcısını serbest bırakır; try-with-resources bu kapatma işlemini otomatik olarak gerçekleştirir.
  • ⌨️ Konsol Girişi: Şalping InputStreamReader içindeki System.in, aynı sınıfın dosya yerine klavye girişini okumasını sağlar.
  • 🇧🇷 Tarayıcı Kontrastı: BufferedReader daha hızlıdır ve ham satırları döndürürken, Scanner belirteçleri ve temel veri tiplerini doğrudan ayrıştırır.
  • 🔤 Karakter Seti Uyarısı: FileReader varsayılan karakter setini kullanır, bu nedenle karakter setini açıkça belirtmek, farklı makinelerde karakterlerin bozulmasının önüne geçer.

BufferedReader girişi Java

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 FileReader Platformun varsayılan karakter seti uygulandı. Karakter setini açıkça belirtin, örneğin new 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.

SSS

Evet. İkinci bir yapıcı argümanı, arabelleği karakter cinsinden ayarlar, örneğin. new BufferedReader(reader, 16384)8192 varsayılan değeri çoğu dosya için uygundur; bu değeri yükseltmek yalnızca çok büyük ardışık okumalarda fayda sağlar.

Küçük dosyalar için evet, tek bir çağrıda satır listesi döndürür. Büyük dosyalar için ise tercih edin. Files.newBufferedReader or Files.linesÇünkü `readAllLines` fonksiyonu dosyanın tamamını aynı anda bellekte tutar.

Evet. AI Yardımcılar, finally bloğu temizliğini try-with-resources yapısına dönüştürür ve NIO eşdeğerlerini önerir. Oluşturulan dönüşümler genellikle açık kodlamayı göz ardı ettiğinden, karakter kümesini ve istisna davranışını daha sonra doğrulayın.

Yapay zeka yığın verilerini okuyor. trace ve hatanın nedeninin yanlış çalışma dizini, eksik izin veya kodlama uyumsuzluğu olup olmadığını belirler. Teşhis süresini kısaltır, ancak düzeltmenin yine de gerçek dosyaya karşı doğrulanması gerekir.

Hayır. `readLine` fonksiyonu satır sonlandırıcıyı kaldırır, bu nedenle döndürülen String'de sondaki yeni satır karakteri bulunmaz. Dolayısıyla dosyadaki boş bir satır, null yerine boş bir String döndürür.

Bu yazıyı şu şekilde özetleyin: