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() 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. 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. . 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. 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