Đ tài 6. Các lu ng vào ra d li u v i fileề ồ ữ ệ ớ
M t kh năng quan tr ng mà các ngôn ng l p trình ph i có là vi c qu n lý các lu ngộ ả ọ ữ ậ ả ệ ả ồ
d li u vào ra h th ng máy tính giúp các ch ng trình có th giao ti p d li u v i th gi iữ ệ ệ ố ươ ể ế ữ ệ ớ ế ớ
bên ngoài.
I. Khái ni m lu ng vào ra (I/O stream)ệ ồ
Lu ng là dòng ch y c a d li u. Có 2 lo i lu ng: ồ ả ủ ữ ệ ạ ồ
• Lu ng nh p (input stream): là t t c gì t th gi i bên ngoài đ c đ a vào máyồ ậ ấ ả ừ ế ớ ượ ư
tính, nh đ c t bàn phím, đ c t t p tin...ư ọ ừ ọ ừ ậ
• Lu ng xu t (output stream): là t t c nh ng gì đ c g i t máy tính ra ngoàiồ ấ ấ ả ữ ượ ử ừ
thông qua các thi t b ngo i vi, nh màn hình, máy in, t p tin, ...ế ị ạ ư ệ
Đ i v i m i lu ng l i có các dòng bao g m:ố ớ ộ ồ ạ ồ
• L p System.out: Dòng xu t chu n dùng đ hi n th k t qu trên màn hình.ớ ấ ẩ ể ể ị ế ả
• L p System.in: Dò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à dòng l i chu n cho phép m t ch ng trình đ a ra cácớ ỗ ẩ ộ ươ ư
thông báo l i trên màn hình.ỗ
Các dòng này có th b đ i h ng đ n nhi u ngu n khác nhau. Ví d System.err có thể ị ổ ướ ế ề ồ ụ ể
đ a thông báo l i ra m t file. ư ỗ ộ
Khi c n làm vi c v i lu ng, ta khai báo kh i th vi n:ầ ệ ớ ồ ố ư ệ
import java.io.*;
Th vi n này cho phép ta làm vi c v i các lu ng nh p xu t qua vi c cung c p các l p:ư ệ ệ ớ ồ ậ ấ ệ ấ ớ
FileInputStrem, FileOutputStream, FileReader, FileWriter và r t nhi u l p khác. ấ ề ớ
S phân c p các class trong gói java.io th hi n qua b ng sau:ự ấ ể ệ ả
java.lang.Objec
t
File
FileDescriptor
InputStream
ByteArrayInputStream
FileInputStream
FilterInputStream
BufferedInputStream
DataInputStream
PushbackInputStream
ObjectInputStream
PipedInputStream
SequenceInputStream
OutputStream
ByteArrayOutputStream
FileOutputStream
FilterOutputStream
BufferedOutputStream
DataOutputStream
PrintStream
78
ObjectOutputStream
PipedOutputStream
RandomAccessFile
Reader BufferedReader
LineNumberReader
CharArrayReader
FilterReader
PushbackReader
InputStreamReader
FileReader
PipedReader
StringReader
Writer
BufferedWriter
CharArrayWriter
FilterWriter
OutputStreamWriter
FileWriter
PipedWriter
PrintWriter
StringWriter
Sau đây chúng ta xem xét các class quan tr ng th ng đ c s d ng:ọ ườ ượ ử ụ
II. L p InputStream:ớ
Là m t l p tr u t ng đ nh nghĩa cách th c nh n d li u. Có các ph ng th c chínhộ ớ ừ ượ ị ứ ậ ữ ệ ươ ứ
sau:
• read(): Đ c các byte d li u t m t dòng. N u nh không có byte d li u nào,ọ ữ ệ ừ ộ ế ư ữ ệ
nó ph i ch . Khi m t ph ng th c ph i ch , các lu ng đang th c hi n ph iả ờ ộ ươ ứ ả ờ ồ ự ệ ả
t m d ng cho đ n khi có d li u. ạ ừ ế ữ ệ
• read(byte[]): Tr v s byte đ c đ c hay ‘-1’ n u nh đã đ c đ n cu i dòng.ả ề ố ọ ượ ế ư ọ ế ố
Nó gây ra ngo i l IOException n u có l i x y ra. ạ ệ ế ỗ ả
• read(byte[],int,int): Nó cũng đ c vào m t m ng byte. Nó tr v s byte th c sọ ộ ả ả ề ố ự ự
đ c đ c cho đ n khi k t thúc dòng. Nó gây ra ngo i l 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ươ ả ề ố ượ ể ọ ượ
ph i ch . Nó tr v s byte hi n t i có trong dòng. Nó không ph i là ph ngả ờ ả ề ố ệ ạ ả ươ
th c tin c y đ th c hi n ti n trình x lý đ u vào. ứ ậ ể ự ệ ế ử ầ
• close(): Ph ng th c này đóng dòng. Nó dùng đ gi i phóng m i tài nguyênươ ứ ể ả ọ
dòng đã s d ng. Luôn luôn đóng dòng đ ch c ch n r ng dòng x lý đ c k tử ụ ể ắ ắ ằ ử ượ ế
thúc. Nó gây ra ngo i l IOException n u l i x y ra.ạ ệ ế ỗ ả
• mark(): Đánh d u v trí hi n t i c a dòng. ấ ị ệ ạ ủ
• markSupported(): Tr v giá tr boolean ch ra r ng dòng có h tr các kh năngả ề ị ỉ ằ ỗ ợ ả
mark và reset hay không. Nó tr v true n u dòng h tr ng c l i tr v false. ả ề ế ỗ ợ ượ ạ ả ề
• reset(): Ph ng th c này đ nh v l i dòng theo v trí đ c đánh l n cu i cùng.ươ ứ ị ị ạ ị ượ ầ ố
Nó gây ra ngo i l IOException n u l i x y ra. ạ ệ ế ỗ ả
79
• skip(): Ph ng th c này b qua ‘n’ byte dòng vào. ’-n’ ch đ nh s byte đ c bươ ứ ỏ ỉ ị ố ượ ỏ
qua. Nó gây ra ngo i l 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 dòng vào. ể ể ớ ị ặ ệ
III. L p OutputStreamớ
Là l p tr u t ng đ nh nghĩa cách ghi các k t xu t đ n dòng. Nó cung c p m t t p cácớ ừ ượ ị ế ấ ế ấ ộ ậ
ph ng th c tr giúp t o ra, ghi và x lý k t xu t các dòng. Các ph ng th c bao g m: ươ ứ ợ ạ ử ế ấ ươ ứ ồ
• 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. Dòngươ ứ ả ế ộ ượ
ph i ch cho đ n khi tác v ghi hoàn t t. Nó gây ra ngo i l IOException n uả ờ ế ụ ấ ạ ệ ế
l i x y ra.ỗ ả
• write(byte[], int, int): Ph ng th c này ghi m ng các byte. L p OutputStreamươ ứ ả ớ
đ nh nghĩa ba d ng khác nhau c a ph ng th c đ có th ghi m t byte riêng l ,ị ạ ủ ươ ứ ể ể ộ ẻ
m t m ng các byte, hay m t đo n c a m t m ng byte. ộ ả ộ ạ ủ ộ ả
• flush(): Ph ng th c này x s ch dòng. Đ m d li u đ c ghi ra dòng. Nó kíchươ ứ ả ạ ệ ữ ệ ượ
ho t IOException n u l i x y ra.ạ ế ỗ ả
• close(): Ph ng th c đóng dòng. Nó đ c dùng đ gi i phóng m i tài nguyênươ ứ ượ ể ả ọ
g n v i dòng. Nó kích ho t IOException n u l i x y ra. ắ ớ ạ ế ỗ ả
IV. L p FileInputStreamớ
K th a t InputStream, l p này cho phép đ c vào t m t t p tin d i d ng m tế ừ ừ ớ ọ ừ ộ ậ ướ ạ ộ
stream. Các đ i t ng c a l p này đ c t o ra nh đ ng d n t i file, đ i t ng File, ho cố ượ ủ ớ ượ ạ ờ ườ ẫ ớ ố ượ ặ
đ i t ng FileDescriptor làm m t đ i s . ố ượ ộ ố ố
L p này có 3 ph ng th c kh i t o sau:ớ ươ ứ ở ạ
• FileInputStream(String name): Tham s là tên c a t p tin đ t o lu ng.ố ủ ậ ể ạ ồ
• FileInputStream(File f): Tham s là đ i t ng file đ t o lu ng.ố ố ượ ể ạ ồ
• FileInputStream(FileDescriptor fdObj): Tham s là đ i t ng FileDescriptor đố ố ượ ể
t o lu ng.ạ ồ
Ví d :ụ
InputStream in = new FileInputStream(“C:\\LETI\\JAVA\\Account.txt”);
V. L p FileOutputStreamớ
L p này cung c p kh năng ghi d li u xu ng t p tin, đ c d n xu t t l p chaớ ấ ả ữ ệ ố ậ ượ ẫ ấ ừ ớ
OutputStream.
Có 3 ph ng th c kh i t o:ươ ứ ở ạ
• FileOutputStream(String name);
• FileOutputStream(File f);
• FileOutputStream(FileDescriptor fdObj)
VI. 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. L p này cung c p các ph ng th c thi t l pướ ặ ậ ủ ệ ề ớ ấ ươ ứ ế ậ
các t p tin và các th m c. T t c các thao tác th m c và t p tin đ c th c hi n thông quaậ ư ụ ấ ả ư ụ ậ ượ ự ệ
các ph ng th c c a l p File. Nh v y, ta dùng File trong t t c các thao tác qu n lý file vàươ ứ ủ ớ ư ậ ấ ả ả
th m c.ư ụ
80
Có 3 cách đ t o các đ i t ng t l p File:ể ạ ố ượ ừ ớ
• File(String path);
• File(String path, String name);
• File(File dir, String name);
Ví d :File f = new File("C:\jdk1.4\bin\hello.java");ụ
ho cặ
File f = new File("C:\jdk1.4\bin", "hello.java");
ho cặ
File curDir = new File(".");
File f = new File(curDir, "Hello.java");
Các ph ng th c:ươ ứ
• public String getName(): l y tên đ i t ng t p tin.ấ ố ượ ậ
• public String gePath(): l y đ ng d n c a t p tin.ấ ườ ẫ ủ ậ
• public String getAbsolutePath(): l y đ ng d n tuy t đ i c a t p tin.ấ ườ ẫ ệ ố ủ ậ
• public String getParent(): l y tên th m c cha.ấ ư ụ
• public Boolean createNewFile(): t o m t t p tin m i.ạ ộ ậ ớ
• public void createTempFile(String pattern, File dir): t o t p tin t m th i.ạ ậ ạ ờ
• public void deleteOnExit(): yêu c u xoá t p tin khi ch ng trình ch m d t.ầ ậ ươ ấ ứ
• public boolean canWrite(): cho bi t tin có cho phép ghi hay không (true n u có).ế ế
• public boolean canRead(): cho bi t t p tin đ c phép đ c hay không (true n uế ậ ượ ọ ế
có)
• public void setReadOnly(): đ t thu c tính ch đ c.ặ ộ ỉ ọ
• public boolean isFile(): cho bi t t p tin có h p l hay không (true n u có).ế ệ ợ ệ ế
• public boolean isDirectory(): cho bi t t p tin có ph i th m c hay không (trueế ậ ả ư ụ
n u có). ế
• public boolean isHidden(): ki m tra xem t p tin có n hay không (true n u có).ể ậ ẩ ế
• public long length(): cho bi t kích th c t p tin (byte).ế ướ ậ
• public boolean mkdir(): t o m t th m c t đ i t ng file, true n u thành công.ạ ộ ư ụ ừ ố ượ ế
• renameTo(File dest): đ i tên t p tin hi n t i sang tên m i.ổ ậ ệ ạ ớ
• public String[ ] list(): l y danh sách các t p tin và th m c.ấ ậ ư ụ
• public String[ ] list(FilenameFilter filter): l y danh sách t p tin tho mãn đi uấ ậ ả ề
ki n l c, ví d *.gif.ệ ọ ụ
• public booean delete(): xoá t p tin, true n u xoá thành công.ậ ế
• public String toString(): tr v đ ng d n c a t p tin.ả ề ườ ẫ ủ ậ
• public String toURL(): tr v đ i t ng URL t ng ng v i t p tin.ả ề ố ượ ươ ứ ớ ậ
Ch ng trình ví d :ươ ụ
public class Test
{
public static void main(String args[])
{
File f = new File("test");
System.out.println(f.getAbsolutePath()); // L y đ ng d n tuy t đ iấ ườ ẫ ệ ố
System.out.println(f.exists()); // Ki m tra s t n t iể ự ồ ạ
}
}
81
VII. Nh p xu t l c ậ ấ ọ
Là m t ki u dòng có đ c t vi c thay đ i cách x lý dòng hi n có. Các l p, các dòngộ ể ượ ừ ệ ổ ử ệ ớ
nh p xu t l c c a java s giúp ta l c vào/ra theo m t s cách. ậ ấ ọ ủ ẽ ọ ộ ố
B l c n m gi a m t dòng nh p và m t dòng xu t. Nó th c hi n x lý m t quá trìnhộ ọ ằ ữ ộ ậ ộ ấ ự ệ ử ộ
nào đó trên các byte đ c truy n t đ u vào đ n đ u ra.ượ ề ừ ầ ế ầ
Các b l c có th ghép v i nhau khi đó đ u ra c a b l c này tr thành đ u vào c a bộ ọ ể ớ ầ ủ ộ ọ ở ầ ủ ộ
l c kia. ọ
VII.1 L p FilterInputStream: ớ
Đây là l p tr u t ng. Nó là cha c a t t c các l p dòng nh p l c. M t dòng có thớ ừ ượ ủ ấ ả ớ ậ ọ ộ ể
đ c đ c và đ a k t qu cho m t dòng khác. ượ ọ ư ế ả ộ
L p FilterInputStream đ c thi t k sao cho có kh năng k t chu i nhi u b l c. Đớ ượ ế ế ả ế ỗ ề ộ ọ ể
th c hi n đi u này chúng ta dùng vài t ng l ng nhau. ự ệ ề ầ ồ
VII.2 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ớ ộ ạ ổ ợ ớ ớ ủ ấ ả ớ
dòng xu t l c. 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 t i đ i t ng OutputStream. ượ ể ớ ố ượ
VIII. Vào/ra có s d ng b đ 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 vào/raử ụ ơ ế ậ ấ ậ ệ ể ạ ờ ậ ữ ệ
c a ủ
m t dòng. Nó giúp ch ng trình đ c/ghi l ng d li u nh không nh h ng l n đ n hi uộ ươ ọ ượ ữ ệ ỏ ả ưở ớ ế ệ
năng chung c a h th ng. ủ ệ ố
VIII.1 L p BufferedInputStream:ớ
L p này t đ ng t o ra và duy trì vùng đ m đ h tr thao tác vào. Nh đó ch ngớ ự ộ ạ ệ ể ỗ ợ ờ ươ
trình có th đ c d li u t dòng t ng byte m t mà không nh h ng đ n t c đ th c hi nể ọ ữ ệ ừ ừ ộ ả ưở ế ố ộ ự ệ
c a h th ng. ủ ệ ố
VIII.2 L p BufferedOutputStreamớ
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 xu t, m t s d ng kích c vùng đ m ng m đ nh. L p này đ nh nghĩa ch ng t t c cácệ ấ ộ ử ụ ỡ ệ ầ ị ớ ị ồ ấ ả
ph ng th c c a OutputStream và không đ a thêm b t kì ph ng th c m i nào. ươ ứ ủ ư ấ ươ ứ ớ
Ch ng trình sau đây đ c và ghi thông tin c a đ i t ng SinhVien theo m t format,ươ ọ ủ ố ượ ộ
m i sinh viên n m trên m t dòng trong file:ỗ ằ ộ
// Ke thua lop People
import java.io.*;
import java.util.StringTokenizer;
public class SinhVien extends People
{
private String Lop;// Ten lop
82