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

Tài liệu JAVA-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ng thc này đnh v li lung 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.

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

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