Tài liệu Java : Luồng I/O doc

19 162 0
Tài liệu Java : Luồng I/O doc

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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. [...]... 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. 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. 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;

Ngày đăng: 19/01/2014, 16:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan