
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 đ vào ra d li u gi aậ ấ ươ ộ ữ ấ ề ữ ệ ữ
ch ng trình và ngu n d li u cũng nh đích d li u là v n đ mà ng i l p trình c n ph iươ ồ ữ ệ ư ữ ệ ấ ề ườ ậ ầ ả
quan tâm. Làm th nào đ ta có 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 nà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 là 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 khác 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 có th hi u “Các lu ng là các dãy d li u có s pề ặ ậ ữ ể ể ồ ữ ệ ắ
th t ”.ứ ự
Xé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) và 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 có th th y r ng có r 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 có 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ồ ậ ẩ ườ ế ừ ượ ử ụ ể ệ
ký t .ự
•System.err: Lu ng l i chu n.ồ ỗ ẩ
Các lu ng trên còn đ c g i là các lu ng h th ng. M c dù các lu ng này r t có í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, và
nó h tr các ph ng th c sau:ỗ ợ ươ ứ
Cá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 và tr v m t s ki u nguyên int có 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 vàả ừ ế ị ả ề ế ồ ươ ứ ờ
phong t a các đo n mã sau nó cho t i khi m t byte d li u đ c đ c. Vi c nh p vàỏ ạ ớ ộ ữ ệ ượ ọ ệ ậ
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 là đ 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() là 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 nà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ươ ứ ọ ộ ữ ệ ụ ừ ộ ồ ủ ồ ậ
và 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ãy các 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 và false n u nóươ ứ ả ề ị ế ồ ỗ ợ ấ ế
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. Chúngươ ứ ể ữ ệ ồ
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 u có giá tr trong kho ng t 0 đ n 255. N u taươ ứ ộ ấ ị ả ừ ế ế
truy n vào m t s có 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 và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 nà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 này đ c g i đ gi i phóng các tàiươ ứ ộ ồ ươ ứ ượ ọ ể ả
nguyên g n v i lu ng.ắ ớ ồ
•public void flush()
Các lu ng xu t nh p khác đ c th a k t các lu ng tr u t ng ồ ấ ậ ượ ừ ế ừ ồ ừ ượ InputStream và
OutputStream. Đ i v i m i ki u d li u và ngu n d li u chúng ta có th có các ki u lu ngố ớ ỗ ể ữ ệ ồ ữ ệ ể ể ồ
xu t và 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 ký t bi u di n d li u có th đ c đ c ho c gi i mã d li u,ể ự ộ ự ể ễ ữ ệ ể ọ ượ ặ ả ữ ệ
ng i ta xem các 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á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.ớ ử ụ ộ ả ư ộ ồ ữ ệ ầ
Nó có hai constructor:
•public ByteArrayInputStream(byte[] buf)
T o ra m t đ i t ng ByteArrayInputStream t m t m ng xác đ nh. M ng đ u và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 nà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 và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. Nó cũng cung c pạ ộ ồ ấ ộ ả ấ
các kh năng b sung.ả ổ
Cá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á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 và l u d li u vào m t m ngươ ứ ả ề ộ ả ữ ệ ủ ồ ư ữ ệ ộ ả
và có 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 ra màn hình.ữ ệ ừ ả
import java.io.*;
63

