1. Trang chủ
  2. » Công Nghệ Thông Tin

JAVA-9 ppsx

19 200 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 455,57 KB

Nội dung

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.

Ngày đăng: 11/08/2014, 22:22

Xem thêm

TỪ KHÓA LIÊN QUAN

w