Java định nghĩa 2 kiểu luồng: Byte hỗ trợ việc nhập/xuất dữ liệu trên byte,thường được dùng để đọc ghi các dữ liệu nhị phân và Ký tự Luồng ký tự được thiết kế hỗ trợ việc xuất nhập dữ li
Trang 1TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
-BÀI TẬP LỚN LẬP TRÌNH JAVA
Đề tài: “Tìm hiểu về vào/ra tệp (Text và Binary) trong Java Viết chương
trình nhập vào một danh sách sinh viên với các thông tin là mã sinh viên, họtên, ngày sinh Ghi danh sách sinh viên ra tệp Đọc lại danh sách sinh viên từtệp, tách họ tên thành họ đệm và tên, sắp xếp danh sách theo tên vần ABC,nếu trùng tên sắp xếp theo họ đệm Chương trình có khả năng nhập dữ liệu
từ tệp Excel và ghi dữ liệu ra tệp Excel.”
Giảng viên hướng dẫn: Ngô Công Thắng Nhóm sinh viên thực hiện:
Nguyễn Thị Linh Chi
Vũ Thị Mai HoaPhạm Văn Hưởng
Lê Thị Hồng NhungNguyễn Thị Sen
HÀ NỘI – 2010
Trang 2MỤC LỤC
I Vào ra tệp trong Java 2
1 Luồng (Streams) 2
1.1 Khái niệm luồng 2
1.2 Luồng byte (Byte Streams) 2
1.3 Luồng ký tự (Character Streams) 3
1.4 Những luồng được định nghĩa trước (The Predefined Streams) 3
2 Vào ra tệp 3
2.1 Vào ra tệp dùng luồng byte 3
2.1.1 Vào ra tệp văn bản 3
2.1.2 Vào ra tệp nhị phân 7
2.2 Vào ra tệp dùng luồng ký tự 12
II Chương trình 16
Trang 3I Vào ra tệp trong Java
Các dữ liệu mà một chương trình ngôn ngữ Java sử dụng phải lấy từ rất nhiềuloại nguồn dữ liệu khác nhau, bao gồm cả cơ sở dữ liệu, chuyển giao byte trực tiếpqua một ổ cắm (socket) và các tệp tin Ngôn ngữ Java sẽ mang lại cho bạn rất nhiềucông cụ để bạn có thể nhận được các thông tin từ các nguồn bên ngoài Các công cụnày phần lớn nằm trong gói java.io
Trong tất cả các nguồn dữ liệu sẵn có, các tệp tin là phổ biến nhất và thườngthuận tiện nhất Việc hiểu biết cách sử dụng các API có sẵn của ngôn ngữ Java đểtương tác với các tệp tin là một kỹ năng cơ bản của lập trình viên
Nhìn chung, ngôn ngữ Java cung cấp cho bạn một lớp bao gói (File) cho kiểu tệptin trong hệ điều hành của bạn Để đọc tệp tin đó, bạn phải sử dụng các luồng(streams) phân tích cú pháp các byte đầu vào thành các kiểu của ngôn ngữ Java
Xử lý files là một phần của công việc xử lý các luồng, giúp cho một chươngtrình có thể đọc, ghi dữ liệu trong bộ nhớ, trên files và trao đổi dữ liệu thông qua cáckết nối trên mạng
1 Luồng (Streams)
1.1 Khái niệm luồng
Tất cả những hoạt động nhập/xuất dữ liệu (nhập dữ liệu từ bàn phím, lấy dữliệu từ mạng về, ghi dữ liệu ra đĩa, xuất dữ liệu ra màn hình, máy in, …)
đều được quy về một khái niệm gọi là luồng (stream) Luồng là nơi có thể
“sản xuất” và “tiêu thụ” thông tin Luồng thường được hệ thống xuất nhậptrong Java gắn kết với một thiết bị vật lý Tất cả các luồng đều có chung mộtnguyên tắc hoạt động ngay cả khi chúng được gắn kết với các thiết bị vật lýkhác nhau Vì vậy cùng một lớp, phương thức xuất nhập có thể dùng chung chocác thiết bị vật lý khác nhau Java hiện thực luồng bằng tập hợp các lớp phâncấp trong gói java.io.
Trang 4Java định nghĩa 2 kiểu luồng: Byte (hỗ trợ việc nhập/xuất dữ liệu trên byte,
thường được dùng để đọc ghi các dữ liệu nhị phân) và Ký tự (Luồng ký tự được
thiết kế hỗ trợ việc xuất nhập dữ liệu kiểu ký tự (Unicode) Trong một vài trườnghợp luồng ký tự sử dụng hiệu quả hơn luồng byte, nhưng ở mức hệ thống thì tất
cả những xuất nhập đều phải quy về byte Luồng ký tự hỗ trợ hiệu quả chỉ đối vớiviệc quản lý, xử lý các ký tự)
1.2 Luồng byte (Byte Streams)
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 Các lớp con dẫn xuất từ hai lớp InputStream vàOutputStream sẽ hỗ trợ chi tiết tương ứng với việc đọc ghi dữ liệu trên nhữngthiết bị khác nhau
1.3 Luồng ký tự (Character Streams)
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
1.4 Những luồng được định nghĩa trước (The Predefined Streams)
Tất cả các chương trình viết bằng java luôn tự động import gói java.lang Góinày có định nghĩa lớp System, bao gồm một số đặc điểm của môi trường run-time, nó có ba biến luồng được định nghĩa trước là in, out và err, các biến này 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 đốitượ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 đốitượng kiểu InputStream
Trang 5 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.
2 Vào ra tệp
2.1 Vào ra tệp dùng luồng byte
Java cung cấp hai lớp InputStream và OutputStream là siêu lớp đối với tất các
các 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đưa ra các lỗi kiểu IOException Những phương thức định nghĩa trong hai siêulớ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 đó
là tập tối tiể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
2.1.1 Vào ra tệp văn bản
Đối với các file text, có các byte dữ liệu là các ký tự trong bảng mã ASCII,
Java sử dụng FileInputStream và FileOutputStream.
Đọc dữ liệu từ tệp
- Mở một tệp để đọc dữ liệu: tạo đối tượng lớp FileInputStream gắn với tệp
cần mở, tên tệp cần mở là đối số truyền vào cho hàm tạo của lớp, Nếu tệp khôngtồn tại thì đưa ra FileNotFoundException
- Đọc dữ liệu: dùng phương thức read(), phương thức này đọc từng byte từ tệp
và trả về giá trị của byte đọc được Trả về -1 khi hết tệp, và trả về IOExceptionkhi có lỗi đọc
- Đóng tệp: dùng phương thức close(), sau khi làm việc xong cần đóng tệp để
giải phóng tài nguyên hệ thống
Trang 6int intvar = fin.read(); // đọc dữ liệu từ tệp đã mở
Trang 7System.out.println("Usage: ShowFile File");
- Mở một tệp để ghi dữ liệu: tạo đối tượng lớp FileOutputStream gắn với tệp
cần mở, tên tệp cần mở là đối số truyền vào cho hàm tạo của lớp, Nếu tệp khôngtồn tại thì đưa ra FileNotFoundException
- Ghi dữ liệu xuống: dùng phương thức write(int byteval), phương thức này
ghi một byte xác định bởi tham số byteval xuống tệp, và trả về IOException khi
có lỗi ghi
- Đóng file: dùng phương thức close(), sau khi làm việc xong cần đóng tệp để
giải phóng tài nguyên hệ thống
Cú pháp chung:
FileOutputStream fout = new FileOutputStream(String filename); // tạo đối tượng gắn với tệp cần mở
fout.write(int byteval); // ghi dữ liệu xuống tệp
fout.close(); // đóng tệp đã mở để giải phóng tài nguyên hệ thống
Trang 9fout = new FileOutputStream(“D:\\dest.txt”);
Trang 10DataInputStream: thực hiện 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 địnhdạng nhị phân)
boolean readBoolean( ) Đọc một giá trị Boolean
double readDouble( ) Đọc một giá trị Double
float readFloat( ) Đọc một giá trị Float
short readShort() Đọc một giá trị Short
DataOutputStream: thực hiện 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)
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
Trang 11xá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
Đọc dữ liệu từ tệp
- Mở một tệp để đọc dữ liệu: dùng hàm tạo một đối số của lớp
DataInputStream tạo đối tượng gắn với tệp cần mở, với đối số truyền vào là đối tượng lớp FileInputStream.
- Đọc dữ liệu: sử dụng phương thức tương ứng cho từng kiểu dữ liệu
- Đóng tệp: dùng phương thức close(), hủy đối tượng gắn với tệp, giải phóng
tài nguyên hệ thống
Cú pháp chung:
FileInputStream fin = new FileInputStream(String filename);
DataInputStream dataIn = new DataInputStream(fin); // tạo đối tượng DataInputStream gắn với tệp cần mở
// đọc dữ liệu từ tệp
dataIn.close(); // hủy đối tượng gắn với tệp, giải phóng tài nguyên hệ thống.
Ghi dữ liệu ra tệp
Trang 12- Mở một tệp để ghi dữ liệu: dùng hàm tạo một đối số của lớp
DataOutputStream tạo đối tượng gắn với tệp cần mở, với đối số truyền vào là đối tượng lớp FileOutputStream.
- Ghi dữ liệu: sử dụng phương thức tương ứng cho từng kiểu dữ liệu
- Đóng tệp: dùng phương thức close(), hủy đối tượng gắn với tệp, giải phóng
tài nguyên hệ thống
Cú pháp chung:
FileOutputStream fout = new FileOutputStream(String filename);
DataOutputStream dataOut = new DataOutputStream(fout); // tạo đối tượng DataOutputStream gắn với tệp cần mở
// ghi dữ liệu xuống tệp
dataIn.close(); // hủy đối tượng gắn với file, giải phóng tài nguyên hệ thống.
Trang 14// Now, read them back
Trang 15cù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.
Reader
abstract void close( ) Đóng luồng
void mark(int numChars) Đánh dấu vị trí hiện tại trên luồng
boolean markSupported( ) Kiểm tra xem luồng có hỗ trợ thao tác đánh
dấu mark() không?
int read(char buffer[ ]) Đọc buffer.length ký tự cho vào buffer
abstract int read(char buffer[ ],
int offset, int numChars)
Đọc numChars ký tự cho vào vùng đệmbuffer tại vị trí buffer[offset]
boolean ready( ) Kiểm tra xem luồng có đọc được không?
void reset( ) Dời con trỏ nhập đến vị trí đánh dấu trước đó
long skip(long numChars) Bỏ qua numChars của luồng nhập
Writer
abstract void close( ) Đóng luồng xuất Có lỗi đưa ra IOException
abstract void flush( ) Dọn dẹp luồng (buffer xuất)
void write(int ch) Ghi một ký tự
void write(byte buffer[ ]) Ghi một mảng các ký tự
abstract void write(char
buffer[ ], int offset, int
numChars)
Ghi một phần của mảng ký tự
Trang 16void write(String str) Ghi một chuỗi
void write(String str, int
offset,
int numChars)
Ghi một phần của một chuỗi ký tự
Thông thường để vào/ra tệp người ta thường dùng luồng byte, nhưng đốivớ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ùngluồ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 vào/ra dữ liệu ký tự xuống tệp là FileReader và FileWriter.
Đọc dữ liệu từ tệp
- Mở một tệp để đọc dữ liệu: dùng hàm tạo một đối số của lớp FileReader tạo
đối tượng gắn với tệp cần mở, tên tệp cần mở là đối số truyền vào cho hàm tạo
của lớp Tạo một bộ đệm đọc dữ liệu (BufferedReader) gắn với đối tượng FileReader.
- Đọc dữ liệu: dùng phương thức read() hoặc readLine() trên đối bộ đệm đọc
Trang 17 Ghi dữ liệu ra tệp
- Mở một tệp để ghi dữ liệu: dùng hàm tạo một đối số của lớp FileWriter tạo
đối tượng gắn với tệp cần mở, tên tệp cần mở là đối số truyền vào cho hàm tạo
của lớp Tạo một bộ đệm ghi dữ liệu (BufferedWriter) gắn với đối tượng FileWriter.
- Ghi dữ liệu: sử dụng phương thức write() trên bộ đệm đọc dữ liệu.
Đọ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”
Trang 19Ví dụ: đọc và hiển thị nội dung của file “test.txt” lên màn hình
FileReader fr = new FileReader("D:\\test.txt");
BufferedReader br = new BufferedReader(fr);
- Bai tap lon: Lap trinh JaVa
- Giang vien huong dan: Thay Ngo Cong Thang
- Sinh vien thuc hien:
Nguyen Thi Linh Chi
Vu Thi Mai Hoa
Pham Van Huong
Trang 20Le Thi Hong Nhung
Nguyen Thi Sen
*- De tai:
+ Tim hieu vao/ra tep (text/binary) trong JaVa
+ Viet chuong trinh nhap vao mot danh sach sinh vien voi cac thong tin la
Ma sinh vien, ho ten, ngay sinh.
Ghi danh sach sinh vien ra tep Doc lai danh sach sinh vien tu tep,tach ho ten thanh ho dem va ten,
sap xep danh sach theo ten van ABC, neu trung ten sap xep theo ho dem Chuong trinh co kha nang nhap du lieu
tu tep Excel va ghi du lieu ra tep Excel.
Trang 21int choice;
String filename = "";
end_while:
while (true) {
System.out.println();
System.out.println("1 Nhap danh sach sinh vien tu ban phim."); System.out.println("2 Hien danh sach sinh vien ra man hinh."); System.out.println("3 Sap xep danh sach sinh vien theo ho ten."); System.out.println("4 Ghi danh sach sinh vien tu tep van ban."); System.out.println("5 Doc danh sach sinh vien ra tep van ban."); System.out.println("6 Ghi danh sach sinh vien tu tep Excel."); System.out.println("7 Doc danh sach sinh vien tu tep Excel."); System.out.println("8 Thoat chuong trinh.");
System.out.print("Nhap lua chon: ");
choice = cin.getInt();
switch (choice) {
case 1:
stdList = inputStudentList();
break;
case 2:
if (stdList != null) showStudentList(stdList);
else System.out.println("Khong co sinh vien trong danh sach.");
break;
case 3:
Trang 22System.out.print("\nDANH SACH SINH VIEN DA DUOC LUU VAO TEP "+filename);
Trang 23if (stdList != null)
{ excelOutput(stdList, filename);
System.out.print("\nDANH SACH SINH VIEN
DA DUOC LUU VAO TEP "+filename);
System.out.println();
} else
System.out.println("Khong co sinh vien trong danh sach.");
}
public static Student[] inputStudentList()
Trang 24System.out.print("Nhap so sinh vien: ");
std_num = cin.getInt();
} while (std_num <= 0);
std = new Student[std_num];
System.out.println("Nhap danh sach sinh vien:");
for (int i = 0; i < std_num; i++) {
System.out.printf("Nhap sinh vien thu %d:\n", i + 1);
System.out.print("Nhap ma sinh vien: ");
}
public static void showStudentList(Student[] std)
Trang 25int std_num = std.length;
System.out.println();
System.out.println();
System.out.println("Danh sach sinh vien:");
System.out.printf("%-15s %-20s %-15s\n", "Ma sinh vien", "Ho ten", "Ngay sinh");
for (int i = 0; i < std_num; i++)
System.out.printf("%-15s %-20s %-15s\n", std[i].getStudentID(), std[i].getFullName(), std[i].getDayOfBirth());
FileReader freader = new FileReader(filename);
BufferedReader buffered = new BufferedReader(freader);
Trang 26int l_index = std_info.lastIndexOf(" ");
showStudentList(std);
buffered.close();
} catch (IOException exc) {
System.out.println("Khong the mo tep");
} return std;
FileWriter fwriter = new FileWriter(filename);
BufferedWriter buffered = new BufferedWriter(fwriter);
buffered.write("" + std_num);
buffered.newLine();