Chương 4
Vào ra dữ liệu trong Java
TRẦN MINH THÁI
Email:
Website: www.minhthai.edu.vn
Cập nhật: 18 tháng 07 năm 2016
Nội dung
#2
1.
2.
3.
4.
5.
Tổng quan về vào ra dữ liệu trong Java
Các lớp vào ra theo luồng ký tự
Các lớp vào ra theo luồng byte
Lớp File
Vào ra đối tượng và áp dụng
Tổng quan về vào ra dữ liệu
#3
Các lớp vào ra theo luồng ký tự
#4
Các lớp vào ra theo luồng byte
#5
Vào ra dữ liệu trên thiết bị chuẩn
#6
•
•
•
Vào dữ liệu từ thiết bị chuẩn (bàn phím): System.in
•
•
Một đối tượng của lớp InputStream đọc ghi theo luồng byte
Các phương thức rất hạn chế
Thường được sử dụng để khởi tạo các đối tượng luồng khác để xử lý dễ dàng hơn:
•
•
new BufferedReader(new InputStreamReader(System.in))
new Scanner(System.in)
Ra dữ liệu trên thiết bị chuẩn (màn hình): System.out
•
•
Một đối tượng của lớp PrintStream
Cung cấp các phương thức đầy đủ
Vào ra dữ liệu trên file
#7
•
•
•
Bước 1. Tạo đối tượng file để đọc/ ghi
Bước 2. Thao tác xử lý trên file
Bước 3. Đóng file
Vào ra dữ liệu trên file
#8
Có hai dạng file
•
•
File nhị phân: Dữ liệu được tổ chức theo dạng bit-by-bit
File văn bản:
Vào ra dữ liệu trên file nhị phân
#9
Ghi file
•
•
FileOutputStream(filePath): ghi dữ liệu theo luồng
•
Phương thức write(int)
DataOutputStream(outputStreamObject): ghi dữ liệu cơ bản
•
Phương thức writeInt(), writeDouble(), writeChars(),...
!!! Ghi tiếp vào file có sẵn: bổ sung thêm tham số thứ 2 là true
(mặc định không truyền là false: ghi đè)
Vào ra dữ liệu trên file nhị phân
#10
Đọc file
•
•
FileInputStream(filePath): đọc dữ liệu theo luồng
•
Phương thức int read() trả về -1 nếu đọc hết file
DataInputStream(inputStreamObject): đọc dữ liệu cơ bản
•
Phương thức readInt(), readDouble(),...
Đóng file: close()
Ví dụ
#11
Ví dụ (tt)
#12
Ví dụ (tt)
#13
Ví dụ (tt)
#14
Vào ra sử dụng bộ đệm
#15
Ghi dữ liệu sử dụng bộ đệm: BufferedOutputStream
•
•
•
Khởi tạo: BufferedOutputStream(outputStreamObject)
Phương thức flush(): xóa bộ đệm
Phương thức write(int): ghi dữ liệu
Đọc dữ liệu sử dụng bộ đệm: BufferedInputStream
•
•
•
Khởi tạo: BufferedInputStream(inputStreamObject)
Phương thức available(): trả về 0 nếu đọc hết dữ liệu
Phương thức read(int): trả về -1 nếu đọc hết dữ liệu
Ví dụ
public void copyFile(){
try {
#16
InputStream input = new FileInputStream(srcFile);
BufferedInputStream bInput =
new BufferedInputStream(input);
OutputStream output =
new FileOutputStream(desFile);
BufferedOutputStream bOutput =
new BufferedOutputStream(output);
int data;
while(bInput.available()>0){
data = bInput.read();
bOutput.flush();
bOutput.write(data);
}
}
catch(IOException e){
System.out.println(e);
}
}
Vào ra dữ liệu file văn bản
#17
FileReader
•
•
•
Khởi tạo: FileReader(filePath)
Phương thức read(): đọc từng ký tự
Trả về -1 nếu hết file
FileWriter
•
•
Khởi tạo: FileWriter(filePath)
Phương thức write(): ghi dữ liệu vào file
public static void main(String []args){
try
{
#18
//Ghi file
FileWriter out = new FileWriter("test.txt");
out.write("Nguyen Van An");
out.write(String.valueOf(10.5));
out.write(String.valueOf('c'));
out.close();
//Doc file
FileReader in = new FileReader("test.txt");
int data;
while((data=in.read())!=-1){
System.out.println((char)data);
}
in.close();
}
catch(IOException e){
System.out.println(e);
}
}
Đọc ghi từng dòng file văn bản
#19
Ghi từng dòng văn bản: Sử dụng PrintWriter
•
•
Khởi tạo: new PrintWriter(writerObject)
Phương thức: print(), printf(), println()
Ghi từng dòng văn bản: Sử dụng BufferedWriter
•
•
Khởi tạo: new BufferedWriter(writerObject)
Phương thức: void write(int),void write(String), void writeLine()
Đọc từng dòng văn bản: Sử dụng BufferedReader
•
•
Khởi tạo: new BufferedReader(readerObject)
Phương thức: String readLine() trả về null nếu đọc hết file
public class FileTextDungPrintWriter {
public static void main(String []args){
String []hoTen = {"Nguyen Van An",
#20
"Lam Thanh Ngoc",
"Phan Nhu Thong"};
double []dtb = {7.5, 8.0, 6.9};
try{
FileWriter out =
new FileWriter("textfile.txt");
PrintWriter printWriter =
new PrintWriter(out);
for(int i=0; i<3; i++){
printWriter.println(hoTen[i]+":"+dtb[i]);
}
out.close();
}
catch(IOException e){
System.out.println(e);
}
}
}
Nguyen Van An:7.5
Lam Thanh Ngoc:8.0
Phan Nhu Thong:6.9
Tách xâu ký tự theo dấu hiệu phân cách (delimiter)
#21
•
•
•
java.util.StringTokenizer
Delimiter: mặc định là dấu cách trắng \s
Định nghĩa lại trong phương thức khởi tạo
StringTokenizer(String input, String delimiter)
•
•
•
nextToken(): trả lại xâu phần tử tiếp theo
hasMoreTokens(): trả về false nếu không còn xâu phần tử
countTokens(): trả về số xâu phần tử tách được
public class FileTextDungBufferedReader {
public static void main(String []args){
try{
FileReader in =
#22
new FileReader("textfile.txt");
BufferedReader bIn = new BufferedReader(in);
String line;
StringTokenizer data;
while((line=bIn.readLine())!=null){
data=new StringTokenizer(line, ":");
while(data.hasMoreTokens()){
System.out.print(data.nextToken()
+ " ");
}
System.out.println();
}
}
catch(IOException e){
System.out.println(e);
}
}
}
Nguyen Van An 7.5
Lam Thanh Ngoc 8.0
Phan Nhu Thong 6.9
Bài tập
#23
Thống kê số lần xuất hiện của ký tự chữ cái trong file text
-
Đầu vào: file text “input.txt” chứa nội dung văn bản được lưu trong thư mục Project hiện hành
Đầu ra: file “thongke.txt” chứa n dòng (tương ứng với n chữ cái được sắp xếp theo thứ tự từ
điển). Mỗi dòng gồm 2 thông tin: ký tự và số lần xuất hiện trong file “input.txt”
Lớp File
#24
•
•
Cung cấp các phương thức thao tác với file, thư mục trên máy tính
Các phương thức khởi tạo:
•
•
File(String filePath): Tạo đối tượng file với đường dẫn (và tên file)
File(String path, String filePath): Tạo đối tượng file nằm trong thư mục cha path
!!! Chỉ tạo đối tượng (chưa tạo file hay thư mục)
Lớp File – Các phương thức
#25
•
•
boolean mkdir(): tạo thư mục có tên chỉ ra khi khởi tạo đối tượng File
•
•
•
createNewFile(): tạo file mới
boolean mkdirs(): tạo thư mục có tên chỉ ra khi khởi tạo đối tượng File, bao gồm cả thư mục cha nếu
cần thiết
boolean isDirectory(): trả về true nếu là thư mục
boolean isFile(): trả về true nếu là file