65
LUNG I/O
Mc tiêu ca môn hc
Kt thúc chng, bn có có th :
cp đn các khái nim v lung
Mô t các lp InputStream và OutputStream
Mô t I/O mng Byte
Thc hin các tác v đm I/O và lc
Dùng lp RandomAccesFile.
Mô t các tác v chui I/O và ký t
Dùng lp PrinterWriter
9.1 Gii thiu
Trong bui hc trc, chúng ta đã hc v các dòng Synchronized. ngn các dòng
xy ra vic chia s (dùng chung) các đi tng mt cách đng thi. Toàn b tin trình
này đc qun lý bi c ch đi thông báo (wait-notify). Phng thc wait() báo cho
dòng gi t b monitor và nhp vào trng thái ng cho đn khi các dòng khác nhp vào
cùng monitor và gi phng thc notify(). Phng thc notify() và notifyAll() to ra
dòng thông báo cho các dòng khác gi phng thc wait() ca cùng đi tng. Trong bài
hc trc, chúng ta cng hc v các điu kin b tc là gì và cách tránh chúng.
Chng này gii thiu khái nim v lung. Chúng ta cng tho lun các lp khác
nhau trong gói java.io tr giúp các tác v nhp xut.
9.2 Các lung
Theo thut ng chung, lung là mt dòng lu chuyn. trong thut ng v k thut
lung là mt l trình mà d liu đc truyn trong mt chng trình. Mt ng dng v
các lung ma ta đã quen thuc đó là lung nhp System.in .
Lung là nhng dàn ng (pipelines) đ gi và nhn thông tin trong các chng
trình java. Khi mt lung d liu đc gi hoc nhân, ta tham chiu nó nh đang “ghi”
và “đc” mt lung theo th t nêu trên. Khi mt lung đc đc hay ghi, các dòng khác
b phong to. Nu có mt li xy ra khi đc hay ghi lung, mt IOexception đc kích
hot. Do vy, các câu lnh lung phi bao gm khi try-catch.
Lp ‘java.lang.System’ đnh ngha các lung nhp và xut chun. chúng là các
lp chính ca các lung byte mà java cung cp. Chúng ta cng đã s dng các lung xut
đ xut d liu và hin th kt qu trên màn hình. Lung I/O bao gm:
:
Lp System.out: Lung xut chun dùng đ hin th kt qu trên màn hình.
Lp System.in: Lung nhp chun thng đn t bàn phím và đc dùng đ đc
các ký t d liu.
Lp System.err: ây là lung li chun.
66
Các lp ‘InputStream’ và ‘OutputStream’ cung cp nhiu kh nng I/O khác nhau. C
hai lp này có các lp con đ thc hin I/O thông qua các vùng đm b nh, các tp
tin và ng dn. Các lp con ca lp InputStream thc hin đu vào, trong khi các lp
con ca lp OutputStream thc hin kt xut.
9.3Gói java.io
Các lung h thng rt có ích. Tuy nhiên, chúng không đ mnh đ dùng khi ng phó vi
I/O thc t. Gói java.io phi đc nhp khu vì mc đích này. Chúng ta s tho lun tìm
hiu v các lp thuc gói java.io.
9.3.1 lp InputStream
Lp InputStream là mt lp tru tng. Nó đnh ngha cách nhn d liu. im quan
trng không nm ch d liu đ t đâu, mà là nó có th truy cp. Lp InputStream cung
cp mt s phng pháp đ đc và dùng các lung d liu đ làm đu vào. Các phng
thc này giúp ta to, đc và x lý các lung đu vào. Các phng thc đc hin trong
bn 9.1
Tên phng thc Mô t
read() c các byte d liu t mt lung. Nu
nh không d liu nào là hp l, nó khoá
phng thc. Khi mt phng thc đc
khoá, các dòng thc hin đc ch cho đn
khi d liu hp l.
read (byte []) tr v byte đc ‘đc’ hay ‘-1’, nu nh kt
thúc ca mt lung đã đn. nó kích hot
IOException nu li xy ra.
read (byte [], int, int) Nó cng đc vào mng byte. Nó tr v s
byte thc s đc đc. Khi kt thúc ca
mt lung đã đn. nó kích hot
IOException nu li xy ra.
available() Phng pháp này tr v s lng byte có
th đc đc mà không b phong to. Nó
tr v s byte hp l. Nó không phi là
phng thc hp l đáng tin cy đ thc
hin tin trình x lý đu vào.
close() Phng thc này đóng lung. Nó dùng đ
phóng thích mi tài nguyên kt hp vi
lung. Luôn luôn đóng lung đ chc chn
rng lung x lý đc kt thúc. Nó kích
hot IOException nu li xy ra.
mark() ánh du v trí hin ti ca lung.
markSupporte() tr v giá tr boolean nêu rõ lung có h tr
các kh nng mark và reset hay không. Nó
tr v đúng nu lung h tr nó bng
không là sai.
reset() Phng thc này đnh v li lung theo v
67
trí đc đánh du chót. Nó kích hot
IOException nu li xy ra.
skip() Phng thc này b qua ‘n’ byte đu vào.
’-n’ ch đnh s byte đc b qua. Nó kích
hot IOException nu li xy ra. Phng
thc này s dng đ di chuyn ti v trí đc
bit bên trong lung đu vào.
Table 9.1 InputStream Class Methods
9.3.2 Lp OutputStream
Lp OutputStream cng là lp tru tng. Nó đnh ngha cách ghi các kt xut đn
lung. Nó cung cp tp các phng thc tr giúp to ra, ghi và x lý kt xut các lung.
Các phng thc bao gm:
Tên phng thc Mô t
write(int) Phng thc này ghi mt byte
write(byte[]) Phng thc này phong to cho đn khi
mt byte đc ghi. lung ch cho đn khi
tác v ghi hoàn tt. Nó kích hot
IOException nu li xy ra.
write(byte[],int,int) Phng thc này cng ghi mng các byte.
Lp OutputStream đnh ngha ba dng quá
ti ca phng thc này đ cho phép
phng thc write() ghi mt byte riêng l,
mng các byte, hay mt đon ca mt
mng.
flush() Phng thc này x sch lung.
đm d liu đc ghi ra lung kt xut. Nó
kích hot IOException nu li xy ra.
close() Phng thc đóng lung.
Nó đc dùng đ gii phóng mi tài
nguyên kt hp vi lung. Nó kích hot
IOException nu li xy ra.
Bng 9.2 Các phng thc lp OutputStream
9.3.3 Nhp và xut mng byte
Các lp ‘ByteArrayInputStream’ và ‘ByteArrayOutputStream’ s dng các đm
b nh. Không cn thit phi dùng chúng vi nhau.
Lp ByteArrayInputStream
Lp này to lung đu vào t b nh đm. Nó là mng các byte. Lp này không h tr
các phng thc mi. Ngc li nó chy đè các phng thc ca lp InputStream nh
‘read() ‘, ‘skip()’, ‘available()’ và ‘reset()’.
Lp ByteArrayOutputStream
68
Lp này to ra lung kt sut trên mt mng các byte. Nó cng cung cp các kh nng b
sung đ mng kt sut tng trng nhm mc đích cha ch cho mng đc ghi. Lp này
cng cung cp các phng thc ‘toByteArrray()’ và ‘toString()’. Chúng đc dùng đ
chuyn đi lung thành mt mng byte hay đi tng chui.
Lp ByteArrayOutputStream cng cung cp hai phng thc thit lp. Mt chp nhn
mt đi s s nguyên dùng đ n đnh mng byte kt xut theo mt kích c ban đu. và
th hai không chp nhn đi s nào, và thit lp đm kt xut vi kích thc mc đnh.
lp này cung cp vài phng thc b sung, không đc khai báo trong OutputStream:
reset()
Thit lp li kt xut vùng đm nhm cho phép tin trình ghi khi đng li ti đu
vùng đm.
size()
Tr v s byte hin ti đã đc ghi ti vùng đm.
writeto()
Ghi ni dung ca vùng đm kt xut ra lung xut đã ch đnh. thc hin, nó chp
nhn mt đi tng ca lp OutputStream làm đi s.
Chng trình 9.1 s dng lp ‘ByteArrayInputStream’ và ‘ByteArrayOutputStream’ đ
nhp và xut:
Program 9.1
import java.lang.System;
import jva.io.*;
public class byteexam
{
public static void main(String args[]) throws IOException
{
ByteArrayOutputStream os =new ByteArrayOutputStream();
String s ="Welcome to Byte Array Input Outputclasses";
for(int i=O; i<s.length( );i++)
os. write (s.charAt(i) ) ;
System.out.println("Output Stream is:" + os);
System.out.println("Size of output stream is:"+ os.size());
ByteArraylnputStream in;
in = new ByteArraylnputStream(os.toByteArray());
int ib = in.available();
System.out.println("Input Stream has :" + ib + "available bytes");
byte ibufl ] = new byte[ib];
int byrd = in.read(ibuf, 0, ib);
System.out.println("Number of Bytes read are :" + byrd);
System.out.println("They are: " + new String(ibut));
}
}
69
Hình 9.1 Xut hin kt xut ca chng trình:
Hình 9.1: s dng 1 s dng lp ‘ByteArrayInputStream’ và
‘ByteArrayOutputStream’ cho nhp và xut.
9.3.4 Nhp và xut tp tin
Java h tr các tác v nhp và xut tp tin vi s tr giúp các lp sau đây:
File
FileDescriptor
FileInputStream
FileOutputStream
Java cng h tr truy cp nhp và xut ngu nhiên hoc trc tip bng các lp
‘File’,’FileDescriptior’, và ‘RandomAccesFile’.
Lp File
Lp này đc s dng đ truy cp các đi tng tp tin và th mc. Các tp tin
đt tên theo qui c đt tên tp tin ca h điu hành ch. Các qui c này đc
gói riêng bng các hng lp File. Lp này cung cp các thit lp các tp tin và các
th mc. Các thit lp chp nhn các đng dn tp tin tuyt đi ln tng đi
cùng các tp tin và th mc. Tt c các tác v th mc và tp tin chung đc thc
hin thông qua các phng thc truy cp ca lp File.
Các phng thc:
Cho phép bn to, xoá, đi tên các file.
Cung cp kh nng truy cp tên đng dn tp tin.
Xác đnh đi tng có phi tp tin hay th mc không.
Kim tra s cho phép truy cp đc và ghi.
Ging nh các phng thc truy cp, các phng thc th mc cng cho phép
to, xoá, đt tên li và lit kê các th mc. Các phng pháp này cho phép các
cây th mc đang chéo bng cách cung cp kh nng truy cp các th mc cha và
th mc anh em.
Lp FileDescriptor
Lp này cung cp kh nng truy cp các mô t tp tin mà h điu hành duy trì khi các
tp tin và th mc đang đc truy cp. Lp này không cung cp tm nhìn đi vi
thông tin c th do h điu hành duy trì. Nó cung cp ch mt phng thc có tên
‘valid()’, giúp xác đnh mt đi tng mô t tp tin hin có hp l hay không.
70
Lp FileInputStream
Lp này cho phép đc đu vào t mt tp tin di dng mt lung. Các đi tng ca
lp này đc to ra nh dùng mt tp tin String, File, hoc mt đi tng
FileDescriptor làm mt đi s. Lp này chng lên các phng thc ca lp
InputStream. Nó cng cung cp các phng thc ‘finalize()’ và ‘getFD()‘.
Phng thc ‘finalize()‘ đc dùng đ đóng lung khi đang đc b gôm rác Java x
lý. Phng thc ‘getFD()’ tr v đi tng FileDescriptor biu th s kt ni đn tp
tin thc t trong h tp tin đang đc ‘FileInputStream’ s dng.
Lp FileOutputStream
Lp này cho phép ghi kt xut ra mt lung tp tin. Các đi tng ca lp này cng
to ra s dng các đi tng chui tên tp tin, tp tin, FileDesciptor làm tham s. Lp
này chng lên phng thc ca lp OutputStream và cung cp phng thc
‘finalize()’ và getFD().
Chng trình 9.2
import java..io.FileOutputStream;
import java.io.FileInputStream;
import java.io.File;
import java.io.IOException;
public class fileioexam
{
public static void main(String args[ ]) throws IOException
{
// creating an output file abc.txt
FileOutputStream os = new FileOutputStream("abc.txt");
String s = "Welcome to File Input Output Stream " ;
for(int i = 0; i< s.length( ); + +i) .
os. write(s.charAt(i));
os.close();
II opening abc.txt for input
FileInputStream is = new FileInputStream("abc.txt");
int ibyts = is.available( );
System.out.println("Input Stream has " + ibyts + " available bytes");
byte ibuf[ ] = new byte[ibyts];
int byrd = is.read(ibuf, 0, ibyts);
System.out.println("Number of Bytes read are: " + byrd);
System.out.println("They are: " + new String(ibuf));
is.close();
File fl = new File("abc.txt");
fl.delete();
}
}
Hình 9.2 hin kt xut ca đon mã ngun trên:
71
Hình 9.2 s dng FileInputStream, FileOutputStream, và các lp File
9.3.5 Nhp xut đã lc
Mt ‘Filter’ là mt kiu lung sa đi cách điu qun mt lung hin tn ti. Các lp, các
lung nhp xut đã lc ca java s giúp ta lc I/O theo mt s cách. V c bn, các b lc
này dùng đ thích ng các lung theo các nhu cu ca chng trình c th.
B lc nm gia mt lung nhp và mt lung xut. Nó thc hin x lý mt tin trình
đc bit trên các byte đc truyn t đu vào đn kt xut. Các b lc có th phi hp
thc hin dãy tun t các tu chn lc đó mi b lc tác đng nh kt xut ca mt b
lc khác.
Lp FilterInputStream
ây là lp tru tng. Nó là cha ca tt c các lp lung nhp đã lc. Lp này cung
cp kh nng to ra mt lung t lung khác. Mt lung có th đc đc và cung cp
di dng kt xut cho lung khác. Bin ‘in’ đc s dng đ làm điu này. Bin này
đc dùng đ duy trì mt đi tng tách bit ca lp InputStream. Lp
FilterInputStream đc thit k sao cho có th to nhiu b lc kt xích [chained
filters]. thc hin điu này chúng ta dùng vài tng lng ghép. đn lt mi lp s
truy cp kt xut ca lp trc đó vi s tr giúp ca bin ‘in’.
Lp FilterOutputStream
Lp này là mt dng b tr cho lp FilterInputStream. Nó là lp cha ca tt c các
lp lung xut đã lc. Lp này tng t nh lp FilterInputStream ch nó duy trì
đi tng ca lp OutputStream làm mt bin ‘out’. D liu ghi vào lp này có th
sa đi theo nhu cu đ thc hin tác v lc và sau đó đc chuyn gi ti đi tng
OutputStream.
9.3.6 I/O có lp vùng đm
Vùng đm là kho lu tr d liu. Chúng ta có th ly d liu t vùng đm thay vì quay
tr li ngun ban đu ca d liu.
Java s dng c ch nhp/xut có lp vùng đm đ tm thi lp cache d liu đc đc
hoc ghi vào/ra mt lung. Nó giúp các chng trình đc/ghi các lng d liu nh mà
không tác đng ngc lên kh nng thc hin ca h thng.
Trong khi thc hin nhp có lp vùng đm, s lng byte ln đc đc ti thi đim này,
và lu tr trong mt vùng đm nhp. khi chng trình đc lung nhp, các byte d liu
đc đc t vùng đm nhp.