Chương 4 Vào ra dữ liệu trong Java

TR N MINH THÁI Email: minhthai@huflit.edu.vn Website: www.minhthai.edu.vn

Cập nhật: 18 tháng 07 năm 2016

Nội dung

#2

Tổng quan về vào ra dữ liệu trong Java

1.

Các lớp vào ra theo luồng ký tự

2.

Các lớp vào ra theo luồng byte

3.

Lớp File

4.

Vào ra đối tượng và áp dụng

5.

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

• 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ế

• Vào dữ liệu từ thiết bị chuẩn (bàn phím): System.in

để xử lý dễ dàng hơn:

• new BufferedReader(new InputStreamReader(System.in))

• new Scanner(System.in)

• Thường được sử dụng để khởi tạo các đối tượng luồng khác

• Một đối tượng của lớp PrintStream

• Cung cấp các phương thức đầy đủ

• Ra dữ liệu trên thiết bị chuẩn (màn hình): System.out

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

• Phương thức write(int)

• FileOutputStream(filePath): ghi dữ liệu theo luồng

• 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 đè)

• DataOutputStream(outputStreamObject): ghi dữ liệu cơ bản

Vào ra dữ liệu trên file nhị phân

#10

Đọc file

• Phương thức int read() trả về -1 nếu đọc hết file

• FileInputStream(filePath): đọc dữ liệu theo luồng

• Phương thức readInt(), readDouble(),...

• DataInputStream(inputStreamObject): đọc dữ liệu cơ bản

Đó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

#16

Ví 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ả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

#20

public 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);

Nguyen Van An:7.5 Lam Thanh Ngoc:8.0 Phan Nhu Thong:6.9

for(int i=0; i<3; i++){ printWriter.println(hoTen[i]+":"+dtb[i]); } out.close(); } catch(IOException e){ System.out.println(e); } } }

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

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

• Định nghĩa lại trong phương thức khởi tạo

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() + " ");

Nguyen Van An 7.5 Lam Thanh Ngoc 8.0 Phan Nhu Thong 6.9

} System.out.println(); } } catch(IOException e){ System.out.println(e); } } }

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

trong thư mục Project hiện hành

- Đầu vào: file text “input.txt” chứa nội dung văn bản được lưu

- Đầ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

tính

• Cung cấp các phương thức thao tác với file, thư mục trên máy

• 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)

• Các phương thức khởi tạo:

Lớp File – Các phương thức

#25

File

• boolean mkdir(): 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 mkdirs(): tạo thư mục có tên chỉ ra khi khởi tạo đối tượng

• createNewFile(): tạo file mới

• boolean isDirectory(): trả về true nếu là thư mục

• boolean isFile(): trả về true nếu là file

Lớp File – Các phương thức

#26

• boolean canRead(): trả về true nếu có quyền đọc

• boolean canWrite(): trả về true nếu có quyền ghi

• boolean canExecute(): trả về true nếu có quyền thực thi

• String getName()

• String getParent()

Lớp File – Các phương thức

#27

• String[] list(): trả về tên các thư mục con và file

file có chứa filter

• String[] list(FileNameFilter filter): trả về tên các thư mục con và

• File[] listFiles()

filter

• File[] listFiles(FileFilter filter): trả về các đối tượng file thỏa mãn

Lớp File – Các phương thức

#28

• boolean exists(): trả về true nếu tồn tại file, thư mục

long length(): trả về kích thước của file (byte)

• boolean delete()

• void deleteOnExit(): xóa khi tắt máy ảo JVM

• boolean renameTo(File dest): đổi tên

• boolean setReadOnly(): thiết lập thuộc tính read-only

Ví dụ liệt kê các file có phần mở rộng tương ứng trong thư mục

#29

public 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ục

#30

public 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ập

#31

Tì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 Files

#32

• Cá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ống

Paths.get(String filePath)

• Tạo đối tượng Path từ đường dẫn file

Lớp Files – Các phương thức

#33

• boolean isDirectory(Path): trả về true nếu là thư mục

• boolean isRegularFile(Path): trả về true nếu là file

• boolean isReadable(Path): trả về true nếu được phép đọc

• boolean isWritable(Path)

• boolean isExecutable(Path)

Lớp Files – Các phương thức

#34

• Path createFile(Path, FileAttribute): tạo file

• Path createDirectory(Path, FileAttribute): tạo thư mục

gồm cả thư mục cha nếu không tồn tại

• Path createDirectories(Path, FileAttribute): thạo thư mục, bao

Lớp Files – Các phương thức

#35

• void deleteIfExist(Path): xóa

• boolean notExist(Path): trả về true nếu file không tồn tại

long 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 đọc

#36

• byte[] readAllBytes(Path): đọc nội dung file vào mảng byte

tượng BufferedReader

• BufferedReader newBufferedReader(Path): mở file và trả lại đối

• BufferedReader 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)

lại đối tượng InputStream

• InputStream newInputStream(Path, OpenOption): mở file và trả

Lớp Files – Các phương thức ghi

#37

• Path 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 để ghi

• BufferedWriter newBufferedWriter(Path, Charset, OpenOption)

một đối tượng OutputStream để ghi

• OutputStream newOutputStream(Path, OpenOption): mở và tạo

Lớp Files – Các OpenOption

#38

• APPEND: ghi tiếp

• CREATE: tạo file mới và ghi

• READ: mở để đọc

• WRITE: mở để ghi

• DELETE_ON_CLOSE: xóa khi đóng file

truy cập vào file

• DSYNC và SYNC: yêu cầu đồng bộ hóa khi có nhiều luồng cùng

Lớp Files – Các CopyOption

#39

• COPY_ATTRIBUTES: Sao chép cả thuộc tính

• REPLACE_EXISTING: chép đè lên file cũ (nếu có)

Q&A

#40