java.io Paketi Nedir?

advertisement
ç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
Download