Ch ng 3ươ
Các lu ng vào ra
1. Khái ni m v lu ng trong Java
Khi l p b t kỳ ch ng trình nào trong m t ngôn ng nào thì v n đ o ra d li u gi a ươ
ch ng trình ngu n d li u cũng nh đích d li u v n đ ng i l p trình c n ph iươ ư ườ
quan tâm. Làm th nào đ ta th truy n d li u cho m t ch ng trình Java. Có hai cáchế ươ
hi u qu đ th c hi n đi u này:
Thông qua m t tài nguyên tu n t o đó nh file ho c qua m t máy tính khác. ư
Thông qua giao di n ng i máy. ườ
M c đích c a ch ng này xem xét cách truy n d li u cho m t ch ng trình thông ươ ươ
qua m t máy tính kc hay t p tin.
1.1. Khái ni m lu ng (stream)
Theo nghĩa đen lu ng là m t đ ng ng n c. ườ ướ
V m t thu t ng chuyên ngành ta th hi u “Các lu ng c y d li u s p
th t ”.
t trên quan đi m c a ch ng trình và ngu n d li u (Data Soure) ta có th phân lo i ươ
lu ng thành hai lo i: Lu ng xu t (output stream) lu ng nh p (input stream). Đ tr c quan
h n chúng ta xem hình v d đây:ơ ướ
Hình 3.1
Nh v y n u chúng ta c n l y d li u t ngu n vào ch ng trình thì c n ph i s d ng lu ngư ế ươ
nh p. Ng c l i, n u ta c n ghi d li u t ch ng trình ra ngu n d li u thì ta c n ph i s ượ ế ươ
d ng lu ng xu t.
Ta th th y r ngr t nhi u lu ng d li , ch ng h n nh t m t t p tin, t các thi t b ư ế
xu t và nh p chu n, t liên k t m ng. Nh v y m t ch ng trình th truy xu t t i nhii u ế ư ươ
ngu n d li u.
59
Program
Data Source
InputStream
OutputStream
Hình 3.2
2. Lu ng xu t nh p chu n
System.out: Lu ng xu t chu n th ng đ c s d ng đ hi n th k t qu đ u ra trên ườ ượ ế
màn hình.
System.in: Lu ng nh p chu n th ng đ n t bàn phím và đ c s d ng đ hi n các ườ ế ượ
t .
System.err: Lu ng l i chu n.
c lu ng trên còn đ c g i các lu ng h th ng. M c các lu ng này r t ích ượ
khi l p trình nh ng chúng không đ m nh khi gi i quy t các v n đ vào ra quan tr ng khác. ư ế
Trong các m c ti p theo ta s tìm hi u sâu m t s lu ng trong gói ế java.io
3. Lu nng nh phân
3.1. L p InputStream
L p tr u t ng ượ InputStream khai báo các ph ng th c đ đ c d li u đ u vào t m tươ
ngu n c th . L p InputStream là l p c s c a h u h t các lu ng nh p trong gói ơ ế java.io,
h tr các ph ng th c sau: ươ
c ph ng th c:ươ
public InpuStream()
InputStream ch h tr constructor không tham s .
public abstract int read() throws IOException
Ph ng th c c b n c a l p ươ ơ InputStream là ph ng th c read(). Ph ng th c này đ cươ ươ
m t byte d li u t lu ng nh p tr v m t s ki u nguyên int giá tr n m trong
kho ng t 0 đ n 255. Giá tr tr v là -1 khi k t thúc lu ng. Ph ng th c read() ch ế ế ươ
phong t a các đo n sau cho t i khi m t byte d li u đ c đ c. Vi c nh p ượ
xu t di n ra v i t c đ ch m, vì v y n u ch ng trình c a ta th c hi n m t công vi c ế ươ
khác quan tr ng thì t t nh t đ t các l nh nh p xu t vào m t tuy n đo n riêng c a ế
nó. Ph ng th c read() ph ng th c tr u t ng b i vì các l p con c n thay đ i đươ ươ ượ
thích ích v i môi tr ng c th . ườ
public int read(byte[] b) throws IOException
Ph ng th c y đ c m t dãy các byte d li u liên t c t m t ngu n c a lu ng nh pươ
l u vào m ng b. ư
public int read(byte[] b, int offs, int len) throws IOException
60
Thi t bế
Console
T p tin
M ng
InputStream
OutputStream
Ch ng trìnhươ
ng d ng
Ph ng th c này đ c m t dãyc byte d li u và l u vào m ng b, v trí b t đ u l u dươ ư ư
li u là offs và l u ư len byte d li u
public int available() throws IOException
Ph ng th c này cho bi t còn bao nhiêu byte d li u trong lu ng.ươ ế
public long skip(long count) throws IOException
Ph ng th c skip(long count) b qua long byte d li uươ
public synchronized void mark(int readLimit)
Ph ng th c này đ c s d ng đ dánh d u v trí hi n th i trong lu ngươ ượ
public void reset() throws IOException
Ph ng th c này xác đ nh l i v trí lu ng là v trí đánh d u l n g n đây nh t.ươ
public boolean markSupported()
Ph ng th c này tr v giá tr true n u lu ng này h tr đánh d u false n u ươ ế ế
không h tr đánh d u.
public void close() throws IOException
Khi đã làm vi c xong v i m t lu ng, ta c n đóng l i lu ng đó. Đi u này cho phép h đi u
hành gi i phóng các tài nguyên g n v i lu ng.
3.2. L p OutputStream
L p tr u t ng ượ OutputStream khai báo các ph ng th c đ ghi d li u ra lu ng. Cngươ
bao g m các ph ng th c sau đây: ươ
public OuputStream()
Ph ng th c ươ OutputStream h tr constructor không tham s
public abstract void write(int b)throws IOException
Ph ng th c này ghi m t byte không d ugiá tr trong kho ng t 0 đ n 255. N u taươ ế ế
truy n vào m t s giá tr l n h n 255 ho c nh h n 0, nó s th c hi n phép ơ ơ tính
b =b mod 256 tr c khi ghi giá tr o lu ng.ướ
public void write(byte[] b)throws IOException
Ph ng th c này ghi d li u t lu ng vào toàn b m ng b.ươ
public void write(byte[] b, int off, int len) throws IOException
Ph ng th c y ch ghi m t đo n con c a m ng d li u b t đ u t v trí offs và ti pươ ế
t c cho t i khi ghi h t ế len byte.
public void close()
Ph ng th c này đóng m t lu ng. Ph ng th c y đ c g i đ gi i phóng các tàiươ ươ ượ
ngun g n v i lu ng.
public void flush()
c lu ng xu t nh p khác đ c th a k t các lu ng tr u t ng ượ ế ượ InputStream
OutputStream. Đ i v i m i ki u d li u ngu n d li u chúng ta th các ki u lu ng
xu t nh p riêng, ch ng h n DataInputStream, DataOutputStream, FileInputStream,
FileOutputStream,… Sau đây chúng ta s l n l t xem xét t ng ki u lu ng c th . ượ
61
3.3. Các lu ng xu t nh p m ng byte
Đ xây d ng m t xâu t bi u di n d li u th đ c đ c ho c gi i d li u, ượ
ng i ta xemc m ng byte nh là ngu n c a các lu ng nh p ho c đích c a các lu ng xu t.ườ ư
c lu ng byte cung c p các kh năng này.
Hình 3.3
3.3.1. Lu ng nh p m ng byte
L p ByteArrayInputStream s d ng m t m ng byte nh là m t ngu n d li u đ u vào. ư
hai constructor:
public ByteArrayInputStream(byte[] buf)
T o ra m t đ i t ng ByteArrayInputStream t m t m ng c đ nh. M ng đ u o ượ
đ c s d ng m t cách tr c ti p. Khi k t thúc buf nghĩa là k t thúc nh p t lu ng.ượ ế ế ế
public ByteArrayInputStream(byte[] buf, int offset, int length)
T o ra m t đ i t ng ByteArrayInputStream t m t m ng xác đ nh, ch s d ng m t ượ
ph n c a m ng buf t buf[offset] đ n buff[offset+length-1] ho c k t thúc m ng. ế ế
ByteArrayInputStream t o ra m t lu ng nh p t m t vùng đ m trong b nh đ c bi u ượ
di n b ng m t m ng byte. L p y không h tr b t kỳ ph ng th c m i nào, nó n p ch ng ươ
các ph ng th c read(), skip(), available(), và reset() c a l p cha InputStream. ươ
Ví d :
T o m t m ng g m 100 byte r i g n o m ng này m t lu ng ByteArrayInputStream
đ l y d li u 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{
62
ByteArrayInputStream
ByteArrayOutputStream
InputStream is = new ByteArrayInputStream(b);
for(byte i=0;i<b.length;i++)
System.out.print(is.read()+" ");
}
catch(IOException e)
{
System.err.println(e);
}
}
}
K t qu th c hi n 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ú ý: M i l n đ c lu ng b ng ph ng th c read(), m t byte d li u không còn trong ươ
lu ng, nh ng v n t n t i trong m ng. ư
3.3.1. Lu ng nh p m ng byte
ByteArrayOutputStream t o ra m t lu ng xu t trên m t m ng byte. cũng cung c p
các kh năng b sung.
c constructor:
public ByteArrayOutputStream()
T o ra m t đ i t ng ByteArrayOutputStream v i kích th c m c đ nh ượ ướ
public ByteArrayOutputStream(int size)
T o ra m t đ i t ng ByteArrayOutputStream v i kích th c xác đ nh ban đ u. ượ ướ
c ph ng th c m i c a l p ByteArrayOutputStream:ươ
public synchronized byte[] toByteArray():
Ph ng th c này tr v m t b n sao d li u c a lu ng l u d li u vào m t m ngươ ư
th s a đ i d li u trong m ng này mà không c n thay đ i các byte c a lu ng xu t.
public size()
Tr v kích th c hi n th i c a vùng đ m ướ
public String toString(int hiByte)
T o m t đ i t ng String m i t n i dung c a lu ng xu t m ng byte ượ
public String toString()
Ph ng th c chuy n đ i m t lu ng byte thành m t đ i t ng Stringươ ượ
Ví d :
Vi t ch ng trình t o l p m t lu ng xu t m ng (ế ươ ByteArrayOutputStream) 100 byte. Ghi
vào lu ng xu t m ng 100 ph n t t 0 đ n 99. Đ d li u t lu ng xu t m ng vào m ng b. In ế
d li u t m ng b ran hình.
import java.io.*;
63