Tải bản đầy đủ (.pdf) (19 trang)

Luồng IO với CoreJava 9 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (455.57 KB, 19 trang )

65
LUNG I/O
Mc tiêu ca môn hc

Kt thúc chng, bn có có th :

  cp đn các khái nim v lung
 Mô t các lp InputStream và OutputStream
 Mô t I/O mng Byte
 Thc hin các tác v đm I/O và lc
 Dùng lp RandomAccesFile.
 Mô t các tác v chui I/O và ký t
 Dùng lp PrinterWriter
9.1 Gii thiu
Trong bui hc trc, chúng ta đã hc v các dòng Synchronized. ngn các dòng
xy ra vic chia s (dùng chung) các đi tng mt cách đng thi. Toàn b tin trình
này đc qun lý bi c ch đi thông báo (wait-notify). Phng thc wait() báo cho
dòng gi t b monitor và nhp vào trng thái ng cho đn khi các dòng khác nhp vào
cùng monitor và gi phng thc notify(). Phng thc notify() và notifyAll() to ra
dòng thông báo cho các dòng khác gi phng thc wait() ca cùng đi tng. Trong bài
hc trc, chúng ta cng hc v các điu kin b tc là gì và cách tránh chúng.

Chng này gii thiu khái nim v lung. Chúng ta cng tho lun các lp khác
nhau trong gói java.io tr giúp các tác v nhp xut.
9.2 Các lung
Theo thut ng chung, lung là mt dòng lu chuyn. trong thut ng v k thut
lung là mt l trình mà d liu đc truyn trong mt chng trình. Mt ng dng v
các lung ma ta đã quen thuc đó là lung nhp System.in .

Lung là nhng dàn ng (pipelines) đ gi và nhn thông tin trong các chng
trình java. Khi mt lung d liu đc gi hoc nhân, ta tham chiu nó nh đang “ghi”


và “đc” mt lung theo th t nêu trên. Khi mt lung đc đc hay ghi, các dòng khác
b phong to. Nu có mt li xy ra khi đc hay ghi lung, mt IOexception đc kích
hot. Do vy, các câu lnh lung phi bao gm khi try-catch.

Lp ‘java.lang.System’ đnh ngha các lung nhp và xut chun. chúng là các
lp chính ca các lung byte mà java cung cp. Chúng ta cng đã s dng các lung xut
đ xut d liu và hin th kt qu trên màn hình. Lung I/O bao gm:
:
 Lp System.out: Lung xut chun dùng đ hin th kt qu trên màn hình.
 Lp System.in: Lung nhp chun thng đn t bàn phím và đc dùng đ đc
các ký t d liu.
 Lp System.err: ây là lung li chun.
66

Các lp ‘InputStream’ và ‘OutputStream’ cung cp nhiu kh nng I/O khác nhau. C
hai lp này có các lp con đ thc hin I/O thông qua các vùng đm b nh, các tp
tin và ng dn. Các lp con ca lp InputStream thc hin đu vào, trong khi các lp
con ca lp OutputStream thc hin kt xut.
9.3Gói java.io
Các lung h thng rt có ích. Tuy nhiên, chúng không đ mnh đ dùng khi ng phó vi
I/O thc t. Gói java.io phi đc nhp khu vì mc đích này. Chúng ta s tho lun tìm
hiu v các lp thuc gói java.io.
9.3.1 lp InputStream
Lp InputStream là mt lp tru tng. Nó đnh ngha cách nhn d liu. im quan
trng không nm  ch d liu đ t đâu, mà là nó có th truy cp. Lp InputStream cung
cp mt s phng pháp đ đc và dùng các lung d liu đ làm đu vào. Các phng
thc này giúp ta to, đc và x lý các lung đu vào. Các phng thc đc hin trong
bn 9.1
Tên phng thc Mô t
read() c các byte d liu t mt lung. Nu

nh không d liu nào là hp l, nó khoá
phng thc. Khi mt phng thc đc
khoá, các dòng thc hin đc ch cho đn
khi d liu hp l.
read (byte []) tr v byte đc ‘đc’ hay ‘-1’, nu nh kt
thúc ca mt lung đã đn. nó kích hot
IOException nu li xy ra.
read (byte [], int, int) Nó cng đc vào mng byte. Nó tr v s
byte thc s đc đc. Khi kt thúc ca
mt lung đã đn. nó kích hot
IOException nu li xy ra.
available() Phng pháp này tr v s lng byte có
th đc đc mà không b phong to. Nó
tr v s byte hp l. Nó không phi là
phng thc hp l đáng tin cy đ thc
hin tin trình x lý đu vào.
close() Phng thc này đóng lung. Nó dùng đ
phóng thích mi tài nguyên kt hp vi
lung. Luôn luôn đóng lung đ chc chn
rng lung x lý đc kt thúc. Nó kích
hot IOException nu li xy ra.
mark() ánh du v trí hin ti ca lung.
markSupporte() tr v giá tr boolean nêu rõ lung có h tr
các kh nng mark và reset hay không. Nó
tr v đúng nu lung h tr nó bng
không là sai.
reset() Phn
g
thc nà
y

đnh v li lun
g
theo v
67
trí đc đánh du chót. Nó kích hot
IOException nu li xy ra.
skip() Phng thc này b qua ‘n’ byte đu vào.
’-n’ ch đnh s byte đc b qua. Nó kích
hot IOException nu li xy ra. Phng
thc này s dng đ di chuyn ti v trí đc
bit bên trong lung đu vào.

Table 9.1 InputStream Class Methods
9.3.2 Lp OutputStream
Lp OutputStream cng là lp tru tng. Nó đnh ngha cách ghi các kt xut đn
lung. Nó cung cp tp các phng thc tr giúp to ra, ghi và x lý kt xut các lung.
Các phng thc bao gm:
Tên phng thc Mô t
write(int) Phng thc này ghi mt byte
write(byte[]) Phng thc này phong to cho đn khi
mt byte đc ghi. lung ch cho đn khi
tác v ghi hoàn tt. Nó kích hot
IOException nu li xy ra.
write(byte[],int,int) Phng thc này cng ghi mng các byte.
Lp OutputStream đnh ngha ba dng quá
ti ca phng thc này đ cho phép
phng thc write() ghi mt byte riêng l,
mng các byte, hay mt đon ca mt
mng.
flush() Phng thc này x sch lung.

đm d liu đc ghi ra lung kt xut. Nó
kích hot IOException nu li xy ra.
close() Phng thc đóng lung.
Nó đc dùng đ gii phóng mi tài
nguyên kt hp vi lung. Nó kích hot
IOException nu li xy ra.

Bng 9.2 Các phng thc lp OutputStream
9.3.3 Nhp và xut mng byte
Các lp ‘ByteArrayInputStream’ và ‘ByteArrayOutputStream’ s dng các đm
b nh. Không cn thit phi dùng chúng vi nhau.

 Lp ByteArrayInputStream
Lp này to lung đu vào t b nh đm. Nó là mng các byte. Lp này không h tr
các phng thc mi. Ngc li nó chy đè các phng thc ca lp InputStream nh
‘read() ‘, ‘skip()’, ‘available()’ và ‘reset()’.

 Lp ByteArrayOutputStream
68
Lp này to ra lung kt sut trên mt mng các byte. Nó cng cung cp các kh nng b
sung đ mng kt sut tng trng nhm mc đích cha ch cho mng đc ghi. Lp này
cng cung cp các phng thc ‘toByteArrray()’ và ‘toString()’. Chúng đc dùng đ
chuyn đi lung thành mt mng byte hay đi tng chui.
Lp ByteArrayOutputStream cng cung cp hai phng thc thit lp. Mt chp nhn
mt đi s s nguyên dùng đ n đnh mng byte kt xut theo mt kích c ban đu. và
th hai không chp nhn đi s nào, và thit lp đm kt xut vi kích thc mc đnh.
lp này cung cp vài phng thc b sung, không đc khai báo trong OutputStream:
 reset()
Thit lp li kt xut vùng đm nhm cho phép tin trình ghi khi đng li ti đu
vùng đm.

 size()
Tr v s byte hin ti đã đc ghi ti vùng đm.
 writeto()
Ghi ni dung ca vùng đm kt xut ra lung xut đã ch đnh.  thc hin, nó chp
nhn mt đi tng ca lp OutputStream làm đi s.

Chng trình 9.1 s dng lp ‘ByteArrayInputStream’ và ‘ByteArrayOutputStream’ đ
nhp và xut:

Program 9.1
import java.lang.System;
import jva.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 Xut hin kt xut ca chng trình:


Hình 9.1: s dng 1 s dng lp ‘ByteArrayInputStream’ và
‘ByteArrayOutputStream’ cho nhp và xut.

9.3.4 Nhp và xut tp tin
Java h tr các tác v nhp và xut tp tin vi s tr giúp các lp sau đây:
 File
 FileDescriptor
 FileInputStream
 FileOutputStream
Java cng h tr truy cp nhp và xut ngu nhiên hoc trc tip bng các lp
‘File’,’FileDescriptior’, và ‘RandomAccesFile’.

 Lp File
Lp này đc s dng đ truy cp các đi tng tp tin và th mc. Các tp tin
đt tên theo qui c đt tên tp tin ca h điu hành ch. Các qui c này đc
gói riêng bng các hng lp File. Lp này cung cp các thit lp các tp tin và các
th mc. Các thit lp chp nhn các đng dn tp tin tuyt đi ln tng đi
cùng các tp tin và th mc. Tt c các tác v th mc và tp tin chung đc thc
hin thông qua các phng thc truy cp ca lp File.
Các phng thc:

 Cho phép bn to, xoá, đi tên các file.
 Cung cp kh nng truy cp tên đng dn tp tin.
 Xác đnh đi tng có phi tp tin hay th mc không.
 Kim tra s cho phép truy cp đc và ghi.
Ging nh các phng thc truy cp, các phng thc th mc cng cho phép
to, xoá, đt tên li và lit kê các th mc. Các phng pháp này cho phép các
cây th mc đang chéo bng cách cung cp kh nng truy cp các th mc cha và
th mc anh em.

 Lp FileDescriptor
Lp này cung cp kh nng truy cp các mô t tp tin mà h điu hành duy trì khi các
tp tin và th mc đang đc truy cp. Lp này không cung cp tm nhìn đi vi
thông tin c th do h điu hành duy trì. Nó cung cp ch mt phng thc có tên
‘valid()’, giúp xác đnh mt đi tng mô t tp tin hin có hp l hay không.

70
 Lp FileInputStream
Lp này cho phép đc đu vào t mt tp tin di dng mt lung. Các đi tng ca
lp này đc to ra nh dùng mt tp tin String, File, hoc mt đi tng
FileDescriptor làm mt đi s. Lp này chng lên các phng thc ca lp
InputStream. Nó cng cung cp các phng thc ‘finalize()’ và ‘getFD()‘.

Phng thc ‘finalize()‘ đc dùng đ đóng lung khi đang đc b gôm rác Java x
lý. Phng thc ‘getFD()’ tr v đi tng FileDescriptor biu th s kt ni đn tp
tin thc t trong h tp tin đang đc ‘FileInputStream’ s dng.
 Lp FileOutputStream
Lp này cho phép ghi kt xut ra mt lung tp tin. Các đi tng ca lp này cng
to ra s dng các đi tng chui tên tp tin, tp tin, FileDesciptor làm tham s. Lp
này chng lên phng thc ca lp OutputStream và cung cp phng thc
‘finalize()’ và getFD().

Chng 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 hin kt xut ca đon mã ngun trên:

71

Hình 9.2 s dng FileInputStream, FileOutputStream, và các lp File
9.3.5 Nhp xut đã lc
Mt ‘Filter’ là mt kiu lung sa đi cách điu qun mt lung hin tn ti. Các lp, các
lung nhp xut đã lc ca java s giúp ta lc I/O theo mt s cách. V c bn, các b lc
này dùng đ thích ng các lung theo các nhu cu ca chng trình c th.
B lc nm gia mt lung nhp và mt lung xut. Nó thc hin x lý mt tin trình
đc bit trên các byte đc truyn t đu vào đn kt xut. Các b lc có th phi hp
thc hin dãy tun t các tu chn lc  đó mi b lc tác đng nh kt xut ca mt b
lc khác.
 Lp FilterInputStream
ây là lp tru tng. Nó là cha ca tt c các lp lung nhp đã lc. Lp này cung
cp kh nng to ra mt lung t lung khác. Mt lung có th đc đc và cung cp
di dng kt xut cho lung khác. Bin ‘in’ đc s dng đ làm điu này. Bin này
đc dùng đ duy trì mt đi tng tách bit ca lp InputStream. Lp
FilterInputStream đc thit k sao cho có th to nhiu b lc kt xích [chained
filters].  thc hin điu này chúng ta dùng vài tng lng ghép. đn lt mi lp s
truy cp kt xut ca lp trc đó vi s tr giúp ca bin ‘in’.

 Lp FilterOutputStream
Lp này là mt dng b tr cho lp FilterInputStream. Nó là lp cha ca tt c các
lp lung xut đã lc. Lp này tng t nh lp FilterInputStream  ch nó duy trì
đi tng ca lp OutputStream làm mt bin ‘out’. D liu ghi vào lp này có th
sa đi theo nhu cu đ thc hin tác v lc và sau đó đc chuyn gi ti đi tng
OutputStream.
9.3.6 I/O có lp vùng đm
Vùng đm là kho lu tr d liu. Chúng ta có th ly d liu t vùng đm thay vì quay

tr li ngun ban đu ca d liu.
Java s dng c ch nhp/xut có lp vùng đm đ tm thi lp cache d liu đc đc
hoc ghi vào/ra mt lung. Nó giúp các chng trình đc/ghi các lng d liu nh mà
không tác đng ngc lên kh nng thc hin ca h thng.

Trong khi thc hin nhp có lp vùng đm, s lng byte ln đc đc ti thi đim này,
và lu tr trong mt vùng đm nhp. khi chng trình đc lung nhp, các byte d liu
đc đc t vùng đm nhp.

72
Tin trình lp vùng đm kt xut cng thc hin tng t. khi d liu đc mt chng
trình ghi ra mt lung, d liu kt xut đc lu tr trong mt vùng đm xut. D liu
đc lu tr đn khi vùng đm tr nên đy hoc các lung kt xut đc x trng. Cui
cùng kt xut có lp vùng đm đc chuyn gi đn đích ca lung xut.

Các b lc hot đng trên vùng đm. Vùng đm đc phân b nm gia chng trình và
đích ca lung có lp vùng đm.

 Lp BufferedInputStream
Lp này t đng to ra và cha đng vùng đm đ h tr vùng đm nhp. Nh đó
chng trình có th đc d liu tng lung theo byte mt mà không nh hng đn kh
nng thc hin ca h thng. Bi lp ‘BufferedInputStream’ là mt b lc, nên có th áp
dng nó cho mt s đi tng nht đnh ca lp InputStream và cng có th phi hp vi
các tp tin đu vào khác.
Lp này s dng vài bin đ thc hin các c ch lp vùng đm đu vào. Các bin này
đc khai báo là protected và do đó chng trình không th truy cp trc tip. Lp này
đnh ngha hai
phng thc thit lp. Mt cho phép ch đnh kích c ca vùng đm nhp
trong khi đó phng thc thit lp kia thì không. Nhng c hai phng thc thit lp đu
tip nhn đi tng ca lp InputStream và OutputStream làm đi s. lp này chng lên

các phng thc truy cp mà InputStream cung cp và không làm ny sinh bt kì phng
thc mi nào.
Lp BufferedInputStream. Lp này cng đnh ngha hai phng thc thit lp. nó cho
phép ch đnh kích c ca vùng đm xut trong mt phng thc thit lp cng nh cung
cp mt kích c vùng đm ngm đnh. Nó chng lên tt c các phng thc ca
OutputStream và không làm ny sinh bt kì phng thc nào.

Chng trình 9.3 di đây mô t cách dùng các lung nhp/xut có lp vùng đm:

Chng 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 hin kt xut ca chng trình trên:



Hình 9.3 S dng các lp vùng đm lung nhp và xut.
74
9.3.7 Lp Reader và Writer
ây là các lp tr tng. Chúng nm ti đnh ca h phân cách lp, h tr vic
đc và ghi các lung ký t unicode.java 1.1 thc t đã gii thiu các lp này.
 Lp Reader
Lp này h tr các phng thc:
 read( )
 reset( )
 skip( )
 mark( )
 markSupported( )
 close( )
Lp này cng h tr phng thc gi ‘ready()’. Phng thc này tr v giá tr kiu
boolean nu rõ tác v đc k tip có tip tc mà không phong to hay không.

 Lp Writer
Lp này h tr các phng thc:
 write( )
 flush( )
 close( )
9.3.8 Nhp/ xut chui và xâu ký t
Các lp ‘CharArrayReader’ và ‘CharArrayWriter’ cng tng t nh các lp
ByteArrayInputStream và ByteArrayOutputStream  ch chúng h tr nhp/xut t các
vùng đm nh. Các lp CharArrayReader và CharArrayWriter h tr nhp/ xut ký t 8
bit.

CharArrayReader không h tr b sung các phng pháp sau đây vào các phng thc
ca lp Reader cung cp. Lp CharArrayWriter b sung các phng thc sau đây vào các
phng thc ca lp Writer.

 reset( )
thit lp li vùng đm
 size( )
tr v kích c hin hành ca vùng đm
 toCharArray( )
Tr v bn sao mng ký t ca vùng đm xut
 toString( )
Chuyn đi vùng đm xut thành mt đi tng String
 writeTo( )
Ghi vùng đm ra mt lung xut khác.

Lp StringReader tr giúp lung nhp ký t t mt chui. Nó không b sung phng
thc nào vào lp Reader.
Lp StringWriter tr giúp ghi lung kt xut ký t ra mt đi tng StringBuffer. Lp
này b sung hai phng thc có tên là ‘getBuffer( )’ và ‘toString()’ . Phng thc
‘getBuffer( )’ tr v đi tng StringBuffer tng ng vi vùng đm xut, trong khi đó
phng thc toString( ) tr v mt bng sao chui ca vùng đm xut.
75
Chng trình 9.4 di đây thc hin các tác v nhp/xut mng ký t:

Chng trình 9.4
import java.lang.System;
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.IOException;
public class testl

{
public static void main(String args[ ]) throws IOException
{
CharArrayWriter ost = new CharArrayWriter( );
String s = "Welcome to Character Array Program";

for(int i= 0; i<s.length( ); ++i) ;
osi.write(s.charAt(i));

System.out.println("Output Stream is: " + ost);
System.out.println("Size is: " + ost.size( ));

CharArrayReader inst;
inst = new CharArrayReader(ost.toCharArray( ));
int a= 0;
String Buffer sbI = new String Buffer(" ");

while((a = inst.read( )) != -1)
sbI.append((char) a);

s = sbI.toString( );
System.out.println(s.length() + "characters were read");
System.out.println("They are:" + s);
}
}

Hình 9.4 Hin kt xut chng trình:




Hình 9.4 Các tác v nhp và xut mng các ký t
Chng trình 9.5 Mô t tin trình nhp/xut chui.
76

Chng trình 9.5

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 <s.length( ); + +i)
ost.write(s.charAt(i)) ;
System.out.println("Output Stream is: " + ost);
StringReader inst;
inst = new StringReader(ost.toString( ));
int a= 0;
StringBuffer sb1 = new StringBuffer(" ");
while((a = inst.read( )) ! = -1)
sb1.append((char) a);
s = sb1.toString( ); ,
System.out.println("No of characters read: " +s.length( ));
System.out.println("They are: " + s);

}
}

Hình 9.5 Hin kt xut chng trình:


Hình 9.5 Nhp và xut sâu chui
9.3.9 Lp PrinterWriter
Lp ‘PrintStream’ thc hin vic kt xut d liu. Lp này có các phng thc b sung,
tr giúp cho vic in n d liu c bn.

Lp PrinterWriter’ là mt thay th ca lp PrinterStream. Nó thc t ci thin lp
PrinterStream bng cách dùng du tách dòng ph thuc nn tng đ in các dòng thay vì
77
ký t ‘\n’. Lp này cng cp h tr các ký t Unicode so vi PrinterStream. Phng thc
‘checkError( )’ đc s dng kim tra kt xut đc x sch và và đc kim ra các li.
Phng thc setError( ) đc s dng đ thit lp li điu kin. Lp PrintWriter cung cp
vic h tr in n các kiu d liu nguyên thu, các mng ký t, các sâu chui và các đi
tng.

9.3.10 Giao din DataInput
Giao din DataInput đc s dng đ đc các byte t lung nh phân và xây dng li các
kiu d liu dng nguyên thu trong Java.
DataInput cng cho phép chúng ta chuyn đi d liu t đnh dng sa đi UTF-8 ti
dng sâu chui. Chun UTF cho đnh dng chuyn đi Unicode. Nó là kiu đnh dng đt
bit gii mã các giá tr Unicode 16 bit . UTF lc quan  mc thp gi lp trong hu ht
các trng hp, mc cao 8 bít Unicode s là 0. Giao din DataInput đc đnh ngha là
s các phng thc, các phng thc bao gm vic đc các kiu d liu nguyên thu
trong java.


Bng 9.3 tóm lt vài phng thc. Tt c các phng thc đc kính hot IOException
trong trng hp li:

Tên phng thc Mô t
boolean readBoolean( ) c mt byte nhp, và tr v đúng nu byte
đó không phi là 0, và sai nu byte đó là 0.
byte readByte( ) c mt byte
char readChar( ) c và tr v mt giá tr ký t
short redShort( ) c 2 byte và tr v giá tr short
long readLong( ) c 8 byte và tr v giá tr long.
float readFloat( ) đc 4 byte và tr v giá tr float
int readInt( ) c 4 byte và tr v giá tr int
double readDouble( ) c 8 byte và tr v giá tr double
String readUTF( ) c mt sâu chui
String readLine( ) c mt dòng vn bn

Bng 9.3 Các phng thc ca giao din DataInput

9.3.11 Giao din DataOutput
Giao din DataOutput đc s dng đ xây dng li các kiu d liu nguyên thu trong
java vào trong dãy các byte. nó ghi các byte này lên trên lung nh phân.
Giao din DataOutput cng cho phép chúng ta chuyn đi mt sâu chui vào trong java
đc sa đi theo đnh dng UTF-8 và ghi nó vào lung.

Giao din DataOutput đnh ngha s phng thc đc tóm tt trong bng 9.4. Tt c các
phng thc s kích hot IOException trong trng hp li.


Tên phng thc Mô t
void writeBoolean(Boolean b) Ghi mt giá tr Boolean vào lung

78
void writeByte(int value) Ghi giá tr 8 bit thp
void writeChar(int value) Ghi 2 byte giá tr kiu ký t vào lung
void writeShort(int value) Ghi 2 byte, biu din li giá tr dng short
void writeLong(long value) Ghi 8 byte, biu din li giá tr dng long
void writeFloat(float value) Ghi 4 byte, biu din li giá tr dng float
void writeInt(int value) ghi 4 byte
void writeDouble(double value) Ghi 8 byte, biu din li giá tr dng double
void writeUTF(String value) Ghi mt sâu dng UTF ti lung.

Bng 9.4 Các phng thc ca giao din DataOutput

9.3.12 Lp RandomAccessFile

Lp RandomAccessFile cung cp kh nng thc hin I/O theo mt v trí c th bên trong
mt tp tin. Trong lp này, d liu có th đc hoc ghi  v trí ngu nhiên bên trong mt
tp tin thay vì mt kho lu tr thông tin liên tc. hn th na lp này có tên
RandomAccess. Phng thc ‘seek( )’ h tr truy cp ngu nhiên. Kt qu là, bin tr
tng ng vi tp tin hin hành có th n đnh theo v trí bt k trong tp tin.

Lp RandomAccessFile thc hin c hai vic nhp và xut. Do vây, có th thc hin I/O
bng các kiu d liu nguyên thu. Lp này cng h tr cho phép đc hoc ghi tp tin c
bn, điu này cho phép đc tp tin theo ch đ ch đc hoc đc-ghi. tham s ‘r’ hoc
‘rw’ đc gán cho lp RandomAccessFile ch đnh truy cp ‘ch đc’ và ‘đc-ghi’. Lp
này gii thiu vài phng thc mi khác vi phng pháp đã tha k t các lp
DataInput và DataOutput.
Các phng thc bao gm:
 seek( )
Thit lp con tr tp tin ti v trí c th bên trong tp tin.
 getFilePointer( )

Tr v v trí hin hành ca con tr tp tin.
 length( )
Tr v chiu dài ca tp tin tính theo byte.

Chng trình di đây minh ho cách dùng lp RandomAccessFile. Nó ghi mt giá tr
boolean, mt int, mt char, mt double ti mt file có tên ‘abc.txt’. Nó s dng phng
pháp seek( ) đ tìm v trí đnh v 1 bên trong tp tin. Sau đó nó đc giá tr s nguyên, ký
t và double t tp tin và hin th chúng ra màn hình.

Chng trình 9.6
import java.lang.System;
import java.io.RandomAccessFile;
import java.io.IOException;
public class mdexam
{
public static void main (String args[ ]) throws IOException
{
79
RandomAccessFile rf;
rf= new RandomAccessFile("abc.txt", "rw");
rf. writeBoolean(true);
rf. writelnt( 67868) ;
rf.writeChars("J");
rf. writeDouble(678.68);
/ / making use of seek( ) method to move to a specific file location
rf.seek(l);
System.out.println(rf.readlnt( ));
System.out.println(rf.readChar( ));
System.out.println(rf.readDouble( ));
rf.seek(0);

System.out.println(rf.readBoolean( ));
rf.close( );
}
}
Hình 9.5 Hin kt xut chng trình:


Hình 9.6: Lp RandomAccessFile

9.4Gói java.awt.print
ây là gói mi mà java JDK 1.2 cung cp. Nó thay th kh nng in ca JDK 1.1. Nó bao
gm dãy các giao din:
 Pageable
 Printable
 PrinterGraphics
Giao din ‘Pageable’ đnh ngha các phng thc đc s dng cho đi tng mô t li
các trang s đc in. Nó cng ch đnh s lng trang s đc in cng nh s đc in
trang hin hành hay mt min trang.

Giao din ‘Printable’ ch đnh phng thc print( )đc dùng đ in mt trng trên mt
đi tng Graphics.

Giao din ‘PrinterGraphics‘ cung cp kh nng truy cp đi tng ‘PrinterJob’. Nó cung
cp các lp sau đây:
 Paper
 Book
 PageFormat
80
 Printerjob
Lp ‘Page’ đnh ngha các đc tính vt lý ca giy in. Ngoài ra nó cng cung cp kh

giy và vùng v.

Lp ‘Book’ là mt lp con ca đi tng duy trì mt danh sách các trang in. Lp này
cng cung cp các phng thc đ b sung và qun lý các trang cng nh thc thi giao
din Pageable.

Lp ‘PageFormat’ đnh ngha l ca trang nh các l ‘Top’, ‘Bottom’,’Left’ và ‘Right’.
Nó cng ch đnh kích c và hng in nh ‘Portait’ (kh dc) hoc ‘Landscape’ (kh
ngang).

Lp ‘Printerjob’ là mt lp con ca đi lng khi to, qun lý, và điu khin yêu cu
máy in. Lp này cng ch đnh các tính cht in.

Di đây là ngoi l và li mà gói java.awt.print kích hot:

 PrinterException
 PrinterIOException
 PrinterAbortException

‘PrinterException‘ m rng lp java.lang.Exception nhm cung cp mt lp c s đ in
các ngoi l liên quan.

‘PrinterIOException’ m rng lp ‘PrinterException’ nêu rõ mt li trong I/O.

‘PrinterAbortException’ là lp con ca lp PrinterException nêu rõ khi in đã đc b
ngang.
81
Tóm tt bui hc

 Mt lung là mt l trình qua đó d liu di chuyn trong mt chng trình java.

 Khi mt lung d liu đc gi hoc nhn.Chung ta xem nó nh đang ghi và đc
mt lung theo th t nêu trên.
 Lung nhp/xut bao gm các lp sau đây:
o Lp System.out
o Lp System.in
o Lp System.err

 Lp InputStream là mt lp tru tng đnh ngha cách nhn d liu.
 Lp OutputStream cng là lp tru tng. Nó đnh ngha ghi ra các lung đc
kt xut nh th nào.
 Lp ByteArrayInputStream to ra mt lung nhp t vùng đm b nh trong khi
ByteArrayOutputStream to mt lung xut trên mt mãng byte.
 Java h tr tác v nhp/xut tp tin vi s tr giúp ca các File, FileDescriptor,
FileInputStream và FileOutputStream.
 Các lp Reader và Writer là lp tru tng h tr đc và ghi các lung ký t
Unicode.
 CharArrayReader, CharArrayWriter khác vi ByteArrayInputStream,
ByteArrayOutputStream h tr đnh dng nhp/xut 8 bit, Trong khi
ByteArrayInputStream, ByteArrayOutputStream h tr nhp/xut 16bit.
 Lp PrintStream thc thi mt kt xut. lp này có phng thc b sung, giúp ta in
các kiu d liu c bn.

 Lp RandomAccessFile cung cp kh nng thc hin I/O ti v trí c th trong
mt tp tin.
82
Kim tra mc đ tin b

1. là các dàn ng (pipelines) đ gi và nhn thông tin trong các chng
trình java.
2. là lung li chun.

3. Phng thc đc các byte d liu t mt lung.
4. Phng thc tr v giá tr boolean, nêu rõ lung có h tr các kh
nng mark và reset hay không.
5. Phng thc x sch lung.
6. Nhp/xut mng byte s dng các lp và
7. Lp đc s dng truy cp các đi tng th mc và tp tin.
8. là mt khi cha đ lu gi d liu.

83
Bài tp

1. Vit chng trình nhn mt dòng vn bn t ngi dùng và hin th đon vn bn
đó lên màn hình.
2. Vit chng trình sao chép ni dng mt tp tin ti tp tin khác.
3. Vit chng trình to ra mt tp tin truy cp ngu nhiên. kt xut hin th phía
di đây.


Các bn ghi nên đc lu  dng tp tin ‘.dat’, vì vy ngi dùng truy cp chúng
nhanh hn.

×