Bài giảng Nhập môn lập trình Java - Bài 8: Luồng (Streams) - Võ Tấn Dũng

NỘI DUNG

GV: Võ Tấn Dũng

Phần này sẽ cung cấp cho chúng ta những kiến thức

cơ bản về luồng (streams) và files:

• Thư viện các lớp về luồng trong java: luồng byte,

luồng ký tự.

• Xuất nhập Console dùng luồng byte, luồng ký tự.

• Xuất nhập files dùng luồng ký tự và luồng byte.

• Vấn đề xử lý files truy cập ngẫu nhiên dùng lớp

RandomAccessFile.

• Xử lý file và thư mục dùng lớp File

pdf 50 trang yennguyen 4900
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Nhập môn lập trình Java - Bài 8: Luồng (Streams) - Võ Tấn Dũng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Nhập môn lập trình Java - Bài 8: Luồng (Streams) - Võ Tấn Dũng

Bài giảng Nhập môn lập trình Java - Bài 8: Luồng (Streams) - Võ Tấn Dũng
1TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN TP.HCM
NHẬP MÔN JAVA
BÀI 8
LUỒNG (STREAMS)
GIẢNG VIÊN:
VÕ TẤN DŨNG
2NỘI DUNG
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
Phần này sẽ cung cấp cho chúng ta những kiến thức 
cơ bản về luồng (streams) và files:
• Thư viện các lớp về luồng trong java: luồng byte, 
luồng ký tự.
• Xuất nhập Console dùng luồng byte, luồng ký tự.
• Xuất nhập files dùng luồng ký tự và luồng byte.
• Vấn đề xử lý files truy cập ngẫu nhiên dùng lớp 
RandomAccessFile.
• Xử lý file và thư mục dùng lớp File.
3PHẦN 1
KHÁI NIỆM LUỒNG
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
4• Luồng (stream) là một sự biểu diễn trừu tượng việc xuất nhập dữ 
liệu được kết nối với một số thiết bị vào hay ra
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
KHÁI NIỆM LUỒNG (STREAMS)
5KHÁI NIỆM LUỒNG (STREAMS)
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Java hiện thực luồng bằng tập hợp các lớp phân cấp trong gói 
java.io.
Biến /
Đối tượng
Dòng nhập byte vật lý
Xử lý từng byte một
Dòng nhập ký tự
Xử lý theo đơn vị 2 byte
Dòng xuất byte vật lý
Xử lý từng byte một
Dòng xuất ký tự
Xử lý theo đơn vị 2 byte
Lớp trừu tượng trên cùng
java.io.InputStream
Lớp trừu tượng trên cùng
java.io.OutputStream
Lớp trừu tượng trên cùng
java.io.Reader
Lớp trừu tượng trên cùng
java.io.Writer
6KHÁI NIỆM LUỒNG
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Luồng byte (hay luồng dựa trên byte) hỗ trợ việc 
xuất nhập dữ liệu trên byte, thường được dùng khi 
đọc ghi dữ liệu nhị phân.
• Luồng ký tự được thiết kế hỗ trợ việc xuất nhập dữ 
liệu kiểu ký tự (Unicode). Luồng ký tự hỗ trợ hiệu 
quả chỉ đối với việc quản lý, xử lý các ký tự.
7LUỒNG BYTE (Byte Streams)
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
Các luồng byte được định nghĩa dùng hai lớp phân cấp.
• Mức trên cùng là hai lớp trừu tượng InputStream và 
OutputStream. 
• InputStream định nghĩa những đặc điểm chung cho 
những luồng nhập byte.
• OutputStream mô tả cách xử lý của các luồng xuất byte.
8G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
CÂY THỪA KẾ CỦA INPUTSTREAM
9G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
CÂY THỪA KẾ CỦA OUTPUTSTREAM
10
LUỒNG KÝ TỰ (Character Streams)
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Các luồng ký tự được định nghĩa dùng hai lớp phân 
cấp.
• Mức trên cùng là hai lớp trừu tượng Reader và 
Writer. 
• Lớp Reader dùng cho việc nhập dữ liệu của luồng.
• Lớp Writer dùng cho việc xuất dữ liệu của luồng.
• Những lớp dẫn xuất từ Reader và Writer thao tác 
trên các luồng ký tự Unicode.
11
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
CÂY THỪA KẾ CỦA READER & WRITER
12
CÁC LUỒNG ĐỊNH NGHĨA TRƯỚC
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Tất cả các chương trình viết bằng java luôn tự động 
import gói java.lang. Gói này có định nghĩa lớp System, 
nó có ba biến luồng được định nghĩa trước là in, out và 
err, chúng là các fields được khai báo static trong lớp 
System.
• System.out: luồng xuất chuẩn, mặc định là console. 
System.out là một đối tượng kiểu PrintStream.
• System.in: luồng nhập chuẩn, mặc định là bàn phím. 
System.in là một đối tượng kiểu InputStream.
• System.err: luồng lỗi chuẩn, mặc định cũng là console. 
System.err cũng là một đối tượng kiểu PrintStream 
giống System.out.
13
PHẦN 2
SỬ DỤNG LUỒNG BYTE
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
14
SỬ DỤNG LUỒNG BYTE
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Như chúng ta đã biết hai lớp InputStream và 
OutputStream là hai siêu lớp (cha) đối với tất cả 
những lớp luồng xuất nhập kiểu byte.
• Những phương thức trong hai siêu lớp này ném 
ra các lỗi kiểu IOException.
• Những phương thức định nghĩa trong hai siêu 
lớp này có thể dùng trong các lớp con của 
chúng. Vì vậy tập các phương thức này là tập tối 
thiểu các chức năng nhập xuất mà những luồng 
nhập xuất kiểu byte có thể sử dụng.
15
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
int available( ) Trả về số luợng bytes có thể đọc được từ luồng nhập
void close( ) Đóng luồng nhập và giải phóng tài nguyên hệ thống gắn 
với luồng. Không thành công sẽ ném ra một lỗi 
IOException
void mark(int numBytes)
Đánh dấu ở vị trí hiện tại trong luồng nhập
boolean markSupported( ) Kiểm tra xem luồng nhập có hỗ trợ phương thức mark() và 
reset() không.
int read( ) Đọc byte tiếp theo từ luồng nhập
int read(byte buffer[ ]) Đọc buffer.length bytes và lưu vào trong vùng nhớ buffer. 
Kết quả trả về số bytes thật sự đọc được
int read(byte buffer[ ], int 
offset, int numBytes)
Đọc numBytes bytes bắt đầu từ địa chỉ offset và lưu vào 
trong vùng nhớ buffer. Kết quả trả về số bytes thật sự 
đọc được
void reset( ) Nhảy con trỏ đến vị trí được xác định bởi việc gọi hàm 
mark() lần sau cùng.
long skip(long numBytes) Nhảy qua numBytes dữ liệu từ luồng
nhập
CÁC PHƯƠNG THỨC CỦA INPUTSTREAM
16
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
void close( ) Đóng luồng xuất và giải phóng tài nguyên hệ thống gắn 
với luồng. Không thành công sẽ ném ra một lỗi 
IOException
void flush( )
Ép dữ liệu từ bộ đệm phải ghi ngay xuống luồng (nếu có)
void write(int b)
Ghi byte dữ liệu chỉ định xuống luồng
void write(byte buffer[ ]) Ghi buffer.length bytes dữ liệu từ mảng chỉ định xuống 
luồng
void write(byte buffer[ ], int
offset, int numBytes) Ghi numBytes bytes dữ liệu từ vị trí offset của mảng chỉ 
định buffer xuống luồng
CÁC PHƯƠNG THỨC CỦA OUTPUTSTREAM
17
ĐỌC DỮ LIỆU TỪ Console
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Ví dụ sau đây minh họa cách dùng luồng byte thực hiện việc nhập xuất Console. 
Chương trình minh họa việc đọc một mảng bytes từ System.in
import java.io.*;
class ReadBytes
{
public static void main(String args[]) throws IOException
{
byte data[] = new byte[100];
System.out.print("Enter some characters.");
System.in.read(data);
System.out.print("You entered: ");
for(int i=0; i < data.length; i++)
System.out.print((char) data[i]);
}
}
18
XUẤT DỮ LIỆU RA Console
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
Chúng ta đã khá quen thuộc với phương thức print() và println(), dùng để xuất dữ liệu ra 
Console. Bên cạnh đó chúng ta cũng có thể dùng phương thức write(). Ví dụ: minh 
họa sử dụng phương thức System.out.write() để xuất ký tự ‘X’ ra Console
import java.io.*;
class WriteDemo
{
public static void main(String args[])
{
int b;
b = 'X';
System.out.write(b);
System.out.write('\n');
}
}
19
ĐỌC VÀ GHI FILE DÙNG LUỒNG BYTE
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Tạo một luồng Byte gắn với file chỉ định dùng 
FileInputStream và FileOutputStream.
• Để mở một file, đơn giản chỉ cần tạo một đối tượng của 
những lớp này, tên file cần mở là thông số trong 
constructor.
• Khi file mở, việc đọc và ghi dữ liệu trên file được thực 
hiện một cách bình thường thông qua các phương thức 
cung cấp trong luồng.
20
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
Đọc dữ liệu từ file:
• Mở một file để đọc dữ liệu
FileInputStream(String fileName) throws 
FileNotFoundException
Nếu file không tồn tại: thì ném ra FileNotFoundException
• Đọc dữ liệu: dùng phương thức read()
int read( ) throws IOException: đọc từng byte từ file và trả về giá trị 
của byte đọc được. Trả về -1 khi hết file, và ném ra IOException khi 
có lỗi đọc.
• Đóng file: dùng phương thức close()
void close( ) throws IOException: sau khi làm việc xong cần đóng 
file để giải phóng tài nguyên hệ thống đã cấp phát cho file.
ĐỌC VÀ GHI FILE DÙNG LUỒNG BYTE
21
ĐỌC VÀ GHI FILE DÙNG LUỒNG BYTE
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Ví dụ Đọc dữ liệu từ file, hiển thị nội dung của một file tên test.txt lưu tạiD:\test.txt
import java.io.*;
class ShowFile
{ public static void main(String args[]) throws IOException
{ int i; FileInputStream fin;
try { fin = new FileInputStream(“D:\\test.txt”); }
catch(FileNotFoundException exc){
System.out.println("File Not Found"); return;
}
catch(ArrayIndexOutOfBoundsException exc){
System.out.println("Usage: ShowFile File"); return;
}
// read bytes until EOF is encountered
do
{
i = fin.read();
if(i != -1) System.out.print((char) i);
} while(i != -1);
fin.close();
}
}
22
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
Ghi dữ liệu xuống file:
• Mở một file để ghi dữ liệu
FileOutputStream(String fileName) throws
FileNotFoundException
Nếu file không tạo được: thì ném ra FileNotFoundException
• Ghi dữ liệu xuống: dùng phương thức write()
void write(int byteval) throws IOException: ghi một byte xác 
định bởi tham số byteval xuống file, và ném ra IOException khi có lỗi 
ghi.
• Đóng file: dùng phương thức close()
void close( ) throws IOException: sau khi làm việc xong cần 
đóng file để giải phóng tài nguyên hệ thống đã cấp phát cho file.
ĐỌC VÀ GHI FILE DÙNG LUỒNG BYTE
23
ĐỌC VÀ GHI FILE DÙNG LUỒNG BYTE
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Ví dụ Ghi dữ liệu xuống file, copy nội dung một file text đến một file text khác.
import java.io.*;
class CopyFile
{ public static void main(String args[])throws IOException
{ int i; FileInputStream fin; FileOutputStream fout;
try { // open input file
try { fin = new FileInputStream(“D:\\source.txt”);}
catch(FileNotFoundException exc) { System.out.println("Input File Not Found"); return; }
// open output file
try { fout = new FileOutputStream(“D:\\dest.txt”); }
catch(FileNotFoundException exc) { System.out.println("Error Opening Output File"); return; }
} catch(ArrayIndexOutOfBoundsException exc)
{ System.out.println("Usage: CopyFile From To"); return; }
try {// Copy File
do { i = fin.read();
if(i != -1) fout.write(i);
} while(i != -1);
} catch(IOException exc)
{ System.out.println("File Error"); }
fin.close(); fout.close();
}
} //Kết quả, chương trình sẽ copy nội dung của file D:\source.txt và ghi vào một file mới D:\dest.txt.
24
ĐỌC VÀ GHI DỮ LIỆU NHỊ PHÂN
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Phần trên chúng ta đã đọc và ghi các bytes dữ 
liệu là các ký tự mã ASCII. Để đọc và ghi những 
giá trị nhị phân của các kiểu dữ liệu trong java, 
chúng ta sử dụng:
• DataInputStream
• DataOutputStream.
25
• Phần trên chúng ta đã đọc và ghi các bytes dữ liệu là các ký tự. Để đọc và ghi những giá trị nhị phân 
của các kiểu dữ liệu trong java, chúng ta sử dụng DataInputStream và DataOutputStream.
• DataOutputStream: hiện thực interface DataOuput. Interface DataOutput có các phương thức cho 
phép ghi tất cả những kiểu dữ liệu cơ sở của java đến luồng (theo định dạng nhị phân).
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
void writeBoolean(boolean val) Ghi xuống luồng một giá trị boolean được xác định bởi val.
void writeByte (int val) Ghi xuống luồng một byte được xác định bởi val.
void writeChar (int val) Ghi xuống luồng một Char được xác định bởi val.
void writeDouble(double val) Ghi xuống luồng một giá trị Double được xác định bởi val.
void writeFloat (float val) Ghi xuống luồng một giá trị float được xác định bởi val.
void writeInt (int val) Ghi xuống luồng một giá trị int được xác định bởi val.
void writeLong (long val) Ghi xuống luồng một giá trị long được xác định bởi val.
void writeShort (int val) Ghi xuống luồng một giá trị short được xác định bởi val.
Contructor: DataOutputStream(OutputStream outputStream)
OutputStream: là luồng xuất dữ liệu. Để ghi dữ liệu ra file thì đối tượng outputStream có thể là 
FileOutputStream.
ĐỌC VÀ GHI DỮ LIỆU NHỊ PHÂN
26
• DataInputStream: hiện thực interface DataInput. Interface DataInput có các phương thức cho phép 
đọc tất cả những kiểu dữ liệu cơ sở của java (theo định dạng nhị phân).
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
boolean readBoolean( ) Đọc một giá trị boolean
Byte readByte( ) Đọc một byte
char readChar( ) Đọc một Char
double readDouble( ) Đọc một giá trị Double
float readFloat( ) Đọc một giá trị float
int readInt( ) Đọc một giá trị int
long readLong( ) Đọc một giá trị long
short readShort( ) Đọc một giá trị short
Contructor: DataInputStream(InputStream inputStream)
InputStream: là luồng nhập dữ liệu. Để đọ dữ liệu từ file thì đối tượng 
InputStream có thể là FileInputStream.
ĐỌC VÀ GHI DỮ LIỆU NHỊ PHÂN
27
ĐỌC VÀ GHI DỮ LIỆU NHỊ PHÂN
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Ví dụ: dùng DataOutputStream và DataInputStream để ghi và đọc những kiểu dữ liệu 
khác nhau trên file.
import java.io.*;
class RWData
{ public static void main(String args[]) throws IOException
{ DataOutputStream dataOut; DataInputStream dataIn; int i = 10; double d = 1023.56; boolean b = true;
try {dataOut = new DataOutputStream(new FileOutputStream("D:\\testdata"));}
catch(IOException exc) { System.out.println("Cannot open file."); return;}
try {
System.out.println("Writing " + i);
dataOut.writeInt(i);
System.out.println("Writing " + d);
dataOut.writeDouble(d);
System.out.println("Writing " + b);
dataOut.writeBoolean(b);
System.out.println("Writing " + 12.2 * 7.4);
dataOut.writeDouble(12.2 * 7.4);
}
catch(IOException exc)
{
System.out.println("Write error.");
} //XEM TIẾP Ở SLIDE TIẾP THEO
28
ĐỌC VÀ GHI DỮ LIỆU NHỊ PHÂN
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
dataOut.close(); System.out.println();
// Now, read them back.
try { dataIn = new DataInputStream(
new FileInputStream("D:\\testdata"));
}
catch(IOException exc) {
System.out.println("Cannot open file."); return;
}
try { i = dataIn.readInt();
System.out.println("Reading " + i);
d = dataIn.readDouble();
System.out.println("Reading " + d);
b = dataIn.readBoolean();
System.out.println("Reading " + b);
d = dataIn.readDouble();
System.out.println("Reading " + d);
}
catch(IOException exc) { System.out.println("Read error."); }
dataIn.close();
}
}
29
PHẦN 3
FILE TRUY XUẤT
NGẪU NHIÊN
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
30
FILE TRUY XUẤT NGẪU NHIÊN
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Bên cạnh việc xử lý xuất nhập trên file theo kiểu 
tuần tự thông qua các luồng, java cũng hỗ trợ 
truy cập ngẫu nhiên nội dung của một file nào 
đó dùng RandomAccessFile. 
• RandomAccessFile không dẫn xuất từ 
InputStream hay OutputStream mà nó hiện thực 
các interface DataInput, DataOutput (có định 
nghĩa các phương thức I/O cơ bản). 
• RandomAccessFile hỗ trợ vấn đề định vị con trỏ 
file bên trong một file dùng phương thức 
seek(long newPos).
31
FILE TRUY XUẤT NGẪU NHIÊN
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Ví dụ: minh họa việc truy cập ngẫu nhiên trên file. Chương trình ghi 6 số kiểu double 
xuống file, rồi đọc lên theo thứ tự ngẫu nhiên.
import java.io.*;
class RandomAccessDemo 
{ public static void main(String args[]) throws IOException 
{ double data[] = {19.4, 10.1, 123.54, 33.0, 87.9, 74.25}; double d; RandomAccessFile raf;
try { raf = new RandomAccessFile("D:\\random.dat","rw"); }
catch(FileNotFoundException exc){ System.out.println("Cannot open file."); return ;}
// Write values to the file.
for(int i=0; i < data.length; i++)
{
try {
raf.writeDouble(data[i]);
}
catch(IOException exc)
{
System.out.println("Error writing to file.");
return ;
}
}
//XEM TIẾP Ở SLIDE TIẾP THEO
32
FILE TRUY XUẤT NGẪU NHIÊN
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
try { // Now, read back specific values
raf.seek(0); // seek to first double
d = raf.readDouble();
System.out.println("First value is " + d);
raf.seek(8); // seek to second double
d = raf.readDouble();
System.out.println("Second value is " + d);
raf.seek(8 * 3); // seek to fourth double
d = raf.readDouble();
System.out.println("Fourth value is " + d);
System.out.println();
// Now, read every other value.
System.out.println("Here is every other value: ");
for(int i=0; i < data.length; i+=2)
{ raf.seek(8 * i); // seek to ith double
d = raf.readDouble();
System.out.print(d + " ");
}
System.out.println("\n");
} catch(IOException exc) { System.out.println("Error seeking or reading."); }
raf.close();
}
}
33
PHẦN 4
SỬ DỤNG
LUỒNG KÝ TỰ
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
34
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
LỚP READER
35
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
LỚP WRITE
36
NHẬP CONSOLE DÙNG LUỒNG KÝ TỰ
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Muốn nhập dữ liệu từ Console là lớp BufferedReader thì 
chúng ta không thể xây dựng một lớp BufferedReader trực 
tiếp từ System.in. Thay vào đó chúng ta phải chuyển nó 
thành một luồng ký tự bằng cách dùng InputStreamReader 
chuyển bytes thành ký tự.
• Để có được một đối tượng InputStreamReader gắn với 
System.in ta dùng constructor của InputStreamReader.
• InputStreamReader(InputStream inputStream)
• Tiếp theo dùng đối tượng InputStreamReader đã tạo ra để 
tạo ra một BufferedReader dùng constructor 
BufferedReader.
• BufferedReader(Reader inputReader)
• Ví dụ: Tạo một BufferedReader gắn với Keyboard
• BufferedReader br = new 
BufferedReader(newInputStreamReader(System.in));
• Sau khi thực hiện câu lệnh trên, br là một luồng ký tự gắn 
với Console thông qua System.in.
37
NHẬP CONSOLE DÙNG LUỒNG KÝ TỰ
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Ví dụ: Dùng BufferedReader đọc từng ký tự từ Console. Việc đọc kết thúc khi gặp 
dấu chấm (dấu chấm để kết thúc chương trình).
import java.io.*;
class ReadChars
{
public static void main(String args[]) throws IOException
{
char c;
BufferedReader br = newBufferedReader(new InputStreamReader(System.in));
System.out.println("Nhap chuoi ky tu, gioi han dau cham.");
// read characters
do
{
c = (char) br.read();
System.out.println(c);
} while(c != '.');
}
}
38
NHẬP CONSOLE DÙNG LUỒNG KÝ TỰ
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Ví dụ: Dùng BufferedReader đọc chuỗi ký tự từ Console. Chương trình kết thúc khi 
gặp chuỗi đọc là chuỗi “stop”
import java.io.*;
class ReadLines
{
public static void main(String args[]) throws IOException
{
// create a BufferedReader using System.in
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
String str;
System.out.println("Nhap chuoi.");
System.out.println("Nhap 'stop' ket thuc chuong trinh.");
do
{
str = br.readLine();
System.out.println(str);
} while(!str.equals("stop"));
}
}
39
XUẤT CONSOLE DÙNG LUỒNG KÝ TỰ
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Trong ngôn ngữ java, bên cạnh việc dùng System.out 
để xuất dữ liệu ra Console (thường dùng để debug 
chương trình), chúng ta có thể dùng luồng PrintWriter 
đối với các chương trình “chuyên nghiệp”.
• PrintWriter là một trong những lớp luồng ký tự. Việc 
dùng các lớp luồng ký tự để xuất dữ liệu ra Console 
thường được “ưa chuộng” hơn.
• Để xuất dữ liệu ra Console dùng PrintWriter cần thiết 
phải chỉ định System.out cho luồng xuất.
• Ví dụ, tạo đối tượng PrintWriter để xuất dữ liệu ra 
Console:
PrintWriter pw = new PrintWriter(System.out, true);
40
XUẤT CONSOLE DÙNG LUỒNG KÝ TỰ
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Ví dụ: minh họa dùng PrintWriter để xuất dữ liệu ra Console
import java.io.*;
public class PrintWriterDemo
{
public static void main(String args[])
{
PrintWriter pw = new PrintWriter(System.out, true);
int i = 10;
double d = 123.67;
double r = i+d
pw.println("Using a PrintWriter.");
pw.println(i);
pw.println(d);
pw.println(i + " + " + d + " = " + r);
}
}
41
ĐỌC GHI FILE DÙNG LUỒNG KÝ TỰ
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Thông thường để đọc/ghi file người ta thường dùng 
luồng byte, nhưng đối với luồng ký tự chúng ta cũng 
có thể thực hiện được. Ưu điểm của việc dùng luồng 
ký tự là chúng thao tác trực tiếp trên các ký tự 
Unicode. Vì vậy luồng ký tự là chọn lựa tốt nhất khi 
cần lưu những văn bản Unicode.
• Hai lớp luồng thường dùng cho việc đọc/ghi dữ liệu 
ký tự xuống file là FileReader và FileWriter.
42
ĐỌC GHI FILE DÙNG LUỒNG KÝ TỰ
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
Ví dụ: Đọc những dòng văn bản nhập từ bàn phím và ghi chúng xuống file tên là 
“test.txt”. Việc đọc và ghi kết thúc khi người dùng nhập vào chuỗi “stop”.
import java.io.*;
class KtoD
{ public static void main(String args[]) throws IOException
{ String str; FileWriter fw; BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
try{ fw = new FileWriter("D:\\test.txt"); }
catch(IOException exc){ System.out.println("Khong the mo file."); return; }
System.out.println("Nhap ('stop' de ket thuc chuong trinh).");
do
{ System.out.print(": ");
str = br.readLine();
if(str.compareTo("stop") == 0) break;
str = str + "\r\n";
fw.write(str);
} while(str.compareTo("stop") != 0);
fw.close();
}
}
43
ĐỌC GHI FILE DÙNG LUỒNG KÝ TỰ
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Ví dụ: đọc và hiển thị nội dung của file “test.txt” lên màn hình.
import java.io.*;
class DtoS
{
public static void main(String args[]) throws Exception
{
FileReader fr = new FileReader("D:\\test.txt");
BufferedReader br = new BufferedReader(fr);
String s;
while((s = br.readLine()) != null)
{
System.out.println(s);
}
fr.close();
}
}
44
PHẦN 5
LỚP FILE
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
45
LỚP FILE
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
• Lớp File không phục vụ cho việc nhập/xuất dữ liệu trên luồng. Lớp 
File thường được dùng để biết được các thông tin chi tiết về tập tin 
cũng như thư mục (tên, ngày giờ tạo, kích thước, )
java.lang.Object
+--java.io.File
• Các Constructor:
• Tạo đối tượng File từ đường dẫn tuyệt đối
public File(String pathname)
ví dụ: File f = new File(“C:\\Java\\vd1.java”);
• Tạo đối tượng File từ tên đường dẫn và tên tập tin tách biệt
public File(String parent, String child)
ví dụ: File f = new File(“C:\\Java”, “vd1.java”);
• Tạo đối tượng File từ một đối tượng File khác
public File(File parent, String child)
ví dụ: File dir = new File (“C:\\Java”);
File f = new File(dir, “vd1.java”);
46
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
MỘT SỐ PHƯƠNG THỨC LỚP FILE
47
VÍ DỤ VỀ LỚP FILE
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
import java.awt.*;
import java.io.*;
public class FileDemo
{
public static void main(String args[])
{
Frame fr = new Frame ("File Demo");
fr.setBounds(10, 10, 300, 200);
fr.setLayout(new BorderLayout());
Panel p = new Panel(new GridLayout(1,2));
List list_C = new List();
list_C.add("C:\\");
File driver_C = new File ("C:\\");
String[] dirs_C = driver_C.list();
for (int i=0;i<dirs_C.length;i++)
{ File f = new File ("C:\\" + dirs_C[i]);
if (f.isDirectory())
list_C.add("" + dirs_C[i]);
else
list_C.add(" " + dirs_C[i]);
}
//XEM TIẾP Ở SLIDE TIẾP THEO
48
VÍ DỤ VỀ LỚP FILE
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
List list_D = new List();
list_D.add("D:\\");
File driver_D = new File ("D:\\");
String[] dirs_D = driver_D.list();
for (int i=0;i<dirs_D.length;i++)
{ File f = new File ("D:\\" + dirs_D[i]);
if (f.isDirectory())
list_D.add("" + dirs_D[i]);
else
list_D.add(" " + dirs_D[i]);
}
p.add(list_C);
p.add(list_D);
fr.add(p, BorderLayout.CENTER);
fr.setVisible(true);
}
}
49
• Kết quả thực thi chương trình:
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
VÍ DỤ VỀ LỚP FILE
50
HẾT
BÀI 8
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g

File đính kèm:

  • pdfbai_giang_nhap_mon_lap_trinh_java_bai_8_luong_streams_vo_tan.pdf