Bài giảng Lập trình hướng đối tượng - Chương 4: Vào ra dữ liệu trong Java - Trần Minh Thái
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
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình hướng đối tượng - Chương 4: Vào ra dữ liệu trong Java - Trần Minh Thái, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 4 Vào ra dữ liệu trong JavaTRẦN MINH THÁIEmail: minhthai@huflit.edu.vnWebsite: www.minhthai.edu.vn Cập nhật: 18 tháng 07 năm 2016Nội dungTổng quan về vào ra dữ liệu trong JavaCác lớp vào ra theo luồng ký tựCác lớp vào ra theo luồng byteLớp FileVào ra đối tượng và áp dụngTổng quan về vào ra dữ liệuCác lớp vào ra theo luồng ký tựCác lớp vào ra theo luồng byteVào ra dữ liệu trên thiết bị chuẩnVào dữ liệu từ thiết bị chuẩn (bàn phím): System.inMột đối tượng của lớp InputStream đọc ghi theo luồng byteCá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.outMột đối tượng của lớp PrintStreamCung cấp các phương thức đầy đủVào ra dữ liệu trên fileBước 1. Tạo đối tượng file để đọc/ ghiBước 2. Thao tác xử lý trên fileBước 3. Đóng fileVào ra dữ liệu trên fileCó hai dạng fileFile nhị phân: Dữ liệu được tổ chức theo dạng bit-by-bitFile văn bản:Vào ra dữ liệu trên file nhị phânGhi fileFileOutputStream(filePath): ghi dữ liệu theo luồngPhương thức write(int) DataOutputStream(outputStreamObject): ghi dữ liệu cơ bảnPhươ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Đọc fileFileInputStream(filePath): đọc dữ liệu theo luồngPhương thức int read() trả về -1 nếu đọc hết fileDataInputStream(inputStreamObject): đọc dữ liệu cơ bảnPhương thức readInt(), readDouble(),...Đóng file: close()Ví dụVí dụ (tt)Ví dụ (tt)Ví dụ (tt)Vào ra sử dụng bộ đệmGhi dữ liệu sử dụng bộ đệm: BufferedOutputStreamKhởi tạo: BufferedOutputStream(outputStreamObject)Phương thức flush(): xóa bộ đệmPhương thức write(int): ghi dữ liệuĐọc dữ liệu sử dụng bộ đệm: BufferedInputStreamKhởi tạo: BufferedInputStream(inputStreamObject)Phương thức available(): trả về 0 nếu đọc hết dữ liệuPhương thức read(int): trả về -1 nếu đọc hết dữ liệuVí dụpublic void copyFile(){ try { 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ảnFileReaderKhởi tạo: FileReader(filePath)Phương thức read(): đọc từng ký tựTrả về -1 nếu hết fileFileWriterKhởi tạo: FileWriter(filePath)Phương thức write(): ghi dữ liệu vào filepublic static void main(String []args){ try { //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ảnGhi từng dòng văn bản: Sử dụng PrintWriterKhở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 BufferedWriterKhở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 BufferedReaderKhởi tạo: new BufferedReader(readerObject)Phương thức: String readLine() trả về null nếu đọc hết filepublic class FileTextDungPrintWriter { public static void main(String []args){ String []hoTen = {"Nguyen Van An", "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.5Lam Thanh Ngoc:8.0Phan Nhu Thong:6.9Tách xâu ký tự theo dấu hiệu phân cách (delimiter)java.util.StringTokenizerDelimiter: 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 theohasMoreTokens(): 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 đượcpublic class FileTextDungBufferedReader { public static void main(String []args){ try{ FileReader in = 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.9Bài tậpThố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 FileCung cấp các phương thức thao tác với file, thư mục trên máy tínhCá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ứcboolean mkdir(): tạo thư mục có tên chỉ ra khi khởi tạo đối tượng Fileboolean 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ếtcreateNewFile(): tạo file mớiboolean isDirectory(): trả về true nếu là thư mụcboolean isFile(): trả về true nếu là fileLớp File – Các phương thứcboolean canRead(): trả về true nếu có quyền đọcboolean canWrite(): trả về true nếu có quyền ghiboolean canExecute(): trả về true nếu có quyền thực thiString getName()String getParent()Lớp File – Các phương thứcString[] list(): trả về tên các thư mục con và fileString[] list(FileNameFilter filter): trả về tên các thư mục con và file có chứa filterFile[] listFiles()File[] listFiles(FileFilter filter): trả về các đối tượng file thỏa mãn filterLớp File – Các phương thứcboolean exists(): trả về true nếu tồn tại file, thư mụclong length(): trả về kích thước của file (byte)boolean delete()void deleteOnExit(): xóa khi tắt máy ảo JVMboolean renameTo(File dest): đổi tênboolean setReadOnly(): thiết lập thuộc tính read-onlyVí dụ liệt kê các file có phần mở rộng tương ứng trong thư mụcpublic class TimFile implements FilenameFilter { String str; public TimFile(String ext){ str = "." + ext; } public boolean accept(File dir, String name) { return name.endsWith(str); }}Ví dụ liệt kê các file có phần mở rộng tương ứng trong thư mụcpublic class TimFile implements FilenameFilter { public static void main(String []args) { Scanner input = new Scanner(System.in); String path, ext; System.out.print("Nhap vao ten thu muc: "); path = input.nextLine(); File file = new File(path); if(file.isDirectory()){ System.out.print("Phan mo rong: "); ext = input.nextLine(); String[] children; FilenameFilter filter = new TimFile(ext); children = file.list(filter); for(String child:children) System.out.println(child); } }}Bài tậpTìm file trong thư mụcĐầu vào: tên thư mục và file cần tìmĐầu ra: đường dẫn của file tìm được (nếu có)Lớp FilesCác phương thức đều là staticĐối số là đối tượng từ lớp Path để định vị file trên hệ thốngTạo đối tượng Path từ đường dẫn file Paths.get(String filePath)Lớp Files – Các phương thứcboolean isDirectory(Path): trả về true nếu là thư mụcboolean isRegularFile(Path): trả về true nếu là fileboolean isReadable(Path): trả về true nếu được phép đọcboolean isWritable(Path)boolean isExecutable(Path)Lớp Files – Các phương thứcPath createFile(Path, FileAttribute): tạo filePath createDirectory(Path, FileAttribute): tạo thư mụcPath createDirectories(Path, FileAttribute): thạo thư mục, bao gồm cả thư mục cha nếu không tồn tạiLớp Files – Các phương thứcvoid deleteIfExist(Path): xóaboolean notExist(Path): trả về true nếu file không tồn tạilong size(Path): trả về kích thước file (byte)Path copy(Path source, Path target, CopyOption options)Path move(Path source, Path target, CopyOption options)Lớp Files – Các phương thức đọcbyte[] readAllBytes(Path): đọc nội dung file vào mảng byteBufferedReader newBufferedReader(Path): mở file và trả lại đối tượng BufferedReaderBufferedReader newBufferedReader(Path, Charset): mở file và trả lại đối tượng BufferedReader, hỗ trợ bảng mã khác (US-ASCII, UTF-16), mặc định(UTF-8)InputStream newInputStream(Path, OpenOption): mở file và trả lại đối tượng InputStreamLớp Files – Các phương thức ghiPath write(Path, byte[], OpenOption): ghi mảng byte vào file BufferedWriter newBufferedWriter(Path, OpenOption): mở và tạo một đối tượng BufferedWriter để ghiBufferedWriter newBufferedWriter(Path, Charset, OpenOption)OutputStream newOutputStream(Path, OpenOption): mở và tạo một đối tượng OutputStream để ghiLớp Files – Các OpenOptionAPPEND: ghi tiếpCREATE: tạo file mới và ghiREAD: mở để đọcWRITE: mở để ghiDELETE_ON_CLOSE: xóa khi đóng fileDSYNC và SYNC: yêu cầu đồng bộ hóa khi có nhiều luồng cùng truy cập vào fileLớp Files – Các CopyOptionCOPY_ATTRIBUTES: Sao chép cả thuộc tínhREPLACE_EXISTING: chép đè lên file cũ (nếu có)Q&A