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
Tabii ki,
Peki bunu gerçekleştirmek için neye ihtiyacımız var? Her şeyden önce,
BufferedReader
. Umarım bu ifadeyi unutacak vaktin olmamıştır:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in
Daha 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.in
karakterleri 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.in
pek uygun değil. Kiril (ve diğer) harfleri doğru bir şekilde okumak için InputStreamReader
sarı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
InputStreamReader
iki 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 BufferedReader
verileri ö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 BufferedReader
ve sıradan olana göre avantajı , tek tek sayıları değil, tüm veri satırlarını okuyan InputStreamReader
son 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

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,System
sınıfın iki statik alanı vardır - System.in
ve System.out
. Bu ikiz kardeşler akış nesneleridir. System.in
bir 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 :) out
Değişken bir PrintStream
referanstı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.out
Bunu ek okuyucu ve yazar sınıfları yerine basitçe kullanarak bir şekilde uygulamak mümkün müdür ? System.out
Gerçekten de öyle :) Ve değişken değiştirici ile işaretlenmiş olsa bile bunu yapabiliriz final
! 
PrintStream
mevcut olanı değiştirmek için yeni bir nesneye ihtiyacımız var. Şurada ayarlanan geçerli nesne:System
class 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, System
sınıf ihtiyacımız olan yönteme sahiptir: setOut()
. Bir nesneyi alır PrintStream
ve 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.out
neredeyse her derste kullandığımız bazı yeni yeteneklerini öğrendik :) Bir sonraki derse kadar!
Daha fazla okuma: |
---|
GO TO FULL VERSION