http://www.ebook.edu.vn 59
Chương 3
Các lung vào ra
1. Khái nim v lung trong Java
Khi lp bt k chương trình nào trong mt ngôn ng nào thì vn đề vào ra d liu gia
chương trình và ngun d liu cũng như đích d liu là vn đề mà người lp trình cn phi
quan tâm. Làm thế nào để ta có th truyn d liu cho mt chương trình Java. Có hai cách
hiu qu để thc hin điu này:
Thông qua mt tài nguyên tun t nào đó như file hoc qua mt máy tính khác.
Thông qua giao din người máy.
Mc đích ca chương này là xem xét cách truyn d liu cho mt chương trình thông
qua mt máy tính khác hay tp tin.
1.1. Khái nim lung (stream)
Theo nghĩa đen lung là mt đường ng nước.
V mt thut ng chuyên ngành ta có th hiu “Các lung là các dãy d liu có sp
th t”.
Xét trên quan đim ca chương trình và ngun d liu (Data Soure) ta có th phân
loi lung thành hai loi: Lung xut (output stream) và lung nhp (input stream). Để trc
quan hơn chúng ta xem hình v dướ đây:
Hình 3.1
Như vy nếu chúng ta cn ly d liu t ngun vào chương trình thì cn phi s dng lung
nhp. Ngược li, nếu ta cn ghi d liu t chương trình ra ngun d liu thì ta cn phi s
dng lung xut.
Ta có th thy rng có rt nhiu lung d li, chng hn như t mt tp tin, t các thiết b
xut và nhp chun, t liên kết mng. Như vy mt chương trình có th truy xut ti nhiiu
ngun d liu.
Program
Data Source
InputStream
OutputStream
http://www.ebook.edu.vn 60
Hình 3.2
2. Lung xut nhp chun
System.out: Lung xut chun thường được s dng để hin th kết qu đầu ra trên
màn hình.
System.in: Lung nhp chun thường đến t bàn phím và được s dng để hin các
ký t.
System.err: Lung li chun.
Các lung trên còn được gi là các lung h thng. Mc dù các lung này rt có ích
khi lp trình nhưng chúng không đủ mnh khi gii quyết các vn đề vào ra quan trng khác.
Trong các mc tiếp theo ta s tìm hiu sâu mt s lung trong gói java.io
3. Lunng nh phân
3.1. Lp InputStream
Lp tru tượng InputStream khai báo các phương thc để đọc d liu đầu vào t mt
ngun c th. Lp InputStream là lp cơ s ca hu hết các lung nhp trong gói java.io, và
nó h tr các phương thc sau:
Các phương thc:
public InpuStream()
InputStream ch h tr constructor không tham s.
public abstract int read() throws IOException
Phương thc cơ bn ca lp InputStream là phương thc read(). Phương thc này
đọc mt byte d liu t lung nhp và tr v mt s kiu nguyên int có giá tr nm
trong khong t 0 đến 255. Giá tr tr v là -1 khi kết thúc lung. Phương thc read()
ch và phong ta các đon mã sau nó cho ti khi mt byte d liu được đọc. Vic
nhp và xut din ra vi tc độ chm, vì vy nếu chương trình ca ta thc hin mt
công vic khác quan trng thì tt nht là đặt các lnh nhp xut vào mt tuyến đon
riêng ca nó. Phương thc read() là phương thc tru tượng bi vì các lp con cn
thay đổi để thích ích vi môi trường c th.
public int read(byte[] b) throws IOException
Phương thc này đọc mt dãy các byte d liu liên tc t mt ngun ca lung nhp
và lưu vào mng b.
public int read(byte[] b, int offs, int len) throws IOException
Phương thc này đọc mt dãy các byte d liu và lưu vào mng b, v trí bt đầu lưu
d liu là offs và lưu len byte d liu
Thiết b
Console
Tp tin
Mng
InputStream
OutputStream
Chương trình
ng dng
http://www.ebook.edu.vn 61
public int available() throws IOException
Phương thc này cho biết còn bao nhiêu byte d liu trong lung.
public long skip(long count) throws IOException
Phương thc skip(long count) b qua long byte d liu
public synchronized void mark(int readLimit)
Phương thc này được s dng để dánh du v trí hin thi trong lung
public void reset() throws IOException
Phương thc này xác định li v trí lung là v trí đánh du ln gn đây nht.
public boolean markSupported()
Phương thc này tr v giá tr true nếu lung này h tr đánh du và false nếu nó
không h tr đánh du.
public void close() throws IOException
Khi đã làm vic xong vi mt lung, ta cn đóng li lung đó. Điu này cho phép h điu
hành gii phóng các tài nguyên gn vi lung.
3.2. Lp OutputStream
Lp tru tượng OutputStream khai báo các phương thc để ghi d liu ra lung.
Chúng bao gm các phương thc sau đây:
public OuputStream()
Phương thc OutputStream h tr constructor không tham s
public abstract void write(int b)throws IOException
Phương thc này ghi mt byte không du có giá tr trong khong t 0 đến 255. Nếu ta
truyn vào mt s có giá tr ln hơn 255 hoc nh hơn 0, nó s thc hin phép tính
b =b mod 256 trước khi ghi giá tr vào lung.
public void write(byte[] b)throws IOException
Phương thc này ghi d liu t lung vào toàn b mng b.
public void write(byte[] b, int off, int len) throws IOException
Phương thc này ch ghi mt đon con ca mng d liu bt đầu t v trí offs và tiếp
tc cho ti khi ghi hết len byte.
public void close()
Phương thc này đóng mt lung. Phương thc này được gi để gii phóng các tài
nguyên gn vi lung.
public void flush()
Các lung xut nhp khác được tha kế t các lung tru tượng InputStream
OutputStream. Đối vi mi kiu d liu và ngun d liu chúng ta có th có các kiu lung
xut và nhp riêng, chng hn DataInputStream, DataOutputStream, FileInputStream,
FileOutputStream,… Sau đây chúng ta s ln lượt xem xét tng kiu lung c th.
http://www.ebook.edu.vn 62
3.3. Các lung xut nhp mng byte
Để xây dng mt xâu ký t biu din d liu có th đọc được hoc gii mã d liu,
người ta xem các mng byte như là ngun ca các lung nhp hoc đích ca các lung
xut. Các lung byte cung cp các kh năng này.
Hình 3.3
3.3.1. Lung nhp mng byte
Lp ByteArrayInputStream s dng mt mng byte như là mt ngun d liu đầu vào.
Nó có hai constructor:
public ByteArrayInputStream(byte[] buf)
To ra mt đối tượng ByteArrayInputStream t mt mng xác định. Mng đầu vào
được s dng mt cách trc tiếp. Khi kết thúc buf nghĩa là kết thúc nhp t lung.
public ByteArrayInputStream(byte[] buf, int offset, int length)
To ra mt đối tượng ByteArrayInputStream t mt mng xác định, ch s dng mt
phn ca mng buf t buf[offset] đến buff[offset+length-1] hoc kết thúc mng.
ByteArrayInputStream to ra mt lung nhp t mt vùng đệm trong b nh được
biu din bng mt mng byte. Lp này không h tr bt k phương thc mi nào, nó np
chng các phương thc read(), skip(), available(), và reset() ca lp cha InputStream.
Ví d:
To mt mng gm 100 byte ri gn vào mng này mt lung ByteArrayInputStream
để ly d liu ra.
import java.io.*;
public class LuongNhapMang
{
public static void main(String[] args)
{
byte[] b = new byte[100];
for(byte i=0;i<b.length;i++) b[i]=i;
try{
InputStream is = new ByteArrayInputStream(b);
for(byte i=0;i<b.length;i++)
ByteArrayInputStream
ByteArrayOutputStream
http://www.ebook.edu.vn 63
System.out.print(is.read()+" ");
}
catch(IOException e)
{
System.err.println(e);
}
}
}
Kết qu thc hin chương trình
C:\MyJava\Baitap>java LuongNhapMang
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99
Chú ý: Mi ln đọc lung bng phương thc read(), mt byte d liu không còn trong
lung, nhưng vn tn ti trong mng.
3.3.1. Lung nhp mng byte
ByteArrayOutputStream to ra mt lung xut trên mt mng byte. Nó cũng cung cp
các kh năng b sung.
Các constructor:
public ByteArrayOutputStream()
To ra mt đối tượng ByteArrayOutputStream vi kích thước mc định
public ByteArrayOutputStream(int size)
To ra mt đối tượng ByteArrayOutputStream vi kích thước xác định ban đầu.
Các phương thc mi ca lp ByteArrayOutputStream:
public synchronized byte[] toByteArray():
Phương thc này tr v mt bn sao d liu ca lung và lưu d liu vào mt mng
và có th sa đổi d liu trong mng này mà không cn thay đổi các byte ca lung xut.
public size()
Tr v kích thước hin thi ca vùng đệm
public String toString(int hiByte)
To mt đối tượng String mi t ni dung ca lung xut mng byte
public String toString()
Phương thc chuyn đổi mt lung byte thành mt đối tượng String
Ví d:
Viết chương trình to lp mt lung xut mng (ByteArrayOutputStream) 100 byte.
Ghi vào lung xut mng 100 phn t t 0 đến 99. Đổ d liu t lung xut mng vào mng
b. In d liu t mng b ra màn hình.
import java.io.*;
class LuongXuatMang
{