Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
455,57 KB
Nội dung
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() Phn
g
thc nà
y
đnh v li lun
g
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.
72
Tin trình lp vùng đm kt xut cng thc hin tng t. khi d liu đc mt chng
trình ghi ra mt lung, d liu kt xut đc lu tr trong mt vùng đm xut. D liu
đc lu tr đn khi vùng đm tr nên đy hoc các lung kt xut đc x trng. Cui
cùng kt xut có lp vùng đm đc chuyn gi đn đích ca lung xut.
Các b lc hot đng trên vùng đm. Vùng đm đc phân b nm gia chng trình và
đích ca lung có lp vùng đm.
Lp BufferedInputStream
Lp này t đng to ra và cha đng vùng đm đ h tr vùng đm nhp. Nh đó
chng trình có th đc d liu tng lung theo byte mt mà không nh hng đn kh
nng thc hin ca h thng. Bi lp ‘BufferedInputStream’ là mt b lc, nên có th áp
dng nó cho mt s đi tng nht đnh ca lp InputStream và cng có th phi hp vi
các tp tin đu vào khác.
Lp này s dng vài bin đ thc hin các c ch lp vùng đm đu vào. Các bin này
đc khai báo là protected và do đó chng trình không th truy cp trc tip. Lp này
đnh ngha hai
phng thc thit lp. Mt cho phép ch đnh kích c ca vùng đm nhp
trong khi đó phng thc thit lp kia thì không. Nhng c hai phng thc thit lp đu
tip nhn đi tng ca lp InputStream và OutputStream làm đi s. lp này chng lên
các phng thc truy cp mà InputStream cung cp và không làm ny sinh bt kì phng
thc mi nào.
Lp BufferedInputStream. Lp này cng đnh ngha hai phng thc thit lp. nó cho
phép ch đnh kích c ca vùng đm xut trong mt phng thc thit lp cng nh cung
cp mt kích c vùng đm ngm đnh. Nó chng lên tt c các phng thc ca
OutputStream và không làm ny sinh bt kì phng thc nào.
Chng trình 9.3 di đây mô t cách dùng các lung nhp/xut có lp vùng đm:
Chng trình 9.3
import javaJang. * ;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.SequenceInputStream;
import java.io.IOException;
publicI class buff exam
{
public static void main(String args[ ]) throws IOException
{
// defining sequence input stream
SequenceInputStream Seq3;
FileInputStream Fis 1 ;
Fisl = new FileInputStream("byteexam.java");
FileInputStream Fis2;
Fis2= new FileInputStream("fileioexam.java");
Seq3 = new SequenceInputStream(Fisl, Fis2);
73
// create buffered input and output streams
BufferedInputStream inst;
inst .= new BufferedInputStream(Seq3);
BufferedOutputStream oust;
oust= new BufferedOutputStream(System.out);
inst.skip(lOOO);
boolean eof = false;
int bytcnt = 0;
while(!eof)
{
int num = inst.read();
if(num = = -1)
{
eof =true;
}
else
{
oust.write((char) num);
+ + bytcnt;
}
}
String bytrd ,= String.valueOf(bytcnt);
bytrd + = "bytes were read";
oust.write(bytrd.getBytes(). 0, bytrd.length());
// close all streams.
inst.close();
oust.close();
Fisl.close();
Fis2.close();
}
}
Hình 9.3 hin kt xut ca chng trình trên:
Hình 9.3 S dng các lp vùng đm lung nhp và xut.
74
9.3.7 Lp Reader và Writer
ây là các lp tr tng. Chúng nm ti đnh ca h phân cách lp, h tr vic
đc và ghi các lung ký t unicode.java 1.1 thc t đã gii thiu các lp này.
Lp Reader
Lp này h tr các phng thc:
read( )
reset( )
skip( )
mark( )
markSupported( )
close( )
Lp này cng h tr phng thc gi ‘ready()’. Phng thc này tr v giá tr kiu
boolean nu rõ tác v đc k tip có tip tc mà không phong to hay không.
Lp Writer
Lp này h tr các phng thc:
write( )
flush( )
close( )
9.3.8 Nhp/ xut chui và xâu ký t
Các lp ‘CharArrayReader’ và ‘CharArrayWriter’ cng tng t nh các lp
ByteArrayInputStream và ByteArrayOutputStream ch chúng h tr nhp/xut t các
vùng đm nh. Các lp CharArrayReader và CharArrayWriter h tr nhp/ xut ký t 8
bit.
CharArrayReader không h tr b sung các phng pháp sau đây vào các phng thc
ca lp Reader cung cp. Lp CharArrayWriter b sung các phng thc sau đây vào các
phng thc ca lp Writer.
reset( )
thit lp li vùng đm
size( )
tr v kích c hin hành ca vùng đm
toCharArray( )
Tr v bn sao mng ký t ca vùng đm xut
toString( )
Chuyn đi vùng đm xut thành mt đi tng String
writeTo( )
Ghi vùng đm ra mt lung xut khác.
Lp StringReader tr giúp lung nhp ký t t mt chui. Nó không b sung phng
thc nào vào lp Reader.
Lp StringWriter tr giúp ghi lung kt xut ký t ra mt đi tng StringBuffer. Lp
này b sung hai phng thc có tên là ‘getBuffer( )’ và ‘toString()’ . Phng thc
‘getBuffer( )’ tr v đi tng StringBuffer tng ng vi vùng đm xut, trong khi đó
phng thc toString( ) tr v mt bng sao chui ca vùng đm xut.
[...]... import java. lang.System; import java. io.StringReader; import java. io.StringWriter; import java. io.IOException; import java. io * ; public class strioexam { public static void main(String args[ ]) throws IOException { StringWriter ost = new StringWriter( ); String s = "Welcome to String Input Output Program"; for(int i= 0; i . 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. lp vùng đm:
Chng trình 9.3
import javaJang. * ;
import java. io.BufferedInputStream;
import java. io.BufferedOutputStream;
import java. io.FileInputStream;