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

tài liệu về luồng io

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.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×