çindekiler 1 java.io Paketi 1.1 1 Java'da Giri³/Çk³ ³lemleri (I/O) Ksa Tarihçe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 System Snf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 java.io Paketi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.4 Giri³/Çk³ Akmlar 1.5 Byte akmlar (byte streams) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.6 InputStream Snf 1.7 OutputStream Snf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.8 OutputStream Snfnn Tanm . . . . . . . . . . . . . . . . . . . . . . . . 8 1.9 OutputStream Snfnn Metotlar . . . . . . . . . . . . . . . . . . . . . . . 8 1.10 Al³trmalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.11 Al³trmalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i 6 7 ii ÇINDEKILER ii Bölüm 1 java.io Paketi 1.1 Java'da Giri³/Çk³ ³lemleri (I/O) Ksa Tarihçe Java'da giri³/çk³ (I/O input/output) i³lemleri, java dilinin geli³im sürecine paralellik gösterir. Geli³im sürecini daha iyi kavrayabilmek için, Java'nn sürümlerinin ortaya çk³ tarihlerine göz atmak yetecektir: Oak (1991) Java 1.0 (1995) JDK (Java Development Kit) 1.0 (23 Ocak 1996) J2SE 1.2 (8 Aralk 1998) J2SE 1.3 (8 Mays 2000) J2SE 1.4 (6 ubat 2002) J2SE 5.0 (30 Eylül 2004) Java SE 6 (11 Aralk 2006) Java SE 7 (28 Temmuz 2008) 1 2 1. java.io paketi J2SE 1.2 ile J2SE 5.0 sürümleri arasndaki sürümlere Java 2 ortak ad verilir. Ama bu sürümler arasnda önemli yetenek farklar oldu§unu belirtmeliyiz. Veri akmlar (data streams) eylemi JDK 1.0 sürümüyle geldi. Gereksemeler do§dukça Java Beans, JFC, RMI, jdbc gibi API'ler veri akmlarn gölgeleyen uygulamalar geli³tirdiler. Ama, giri³/çk³ akmlar JDK API'nin omurgas olmay sürdürdü. JDK 1.1 sürümüne kadar veri akmlar yalnzca byte akmlarndan ibaret kald. Ba³ka bir deyi³le veriler 8-bitlik diziler halinde akyordu. Gelen veri için InputStream snf, giden veri için OutputStream snf yeterli oluyordu. 16-bitlik Unicode karekterleri için akm, JDK 1.1 sürümünde ele alnd ve java.io.Reader ile java.io.Writer snar yazld. J2SE 1.4.2 sürümü, giri³/çk³ i³lemlerinde büyük de§i³iklik getiren java.nio paketini ortaya koydu. Aslnda bu paket java.io (new io) paketi üzerine kuruludur ve onun yeteneklerini artrr. Java 7 sürümüyle gelen NIO.2 paketi sözkonusu yetenekleri daha da artrd. imdiye dek giri³/çk³ (I/O) i³lemleriyle ilgili örnek programlar yazmadk. Yalnzca, ekran çktlar için System.out.print(), System.out.println() ve System.out.printf() metotlarn içeren basit deyimlerle yetindik. Bunun apaçk bir nedeni vardr. Java programlarnn ço§u konsol ile basit text giri³/çk³ yapmann ötesindedir. Java'da, ço§unlukla, giri³/çk³ i³lemleri için görsel esteti§e sahip applet'ler ve ba³ka grak arayüzler kullanr. Bunlar, Java'nn Abstract Windowing Toolkit (awt) ve onun üzerine kurulan ja- vax.swing paketine dayanr. Elbette, konsoldan text tabanl giri³/çk³ i³lemleri, di§er dillerde oldu§u gibi, Java ö§retimi için de önem ta³r. Ama, konsoldan text tabanl giri³/çk³ i³lemleri Java'da snar, nesneleri ve metotlar bilmeyi gerektiriyor. O nedenle, giri³/çk³ i³lemleri bilinçli olarak geriye braklm³tr. Böyle yaplm³ olmasnn, java dilini ö§renmeyi geciktirdi§i söylenemez. Aksine, bu a³amada, ö§renci giri³/çk³ eylemlerini daha iyi kavrayacaktr. Konsoldan giri³ yaplamamas konusundaki ele³tirilere yant olarak, J2SE 5.0 sürümü java.util.Scanner snfn ortaya koydu. Bu snf, konsoldan kolay veri giri³ini yapan metotlara sahiptir. Bu snf kullanlarak, java'ya yeni ba³layanlar ilk derslerde konsoldan veri giri³i yapabilirler. Ancak, arka planda olup biteni kavrayabilmesi için, ö§rencinin snf ve nesne kavramlarn biliyor olmas gerekir. Aksi halde, Scanner snfnn kullanlmas mekanik bir i³lem olur. 2 3 1.2. System Snf Baz kaynaklar Java'da giri³/çk³ i³lemlerini gere§inden çok karma³k bulur. Hattâ, giri³/çk³ i³lemlerini kolayla³tran arayüzlerin yazld§ da görülür. Oysa, ba³langçta ö§renciye karma³k görünen Java'nn giri³/çk³ i³lemleri, ona a³ina olanlara esneklik ve kolaylk sa§lar. Java Dili'nde ise giri³/çk³ i³lemleri fortran, cobol, basic, pascal, C gibi prosedural dillerden oldukça farkldr. Bunun apaçk bir nedeni vardr. Prosedural diller, hangi donanm üzerinde ve hangi i³letim sistemi altnda çal³acaksa, ona uyan giri³/çk³ yordamlarn tanmlayabilirler. Ancak, birisinde tanml olan yordam ba³kasnda çal³maz. Oysa, Java platformdan ba§mszdr. Donanm ve i³letim sistemine ba§l olmakszn, a§ üzerindeki her bilgisayardan veri alabilir ve her bilgisayara veri gönderebilir. Bunu yapabilmesi için, giri³/çk³ yöntemlerinin amaca uygun çe³itlilik göstermesi do§aldr. imdiye kadar kullanageldi§imiz System snf ile yaplan basit çk³ i³lemlerini anmsaynz. Bunun dayanaklarn giri³, çk³ ve hata i³lemleriyle birlikte geni³ kapsaml olarak ele alaca§z. 1.2 System Snf java.lang.Object java.lang.System public final class System extends Object Standart giri³/çk³ i³lemlerini yapan snftr. nal nitelemli oldu§u için bir nesnesi yaratlamaz. Sistem ile ilgili i³leri yapan 30 dan çok metodu vardr. Örne§in, bu metotlar çevre de§i³kenlerine eri³im sa§lar, dosyalar ve kütüphaneleri yükler, array kopyalayabilir, zaman bildirir, JVM'i sonlandrr, çöp toplaycy çal³trr, v.b. System snfnn giri³, çk³ ve hata yakalama eylemlerinde kullanlan üç önemli de§i³keni (eld) vardr: giri³ (in), çk³ (out) ve hata (err) de§i³kenleridir. Bunlarn tamnlar ³öyledir: static PrintStream err Çk³ yoluna "standard" hatalar yollar static InputStream in "standard" giri³ yoludur static PrintStream out "standard" çk³ yoludur Tablo 1.1: System Snfnn Nitelemleri 3 4 1. java.io paketi 1.3 java.io Paketi Java'da veri akmn sa§layan ilk pakete java.io denilir. Bu pakette yer alan snar, platformdan ba§msz olarak, bir ortamdan ba³ka bir ortama veri akmn sa§layacak yeteneklere sahiptirler. Java 7 API 'de bunlar 1 h t t p : / / d o w n l o a d . o r a c l e . com/ j a v a s e / 7 / d o c s / a p i / j a v a / i o / p a c k a g e −summary . h t m l web adresinden görülebilir. java.io paketi giri³/çk³ birimleri, dosya sistemleri, a§, bellek-alan gibi farkl ortamlarn birinden ötekine veri akmn sa§layan ve serile³tirme i³lemlerini yapan arayüzler, snar, metotlar ve hata yakalayclardan olu³an büyük bir pakettir. Bu pakette 16 arayüz, 50 snf ve 16 hata yakalayc (exceptions) vardr. Bu pakette yer alan snar ve onlarn içerdi§i metotlar kullanlarak her kaynaktan her hedefe veri akmlar yaplabilir. Bu akmlar makina düzeyine yakn oldu§u için yetenekleri çoktur, ama hzlar göreli olarak yava³tr. Daha hzl giri³/çk³ i³lemleri için, J2SE 1.4 sürümüyle gelen java.nio (new io) paketi kullanlabilir. Bu bölümde java.io 'yu, sonraki bölümde ise java.nio paketini ele alaca§z. Java'da byte ve character akmlarn yapan snar ve metotlar, en tepede tanml dört tane soyut snftan elde edilir: 1. InputStream 2. OutputStream 3. Reader 4. Writer Uyar 1. Bu dört soyut snftan elde edilen veri akm (stream) says 60'dan çoktur. Bu kadar çok sayda veri yolunun olmas baz programclara göre ö§renme sürecini uzatr ve zorla³trr. Baz programclara göre ise, farkl giri³/çk³ türleri için farkl akmlarn (stream) olmas, programn her donanmda her i³letim sistemi altnda hatasz çal³masn sa§lar ve dolaysyla programclar için bir avanta j saylr. Character akmlar için kullanlan teknikler, büyük ölçüde byte akmlar için kullanlan tekniklere benzer. Byte akmn yapan snf adlar ile character akmn yapan snf adlar, ço§unlukla son taklaryla birbirlerinden ayrlrlar. Böyle olu³u, ö§renmeyi kolayla³tracaktr. 4 5 1.4. Giri³/Çk³ Akmlar 1.4 Giri³/Çk³ Akmlar (Input/Output Streams) Java'da veri giri³/çk³ i³lemlerini, bir yerden ba³ka bir yere (byte dizileri halinde) akan veriler olarak dü³ünebiliriz. Böyle olunca, basit veri giri³/çk³ (I/O) i³lemlerini a³an çok kapsaml bir olgu kar³mza çkar. Veriler, bir kanaldan akan su gibi bir yerden ba³ka bir yere aktlr. Bu ak³, basitçe, ayn makinada bir bellek alanndan ba³ka bir bellek alanna olabilece§i gibi uzaktaki iki makinann birinden ötekine de olabilir. Verinin kalk³ ya da var³ yerleri bir bellek alan, bir dosya, a§ üzerinde bir bilgisayarn kayt ortam gibi veri tutabilen bir yerdir. Tabii, bunlara klâvye, ekran, ses birimleri ve benzerleri gibi çevre birimlerini de eklemek gerekir. Verinin geldi§i ve gitti§i ziksel ortamlar birbirlerinden tamamen farkl olsalar bile, Java'da giri³/çk³ akmlar birbirine benzer. Dolaysyla, Java'nn I/O snar her türlü veriye ve donanma uygulanabilecek esnekli§e ve kolay kullanlma özeli§ine sahiptirler. Her ³eyden önce, Java'da veri akmlarnn iki ana gruba ayrld§n söylemeliyiz: 1. Byte akmlar (byte streams) 2. Character akmlar (character streams) Byte akmlar binary verilerin giri³/çk³n yaparlar. Karekter tipinden olmayan resim, grak, ses ve benzer verileri ta³yan bütün veri akmlar byte akmlar 'dr. Karekter akmlar, adndan da anla³laca§ üzere, char tipinden verilerin giri³/çk³n yapar. Unicode kulland§ için, farkl ülkelerin alfabelerine uyum sa§lar. Bazan, programc için, karekter akmlar byte akmlarndan daha kolay uygulanr. Ama, bütün akmlarn esasta byte akmlar oldu§unu, karakter akmnn onun üzerine kuruldu§unu bilmeliyiz. Önceden belirtildi§i üzere, (Java 1.0) sürümünde karekter akm yoktu. Bütün giri³/çk³ i³lemleri byte akmlar olarak düzenlenmi³ti. JDK 1.1, bu eksikli§i görmü³ ve karakter akmlarn sisteme katm³tr. 1.5 Byte akmlar (byte streams) Java'da byte giri³/çk³ i³lemleri java.io paketi içindeki InputStream ve Out- putStream snar ve bunlarn altsnar tarafndan yaplr. Byte akm ya- 5 6 1. java.io paketi InputStream DataInputStream PushbackInputStream PipedInputStream BufferedInputStream FilterInputStream RandomAccessFile SequenceInputStream ByteArrayInputStream PrintStream FileInputStream OutputStream DataOutputStream PipedOutputStream BufferedOutputStream FileOutputStream ByteArrayOutputStream FilterOutputStream Tablo 1.2: Byte Akmlar pan altsnardan bazlar Tablo 1.2'de listelenmi³tir. Java 7 'nin API'sinde bunlarn hiyerar³ik yaps a³a§da gösterilmi³tir. java . lang . Object java . i o . InputStream 4 java . lang . Object j a v a . i o . OutputStream Giri³/çk³ snarndan birisini kullanmak için java.io paketinin d³alm (import) gereklidir. InputStream ve OutputStream snarnn önemli metotlar vardr. Bu metotlar öteki akm snar ça§rabilir. Bunlar arasnda çok kullanlan iki tanesi read() ve write() metotlardr. Bunlar verileri byte olarak okur ve yazarlar. Her iki metot soyuttur (abstract). Dolaysyla, ça§ran snara ait nesnelerde override edilirler. Önce InputStream snfn ele alaca§z. 1.6 InputStream Snf InputStream Snfnn Klglad§ Arayüzler Closeable , AutoCloseable InputStream Snfnn Altsnar Tablo 1.3, InputStream snfnn altsnarn göstermektedir. Bu altsnar, soyut InputStream snfnn soyut metotlarn kendi amaçlar için tanmlarlar (polimorzm). Örne§in, FileInputStream altsnfnn read() metodu giri³ yolundan bir seferde bir byte okur. Ama read(byte[] b) metodu bir seferde bir byte dizisi okur. 6 7 1.7. OutputStream Snf AudioInputStream ByteArrayInputStream FileInputStream FilterInputStream InputStream ObjectInputStream PipedInputStream SequenceInputStream StringBuerInputStream Tablo 1.3: InputStream Snfnn Altsnar InputStream Snfnn Metotlar int available() Okunabilecek byte saysn bildirir. void close() Giri³ yolunu kapatr ve yolu, ba§l oldu§u kaynaktan ayrr. void mark(int readli- Giri³ yolunda hangi konumda olundu§unu bildirir. mit) boolean markSuppor- Giri³ yolunun i³aretleri ve reset metodunu destekleyip ted() desteklemedi§ini test eder. abstract int read() Veri yolunda sonraki byte' okur. int read(byte[] b) Giri³ yolundan okudu§u byte'lar buerda b arrayine koyar. int read(byte[] b, int Giri³ yolundan n tane byte okur ve b arrayine koyar. o, int n) void reset() mark metodunu önceki ça§rdaki konumuna gönderir. long skip(long n) Giri³ yolunda n tane byte atlar (okumaz). Tablo 1.4: InputStream Snfnn Metotlar InputStream Snfnn Bildirimi java . lang . Object extended by java . i o . InputStream Tablo 1.4'den görüldü§ü gibi, InputStream snfnn soyut abstract int read ( ) metodu kaynaktan bir byte okur; okudu§u byte o anda metodun verdi§i de§erdir. E§er kaynakta okunacak byte kalmam³sa -1 de§erini verir. Gene listeden görüldü§ü gibi, InputStream snfnn soyut olmayan read() metotlar da vardr. Bunlar birden çok byte' bir seferde okuyan (ya da istenirse okumadan atlayan) metotlardr. Farkl i³levleri olan read() metotlar farkl parametreleriyle birbirlerinden ayrt edilirler (override). 1.7 OutputStream Snf 7 8 1. java.io paketi java . lang . Object j a v a . i o . OutputStream OutputStream Snfnn Klglad§ Arayüzler Closeable , Flushable , AutoCloseable OutputStream Snfnn Altsnar Tablo 1.5 OutputStream snfnn altsnarn göstermektedir. ByteArrayOutputStream FileOutputStream FilterOutputStream ObjectOutputStream OutputStream PipedOutput Stream Tablo 1.5: InputStream Snfnn Altsnar OutputStream snf, InputStream snfnn kar³l§dr. Bütün çk³ akm snarnn üstsnfdr. Çk³ birimine akm yazmak için gerekli yeteneklere sahip de§i³kenleri, metotlar ve altsnar içerir. 1.8 OutputStream Snfnn Tanm Program 1.8.1. public abstract class j a v a . i o . O u t p u t S t r e a m extends j a v a . l a n g . O b j e c t 4 { // öntanml public ( default ) kurucu OutputStream ( ) ; } FilterOutputStream Snfnn Altsnar Tablo 1.6 FilterOutputStream snfnn altsnarn gösteriyor. 1.9 OutputStream Snfnn Metotlar void close() Açk çk³ akmn kapatr ve onun kulland§ sistem kaynaklarn serbest brakr. 8 9 1.9. OutputStream Snfnn Metotlar BueredOutputStream CheckedOutputStream CipherOutputStream DataOutputStream DeaterOutputStream DigestOutputStream InaterOutputStream PrintStream Tablo 1.6: FilterOutputSream Snfnn Altsnar void ush() Çk³ yolunda ya da buer'da olan bütün verileri hedefe gönderir. void write(byte[ b)] b.length uzunluktaki byte array'i hedefe gönderir. void write(byte[ b, int m, int n)] m-inci byte'den ba³layarak n tane byte' hedefe gönderir. abstract void write(int b) b byte'n hedefe gönderir. OutputStream snfn kullanma teknikleri ile InputStream snfn kullanma teknikleri birbirlerine benzer. Byte Kopyala Program ?? Melih Cevdet Anday'n Defne Orman adl ³iirinin bir ktasn kopyalyor. iirin ilk ktasn "defne.txt" adyla, ByteKopyala.class bytecode dosyasnn oldu§u dizine koyunuz. Sonra komut satrndan java ByteKopyala deyimini yaznz. "defne.txt" dosyasnn "outDefne.txt" adyla kopyaland§n göreceksiniz. defne.txt: / ∗∗ DEFNE ORMANI 4 Köle sahipleri için felsefe Ekmeklerini 9 ekmek kaygusu yapyorlard , köleler veriyordu Köleler ekmek Felsefe yapmyorlard , köle sahipleri kaygusu çekmedikleri çünkü onlara ; çekmedikleri çünkü için ekmeklerini veriyordu onlara −−−M e l i h Cevdet ∗/ 9 . . . −−− Anday 10 1. java.io paketi Program 1.9.1. import import import java . io . FileInputStream ; java . i o . FileOutputStream ; java . i o . IOException ; 4 public class B y t e K o p y a l a { public static void main ( S t r i n g [ ] a r g s ) throws I O E x c e p t i o n FileInputStream i n = null ; F i l e O u t p u t S t r e a m o u t = null ; 9 try { i n = new F i l e I n p u t S t r e a m ( " d e f n e . t x t " ) ; o u t = new F i l e O u t p u t S t r e a m ( " o u t D e f n e . t x t " ) ; int c ; while 14 (( c = in . read ( ) ) −1) != { { out . w r i t e ( c ) ; } } 19 finally { if ( i n != null ) { in . close () ; } if ( out != null ) { out . c l o s e ( ) ; 24 } } } } / ∗∗ outDefne . t x t 3 ∗/ Karekter Kopyala Program 1.9.2 bir text dosyasn kopyalyor. Bunu yaparken byte akmlar yerine, dosyay karekter karekter kopyalyor. Program 1.9.2. 2 import import import java . io . FileReader ; java . io . FileWriter ; java . i o . IOException ; public class K a r e k t e r K o p y a l a { public static void main ( S t r i n g 10 [] args ) throws IOException { 11 1.9. OutputStream Snfnn Metotlar 7 FileReader giri³ = FileWriter çk³ = try 12 { giri³ = çk³ = int c ; while new new (( c null ; null ; F i l e R e a d e r ( "mca . t x t " ) ; F i l e W r i t e r ( " gitAnday . t x t " ) ; = g i r i ³ . read ( ) ) != −1) { ç k ³ . write ( c ) ; 17 } } finally { if ( g i r i ³ != null ) { g i r i ³ . close () ; } if 22 ( çk³ != null ) { çk³ . close () ; } } } 27 } Satr Kopyala Program 1.9.3 bir text dosyasn kopyalyor. Bunu yaparken byte byte ya da karekter karekter kopyalamak yerine, bir seferde bir satr kopyalyor. Program 1.9.3. import import 3 import import import 8 java . io . FileReader ; java . io . FileWriter ; java . i o . BufferedReader ; java . io . PrintWriter ; java . i o . IOException ; public class S a t r K o p y a l a { public static void main ( S t r i n g BufferedReader PrintWriter try 13 çk³Akm = [] args ) null ; null ; throws IOException = { giri³Akm new new String = BufferedReader ( çk³Akm 18 giri³Akm = PrintWriter ( new l ; 11 new F i l e R e a d e r ( "mca . t x t " ) ) ; F i l e W r i t e r ( "outMCA . t x t " ) ) ; { 12 1. java.io paketi while (( l = giri³Akm . readLine () ) null ) != { çk³Akm . println ( l ) ; } finally { if ( g i r i ³ A k m } 23 null ) != { giri³Akm . close () ; } if ( çk³Akm null ) != { çk³Akm . close () ; 28 } } } } Klavyeden Integer Oku Program 1.9.4 klavyeden girilen satr okuyor. Onu Integer tipe dönü³türüyor. Sonra saynn pozitif mi, negatif mi oldu§unu söylüyor. E§er klavyeden girilen atr Integer tipine dönü³emiyorsa, derleyici, NumberFormatException hatas atar. Program 1.9.4. import j a v a . i o . ∗ ; class NumberTest { 4 public static void main ( String [ ] { BufferedReader stdin InputStreamReader ( String 9 int = new args ) throws BufferedReader System . i n ) ( IOException new ) ; str ; num ; System . o u t . p r i n t l n ( " B i r str = stdin . readLine () ; num = Integer . parseInt ( tam say str ) ; // giriniz str , : ") ; i l g i l i snfa gömülüyor 14 if ( num < 0 ) // beklenen dallanma { System . o u t . p r i n t l n ( num + " says negatiftir ") ; } 19 else // beklenmeyen dallanma { System . o u t . p r i n t l n ( num + " } 12 says pozitiftir ") ; 13 1.9. OutputStream Snfnn Metotlar S y s t e m . o u t . p r i n t l n ( " Son " ) ; 24 } } / ∗∗ Bir tam say giriniz : 123 123 says pozitiftir 5 ∗/ Dosyadan Double Say Oku Program 1.9.5. package import import 5 import import import nio ; java . io . FileReader ; java . i o . BufferedReader ; java . i o . IOException ; java . u t i l . Scanner ; java . u t i l . Locale ; public class K e s i r l i { public static void main ( S t r i n g [ ] a r g s ) throws I O E x c e p t i o n { S c a n n e r s = null ; double sum = 0 ; try { s = new S c a n n e r ( 15 new B u f f e r e d R e a d e r ( new F i l e R e a d e r ( " p i . t x t " ) ) 10 ) ; s . u s e L o c a l e ( L o c a l e . US ) ; while ( s . h a s N e x t ( ) ) { if ( s . h a s N e x t D o u b l e ( ) ) 20 sum += } else { s . next ( ) ; } 25 } } finally { s . close () ; } 30 { s . nextDouble ( ) ; S y s t e m . o u t . p r i n t l n ( sum ) ; } } 13 14 / 1. java.io paketi ∗∗ 3.14159 3 ∗/ Program 1.9.6. package de . v o g e l l a . j a v a . i o ; 2 import import import import 7 import import java . i o . BufferedReader ; java . io . BufferedWriter ; java . i o . FileNotFoundException ; java . io . FileReader ; java . io . FileWriter ; java . i o . IOException ; public class public 12 MyFile String String String 17 = new = fileName ) { "" ; "" ; FileReader ( fileName ) ; BufferedReader while = file ; line { file readTextFile ( String returnValue FileReader try { (( line returnValue = reader = new BufferedReader ( f i l e ) ; reader . readLine () ) += line + != null ) { " \n" ; } 22 } } catch ( F i l e N o t F o u n d E x c e p t i o n e ) { throw new R u n t i m e E x c e p t i o n ( " F i l e n o t catch ( I O E x c e p t i o n e ) { throw new R u n t i m e E x c e p t i o n ( " IO E r r o r found " ) ; occured " ) ; } return 27 returnValue ; } public void 32 FileWriter try { output = writeTextFile ( String new writer = new writer . write ( s ) ; } catch ( IOException e) { e . printStackTrace () ; } } 42 String s) { FileWriter ( fileName ) ; BufferedWriter 37 fileName , output ; } 14 BufferedWriter ( output ) ; 15 1.9. OutputStream Snfnn Metotlar / ∗∗ 3 ∗/ Program 1.9.7. package 2 / ∗ ∗ ∗ javaio ; BinOITest . j a v a binary dosya program yazar ve onu okur ∗/ import 7 java . io . ∗; class Demo { public static void main ( S t r i n g [ ] DataOutputStream out = new args ) throws DataOutputStream ( FileOutputStream ( " binDosya " ) ) ; double x = 1 . 0 ; int c o u n t = 1 0 ; 12 out . w r i t e I n t ( count ) ; for ( int i = 0; i < count ; i ++) { out . writeDouble ( x ) ; 17 x = x / 9.0; } out . c l o s e ( ) ; DataInputStream new 22 count for ( = int in new = DataInputStream ( F i l e I n p u t S t r e a m ( " binDosya " ) ) ; in . readInt () ; i = 0; i < count ; i ++) { System . o u t . p r i n t l n ( i n . r e a d D o u b l e ( ) ) ; } } 27 } / ∗∗ 1.0 3 0.1111111111111111 0.012345679012345678 0.0013717421124828531 −4 −5 1 . 8 8 1 6 7 6 4 2 3 1 5 8 9 2 0 6 E−6 2 . 0 9 0 7 5 1 5 8 1 2 8 7 6 8 9 4 E−7 2 . 3 2 3 0 5 7 3 1 2 5 4 1 8 7 7 E−8 2 . 5 8 1 1 7 4 7 9 1 7 1 3 1 9 6 6 E−9 1 . 5 2 4 1 5 7 9 0 2 7 5 8 7 2 5 6E 1 . 6 9 3 5 0 8 7 8 0 8 4 3 0 2 8 6E 8 ∗/ Program 1.9.8. 15 IOException new { 16 1. java.io paketi package javaio ; ∗ 3 ∗ DataInputStreamDemo . j a v a ∗ b i r g i r i ³ akm y a r a t r ∗ v e r i okur ∗/ import j a v a . i o . ∗ ; / 8 class DataInputStreamDemo public static void try 13 // a file FileInputStream 18 // // 23 args ) input fis stream = F i l e I n p u t S t r e a m ( " oku . t x t " ) ; Create a data DataInputStream new main ( S t r i n g [ ] { Create new { input dis stream = DataInputStream ( f i s ) ; Read and display data System . o u t . p r i n t l n ( d i s . r e a d B o o l e a n ( ) ) ; System . o u t . p r i n t l n ( d i s . r e a d B y t e ( ) ) ; System . o u t . p r i n t l n ( d i s . readChar ( ) ) ; System . o u t . p r i n t l n ( d i s . r e a d D o u b l e ( ) ) ; System . o u t . p r i n t l n ( d i s . r e a d F l o a t ( ) ) ; 28 System . o u t . p r i n t l n ( d i s . r e a d I n t ( ) ) ; System . o u t . p r i n t l n ( d i s . readLong ( ) ) ; System . o u t . p r i n t l n ( d i s . r e a d S h o r t ( ) ) ; // 33 Close file input stream f i s . close () ; } catch ( E x c e p t i o n e) { System . o u t . p r i n t l n ( " E x c e p t i o n : } 38 } } 1 / ∗∗ true 114 ? 1.0218 6 1.0429 892739 332827 13108 ∗/ 16 " + e) ; { 17 1.10. Al³trmalar Program 1.9.9. package // : i o / StoringAndRecoveringData . java import 5 javaio ; java . io . ∗; public class S t o r i n g A n d R e c o v e r i n g D a t a { public static void main ( S t r i n g [ ] a r g s ) throws I O E x c e p t i o n D a t a O u t p u t S t r e a m o u t = new D a t a O u t p u t S t r e a m ( new { BufferedOutputStream ( new 10 F i l e O u t p u t S t r e a m ( " Data . t x t " ) ) ) ; out . writeDouble ( 3 . 1 4 1 5 9 ) ; o u t . writeUTF ( " That was pi ") ; out . writeDouble ( 1 . 4 1 4 1 3 ) ; o u t . writeUTF ( " S q u a r e root out . c l o s e ( ) ; 15 DataInputStream in new = of 2" ) ; DataInputStream ( new BufferedInputStream ( new F i l e I n p u t S t r e a m ( " Data . t x t " ) ) ) ; System . o u t . p r i n t l n ( i n . r e a d D o u b l e ( ) ) ; 1 / // Only // Java readUTF ( ) −UTF will String recover the properly : ∗∗ ∗/ 1.10 Al³trmalar Program 1.10.1, a dizini içindeki "vatan.txt" dosyasn, b dizini içindeki "out- Vatan.txt" adl dosyaya yazyor (kopyalyor). Programn kaynak ve hedef dizinleri bulabilmesi için, DosyaKopyala.class adl bytecode'un bulundu§u dizin içinde a alt dizini ile b alt dizinini yaratnz. dosyasn koyunuz. vatan.txt: VATAN ÇN Neler yapmadk ³u vatan için! Kimimiz öldük; Kimimiz nutuk söyledik. ---Orhan Veli Kank--17 a dizini içine "vatan.txt" 18 1. java.io paketi Program 1.10.1. 1 package import import import 6 import javanio ; java . io . FileInputStream ; java . i o . FileOutputStream ; java . nio . ByteBuffer ; java . nio . channels . FileChannel ; public class DosyaKopyala static public void 11 { main ( S t r i n g FileInputStream gelenDosya args [ ] ) = new vatan . t x t " ) ; FileOutputStream gidenDosya = new throws Exception { FileInputStream ( " . / a/ F i l eO u t p ut S t r ea m ( " . / b/ outVatan . out " ) ; FileChannel gelenKanal = gelenDosya . getChannel ( ) ; FileChannel gidenKanal = gidenDosya . getChannel ( ) ; 16 ByteBuffer bb = ByteBuffer . a l l o c a t e (1024) ; while ( true ) { int c h = g e l e n K a n a l . r e a d ( bb ) ; if ( c h == −1) { break ; 21 } bb . f l i p ( ) ; g i d e n K a n a l . w r i t e ( bb ) ; 26 bb . c l e a r ( ) ; } } } 1 / ∗∗ . / b/ outVatan . t x t dosyas ∗/ Açklamalar: Kaynak dosyann okunaca§ dizin ile hedef dosyann yazlaca§ dizinlerin varolmas gerekir. Aksi halde, derleyici hata atar. Kaynak dosyann okunaca§ a dizini yoksa, derleyici java . i o . FileNotFoundException : yolu . \ a\ vatan . t x t bulamyor ) hata iletisini; heden yazlaca§ b dizini yoksa, 18 ( Sistem belirtilen 19 1.10. Al³trmalar java . i o . FileNotFoundException : belirtilen yolu . \ b\ o u t E i n s t e i n . t x t ( Sistem bulamyor ) hata iletisini atar. 11. ve 12. satrlardaki FileInputStream gelenDosya = new vatan . t x t " ) ; FileOutputStream gidenDosya = new FileInputStream ( " . / a/ F i l eO u t pu t S t re a m ( " . / b/ outVatan . out " ) ; deyimler, srasyla, giri³ akm (input stream) ile çk³ akm (output stream) nesnelerini yaratrlar. 14.ve 15 satrlardaki FileChannel gelenKanal = gelenDosya . getChannel ( ) ; FileChannel gidenKanal = gidenDosya . getChannel ( ) ; deyimleri, srasyla giri³ ve çk³ kanallarn (nesnelerini) yaratrlar. 17.satrkaki ByteBuffer bb = ByteBuffer . a l l o c a t e (1024) ; deyimi, kaynaktan gelip hedefe giden verinin geçici süreyle içinde duraca§ bb adl veri kabna (buer) ana bellekte yer açar. Açlan buer 1024 byte uzunluktadr. Kaynaktan srayla gelen veriler (byte) buraya bir array halinde yerle³eceklerdir. 19.satrdaki while döngüsü, kaynak dosyann ba³ndan ba³lar, sonuna kadar her seferinde bir byte (8 bit) veriyi alr ve bb ye koyar. Aslnda bu i³i yapan deyim 20.satrdaki int ch = g e l e n K a n a l . r e a d ( bb ) ; deyimidir. Bu deyim, kaynaktan gelen 1 byte' bb içine koyar. While döngüsü, bu eylemi, okunacak veri (byte) kalmayana kadar tekrarlar. Giri³ kanalndan −1 geldi§inde, döngü, kaynak dosyann sonuna gelindi§ini, dolaysyla dosyada okunacak ba³ka veri kalmad§ anlar. Bu olay olunca, break deyimi while döngüsünü durdurur. 24.satrdaki bb . f l i p ( ) ; deyimi, bb nin giri³ kapsn kapatr, çk³ kapsn açar. 19 20 1. java.io paketi 25.satrdaki g i d e n K a n a l . w r i t e ( bb ) ; deyimi, bb içindeki bütün veriyi çk³ kanalna gönderir; o kanal veriyi hedef dosyaya yazar. bb . c l e a r ( ) ; deyimi, buerdaki bütün verinin gidi³ kanalna gitmesini; böylece buer'n tamamen bo³altlmasn sa§lar. Bu eylem, buerda veri kalma olasl§n ortadan kaldrr; çünkü kalanlar varsa onlarn hepsini çk³ kanalna gönderir. 1.11 Al³trmalar 20 Kaynakça 21 Dizin ObjectInputStream, 6, 8 öntanml, 8 out, 3 API, 2 OutputStream Snf, 7 AudioInputStream, 6, 8 AutoCloseable, 6, 8 PipedInputStream, 6, 8 available(), 7 reset(), 7 byte, 4 RMI, 2 byte akmlar, 5 byte streams, 5 SequenceInputStream, 6, 8 ByteArrayInputStream, 6, 8 skip(), 7 soyut snf, 4 character streams, 5 StringBuerInputStream, 6, 8 close(), 7, 8 Closeable, 6, 8 Unicode, 4 err, 3 write(), 8 write(byte[] b), 8 FileInputStream, 6, 8 write(byte[] b, int m, int n), 8 FilterInputStream, 6, 8 write(int b), 8 ush(), 8 giri³/çk³, 1 I/O, 1 in, 3 Input Output Stream, 5 input/output, 1 InputStream, 6, 8 java.io, 1, 7 java.io Paketi, 4 JavaBeans, 2 JFC, 2 karekter akmlar, 5 kurucu, 8 mark(), 7 22