CodeGym/Java Blogu/Rastgele/BuffreredReader ve InputStreamReader sınıflarıyla çalışma...
John Squirrels
Seviye
San Francisco

BuffreredReader ve InputStreamReader sınıflarıyla çalışma alıştırması yapın

grupta yayınlandı
MERHABA! Bugünün dersi kolaylık sağlamak için iki bölüme ayrılacak. Daha önce değindiğimiz bazı eski konuları tekrar edeceğiz ve bazı yeni özellikleri ele alacağız :) İlkinden başlayalım. Zaten birçok kez olduğu gibi bir sınıfınız var BufferedReader. Umarım bu ifadeyi unutacak vaktin olmamıştır:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.inDaha fazla okumadan önce, her bir bileşenin — , InputStreamReader, BufferedReader— neyden sorumlu olduğunu ve neden gerekli olduğunu hatırlamaya çalışın . Hatırladın mı? Değilse, endişelenme. :) Unuttuğunuz bir şey varsa, okuyucu sınıflarına ayrılmış bu dersi yeniden okuyun. Her birinin neler yapabileceğini kısaca hatırlayacağız. System.in— bu, klavyeden veri almak için bir akıştır.  Prensip olarak, metni okumak için gereken mantığı uygulamak tek başına yeterli olacaktır. Ancak, hatırlayacağınız gibi, System.inkarakterleri değil, yalnızca baytları okuyabilir:
public class Main {

   public static void main(String[] args) throws IOException {

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
Bu kodu çalıştırırsak ve Kiril "Й" harfini girersek, çıktı şöyle olacaktır:
Й
208
153
10
Kiril karakterleri bellekte 2 bayt yer kaplar ve ekranda görüntülenirler. 10 sayısı, bir satır besleme karakterinin ondalık gösterimidir, yani Enter'a basıldığında. Bayt okumak çok zevkli, bu yüzden kullanmak System.inpek uygun değil. Kiril (ve diğer) harfleri doğru bir şekilde okumak için InputStreamReadersarıcı olarak kullanıyoruz:
public class Main {

   public static void main(String[] args) throws IOException {

       InputStreamReader reader = new InputStreamReader(System.in);
       while (true) {
           int x = reader.read();
           System.out.println(x);
       }
   }
}
Aynı "Й" harfini giriyoruz, ancak bu sefer sonuç farklı:
Й
1049
10
InputStreamReaderiki baytı (208 ve 153) tek sayı 1049'a dönüştürdü. Karakterleri okumanın anlamı budur. 1049, Kiril "Й" harfine karşılık gelir. Bunun doğru olduğuna kendimizi kolayca inandırabiliriz:
public class Main {

   public static void main(String[] args) throws IOException {
       char x = 1049;
       System.out.println(x);
   }
}
Konsol çıktısı:
Й
Ve as forBufferedReader(ve genel olarak BufferedAnythingYouWant), arabelleğe alınmış sınıflar performansı optimize etmek için kullanılır. Bir veri kaynağına (dosya, konsol, web kaynağı) erişim, performans açısından oldukça pahalıdır. Bu nedenle erişim sayısını azaltmak için BufferedReaderverileri özel bir arabellekte okur ve biriktirir ve oradan alırız. Sonuç olarak, veri kaynağına erişilme sayısı azalır - muhtemelen birkaç büyüklük sırasına göre! Özelliklerinden bir diğeri BufferedReaderve sıradan olana göre avantajı , tek tek sayıları değil, tüm veri satırlarını okuyan InputStreamReaderson derece yararlı bir yöntemdir . readLine()Bu, elbette, büyük metinlerle uğraşırken çok uygundur. Okuma satırları şöyle görünür:
public class Main {

   public static void main(String[] args) throws IOException {

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       String s = reader.readLine();
       System.out.println ("The user entered the following text:");
       System.out.println(s);
       reader.close();
   }
}
BufferedReader+InputStreamReader is faster than InputStreamReader alone
The user entered the following text:
BufferedReader+InputStreamReader is faster than InputStreamReader alone
BuffreredReader ve InputStreamReader sınıflarıyla çalışma alıştırması - 2Tabii ki, BufferedReaderçok esnektir. Klavye ile çalışmakla sınırlı değilsiniz. Örneğin, gerekli URL'yi bir okuyucuya ileterek verileri doğrudan web'den okuyabilirsiniz:
public class URLReader {

   public static void main(String[] args) throws Exception {

       URL oracle = new URL("https://www.oracle.com/index.html");
       BufferedReader in = new BufferedReader(
               new InputStreamReader(oracle.openStream()));

       String inputLine;
       while ((inputLine = in.readLine()) != null)
           System.out.println(inputLine);
       in.close();
   }
}
Dosya yolunu geçerek bir dosyadan veri okuyabilirsiniz:
public class Main {

   public static void main(String[] args) throws Exception {

       FileInputStream fileInputStream = new FileInputStream("testFile.txt");
       BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));

       String str;

       while ((str = reader.readLine()) != null)   {
           System.out.println (str);
       }

       reader.close();
   }
}

System.out'un değiştirilmesi

Şimdi daha önce değinmediğimiz ilginç bir yeteneğe göz atalım. Kesinlikle hatırladığınız gibi, Systemsınıfın iki statik alanı vardır - System.inve  System.out. Bu ikiz kardeşler akış nesneleridir. System.inbir InputStream. ve System.out bir PrintStream. Şu anda, hakkında konuşacağız  System.out. Sınıfın kaynak koduna girersek Systemşunu görürüz:
public final class System {
……………...
public final static PrintStream out = null;
 …………
}
Bu nedenle,  System.out  sınıfın sıradan bir statik değişkenidirSystem . Bunda sihirli bir şey yok :) outDeğişken bir PrintStreamreferanstır. İşte ilginç bir soru: Yürütüldüğünde System.out.println(), çıktı neden başka bir yere değil de tam olarak konsola gidiyor? Ve bu bir şekilde değiştirilebilir mi? Örneğin, konsoldan veri okumak ve onu bir metin dosyasına yazmak istediğimizi varsayalım. System.outBunu ek okuyucu ve yazar sınıfları yerine basitçe kullanarak bir şekilde uygulamak mümkün müdür  ? System.outGerçekten de öyle :) Ve değişken değiştirici ile işaretlenmiş olsa bile bunu yapabiliriz final!  BuffreredReader ve InputStreamReader sınıflarıyla çalışma alıştırması - 3Peki bunu gerçekleştirmek için neye ihtiyacımız var? Her şeyden önce, PrintStreammevcut olanı değiştirmek için yeni bir nesneye ihtiyacımız var. Şurada ayarlanan geçerli nesne:Systemclass varsayılan olarak amaçlarımıza hizmet etmez: konsolu işaret eder. Verilerimiz için "hedef" olan bir metin dosyasına işaret eden yeni bir tane oluşturmanız gerekir. İkinci olarak, değişkene nasıl yeni bir değer atayacağımızı anlamamız gerekiyor System.out. Basit bir atama işleci kullanamazsınız, çünkü değişken işaretlidir final. Sondan geriye doğru çalışalım. Olduğu gibi, Systemsınıf ihtiyacımız olan yönteme sahiptir: setOut(). Bir nesneyi alır PrintStreamve onu çıktı için hedef olarak ayarlar. İhtiyacımız olan şey bu! Geriye sadece bir nesne yaratmak kalıyor PrintStream. Bu da kolaydır:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Tam kod şöyle görünecektir:
public class SystemRedirectService {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
       /* Save the current value of System.out in a separate variable so that later
       we can switch back to console output */

       PrintStream console = System.out;
       // Assign a new value to System.out
       System.setOut(filePrintStream);
       System.out.println("This line will be written to the text file");

       // Restore the old value of System.out
       System.setOut(console);
       System.out.println("But this line will be output to the console!");
   }
}
Sonuç olarak, ilk dize metin dosyasına yazılır ve ikincisi konsolda görüntülenir :) Bu kodu IDE'nize kopyalayıp çalıştırabilirsiniz. Metin dosyasını açın ve dizgenin oraya başarıyla yazıldığını göreceksiniz :) Bununla birlikte dersimiz de sona ermiş oluyoruz. Bugün akışlar ve okuyucularla nasıl çalışacağımızı hatırladık. Birbirlerinden ne kadar farklı olduklarını hatırladık ve System.outneredeyse her derste kullandığımız bazı yeni yeteneklerini öğrendik :) Bir sonraki derse kadar!
Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok