Bài 11. Input và output. Trịnh Thành Trung.

Similar documents
Bộ môn HTMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì?

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE:

Tài liệu hướng dẫn: Stored Procedure

Internet Protocol. Bởi: Phạm Nguyễn Bảo Nguyên

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM)

HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA

Bộ môn MMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Nhấn nút New để tạo 1 biến mới Trang 17

Exceptions. Outline 7/31/2012. Exceptions. Exception handling is an important aspect of objectoriented. Chapter 10 focuses on:

Hướng dẫn cài đặt FPT

Chương 5. Network Layer. Phần 1 - Địa chỉ IPv4. Tài liệu : Forouzan, Data Communication and Networking

HƯỚNG DẪN SỬ DỤNG PLESK PANEL

Chương 5. Network Layer 19/09/2016 1

LÂ P TRI NH WEB ASP.NET

Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng.

ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO

BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C#

HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER

Chương 6. Transport Layer. Tài liệu : Forouzan, Data Communication and Networking

Entity Framework (EF)

Nội dung chính của chương. Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào?

Tình huống 1: PPPoE với Username và Password

Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính

Bài Thực hành Asp.Net - Buổi 1 - Trang: 1

Cài đặt và cấu hình StarWind iscsi trên Windows. iscsi SAN là gì?

STACK và QUEUE. Lấy STACK

Tạo Project với MPLAB

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS (4CH - 8CH - 16CH)

Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ

TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO

B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam;

CẤU TRÚC DỮ LIỆU NÂNG CAO

Chương 7. Application Layer. Tài liệu : Forouzan, Data Communication and Networking

CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE)

SIMULATE AND CONTROL ROBOT

SIEMENS INDUSTRIAL NETWORKS

Đa ngôn ngữ (Internationalization) trong Servlet

Môn Học: Cơ Sở Dữ Liệu 2. Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN

BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3

BELGIUM ONLINE APPOINTMENT

Online Appointment System will work better with below conditions/ Hệ thống đặt hẹn online sẽ hoạt động tốt hơn với điều kiện sau đây:

Kỹ thuật thu nhỏ đối tượng trong Design (Layout)

Cập nhật ResultSet trong JDBC

BÀI GIẢNG CHƯƠNG 3 GIAO TIẾP KẾT NỐI SỐ LIỆU

PHÁT TRIỂN ỨNG DỤNG WEB

Mô hình dữ liệu quan hệ (Relational data model)

Bài tập lớn số 1. Giả lập bộ định thời

1 Bước 1: Test thử kit LaunchPad.

NHẬP MÔN LẬP TRÌNH KHOA HỌC DỮ LIỆU. Bài 10: Thư viện Pandas (2)

MỤC LỤC. Giáo trình Thiết kế web Trang 1

I. Hướng Dẫn Đăng Nhập:

TỔNG QUAN VỀ.NET VÀ C#

Hướng Dẫn Thực Hành Tập tin & Thư mục

Ôn tập Thiết bị mạng và truyền thông DH07TT - Lưu hành nội bộ (không sao chép dưới mọi hình thức)

Lecture 12. Trees (1/2) Nội dung bài học:

HTML DOM - Forms. MSc. nguyenhominhduc

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG HOSTING PLESK PANEL

Các kiểu định địa chỉ họ MSC-51

Kích hoạt phương thức xa (RMI- Remote Method Invocation )

NHÚNG. Vi ñiều khiển BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 2

HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG

LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách)

HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT

GV: Phạm Đình Sắc or

Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MINICHAT. Bài giảng 3. Trang1. Khoa Khoa Học Và Kỹ Thuật Máy Tính

LAB IP SLA Bài 1. Bùi Quốc Kỳ ***

Bài 10. Cấu trúc liên nối. khác nhau được gọi là cấu trúc liên nối. nhu cầu trao đổi giữa các module.

KIẾN TRÚC MÁY TÍNH. Giảng viên: ThS. Phan Thanh Toàn. v

Bài tập căn bản Visual Basic.Net Vòng lặp. txtn. txtketqua. btntinh. txtn. txtketqua. btntinh. Trang 1

Bài 13: C++11. EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

Tạo repository mới. The working tree. The staging index. Lệnh git init tạo một repository loại git. tại thư mục hiện tại: $ git init

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

Khoa Công Nghệ Thông Tin Trường Đại Học Cần Thơ. Những hỗ trợ tiên tiến khác của SQL. Đỗ Thanh Nghị

Dọn "rác" Windows 7 vào dịp cuối năm

Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY

Tính kế thừa-2. Bởi: Thanh Hiền Vũ. Định nghĩa lại các thành viên lớp cơ sở trong một lớp dẫn xuất:

BẢO MẬT TRONG SQL SERVER

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5.

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

Hệ điều hành Bài tập tuần 7_ Chúng ta làm quen một số lệnh thao tác với hệ thống file trong Linux :

Mạng máy tính - Computer Network: Hệ. Giao thức - Protocol:

B3: Bên khung Package Explore bên trái đi tới thư mục res, bạn sẽ thấy có 3 thư mục con:

ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN

Phần 1: Hướng dẫn sử dụng PictureBox tạo Slide Show

Qu n ả tr h ố g t p ậ tin

BÀI LAB ĐỔI TÊN DOMAIN

Nội dung. Thêm về Java 2. Nguyễn Việt Hà

Bài 6: Xuất nhập (input/output) EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

HƯỚNG DẪN QUẢN TRỊ HỆ THỐNG

Google Search Engine. 12/24/2014 Google Search Engine 1

Tìm hiểu Group Policy Object và các ví dụ

biến Global có thể được áp dụng cho tất cả các extension trong tất cả các context trong Dialplan.

LẬP TRÌNH 8051 SỐ HỌC VÀ LÔ GIC

Giao tiếp giữa các tiến trình

2.4. GIAO THỨC MQTT Các khái niệm cơ bản MQTT được phát triển bởi IBM và Eurotech, phiên bản mới nhất là MQTT 3.1 MQTT (Giao vận tầm xa) là

BÀI THỰC HÀNH SỐ 1. Quản trị tập tin: 1/ Tạo các thư mục sau: Bài tập thực hành linux Linuxlab. bt1 bt11 bt111. bt121. bt12. bh1 bh11 bh111.

dụng một chính sách, điều này giúp dễ dàng quản lý và cung cấp tính năng Load Balancing (cân bằng tải) phục vụ tốt hơn các yêu cầu của tổ chức.

Transcription:

Bài 11 Input và output Trịnh Thành Trung trungtt@soict.hust.edu.vn

Nội dung 1. Tổng quan 2. I/O với file text 3. I/O với file nhị phân 4. Một số luồng trong Java

1 Tổng quan Mô hình input và output trong Java

Tổng quan I/O = Input/Output Ở đây là đưa dữ liệu vào (input) và lấy dữ liệu ra (output) từ chương trình Input có thể là từ bàn phím hoặc từ file Output có thể là ra thiết bị hiển thị (màn hình) hoặc ra file Ưu điểm của file I/O Sao lưu trên máy Output từ một chương trình có thể trở thành input cho một chương trình khác Các giá trị input có thể được tự động nhập (thay vì phải gõ từng giá trị) 4

Luồng Luồng: Là một đối tượng đưa dữ liệu đến một đích đến (màn hình, file...) hoặc lấy dữ liệu từ một nguồn (bàn phím, file...) Luồng hoạt động như một bộ đệm giữa nguồn dữ liệu và đích đến Luồng vào - Input stream: Luồng đưa dữ liệu vào chương trình + System.in là input stream Luồng ra - Output stream: Luồng nhận dữ liệu từ một chương trình + System.out là output stream Luồng kết nối chương trình với một đối tượng I/O System.out kết nối chương trình với màn hình System.in kết nối chương trình với bàn phím 5

Mô hình I/O Mô hình luồng Mở luồng Sử dụng luồng (read, write, hoặc cả hai) Đóng luồng Open stream Use stream Close stream

Mở luồng Sử dụng khi có dữ liệu bên ngoài chương trình mà chúng ta cần lấy, hoặc chúng ta cần đặt dữ liệu đâu đó bên ngoài chương trình Khi mở một luồng, chúng ta tạo ra một kết nối đến vị trị bên ngoài đó Khi kết nối đã được tạo, chúng ta có thể không cần quan tâm đến vị trí bên ngoài đó và chỉ cần thao tác với luồng 7

Ví dụ FileReader được sử dụng để kết nối với một file sẽ được sử dụng cho input: FileReader filereader = new FileReader(fileName); filename xác định vị trí của file Chúng ta không cần phải sử dụng đến filename nữa. Thay vào đó ta sử dụng filereader

Sử dụng luồng Một số luồng chỉ có thể được sử dụng cho input, một số chỉ sử dụng cho output, trong khi một số có thể được sử dụng cho cả hai Sử dụng một luồng có nghĩa là thực hiện việc đưa dữ liệu vào hoặc lấy dữ liệu ra từ luồng đó Tuy nhiên, ta vẫn cần phải xử lý dữ liệu khi chúng đi vào hay đi ra theo một cách nào đó 9

Ví dụ int charasint; charasint = filereader.read( ); filereader.read(): Đọc một ký tự Trả ký tự về dạng int, Trả về -1 nếu không còn ký tự để đọc Có thể ép kiểu int về char: char ch = (char) filereader.read( );

Đóng bufferedreader.close( ); Chúng ta không nên để hai luồng mở cùng lúc Cần phải đóng luồng trước khi chúng ta mở luồng trở lại Thông thường Java sẽ tự đóng các luồng khi chương trình kết thúc, tuy nhiên chúng ta không nên quá phụ thuộc vào điều này 11

Nằm Lớp trong xử gói java.io lý io trong Java java.lang.object InputStream OutputStream FileInputStream FileOutputStream Reader Writer InputStreamReader BufferedReader OutputStreamWriter PrintWriter FileReader FileWriter IOException File 12

Lớp File Một đối tượng File thể hiện một đường dẫn trừu tượng Bao gồm cả đường dẫn và tên file Phương thức khởi tạo lấy tham số là File info = new File("Letter.txt"); Không ngoại lệ nào được tung ra nếu file không tồn tại Các thể hiện của lớp File là bất biến (immutable một khi đã được khởi tạo thì không thể thay đổi đường dẫn file được) 13

Các phương thức của lớp File File info = new File("Letter.txt"); if(info.exists()) { System.out.println("Size of " + info.getname()+ " is "+info.length()); if(info.isdirectory()) { System.out.println("The file is a directory."); } if(info.canread()) { System.out.println("The file is readable."); } if(info.canwrite()) { System.out.println("The file is writeable."); } }

File text và file nhị phân Tất cả các dữ liệu và chương trình bản chất là các số 0 và 1 Mỗi chữ số chỉ có thể mang 2 giá trị này, do đó chúng ta gọi là nhị phân bit là một chữ số nhị phân byte là một tập 8 bit 15

File text và file nhị phân File nhị phân: Các bit thể hiện các kiểu khác nhau của thông tin đã được mã hóa, ví dụ các chỉ lệnh hoặc các dữ liệu số học Những file này có thể dễ dàng được đọc bởi máy tính nhưng khó đọc đối với con người Nhưng file này không «in» ra được (Có thể in ra được nhưng không đọc được) File Text: Các bit thể hiện các ký tự chữ cái Mỗi chữ cái ASCII là 1 byte Ví dụ: File mã nguồn Java hoặc các file tạo bởi Notepad, gedit... 16

File nhị phân Java File nhị phân Java có thể được sử dụng bởi Java trên nhiều máy khác nhau Đọc và viết các file nhị phân thường được thực hiện bởi chương trình Các file text chỉ được sử dụng để giao tiếp với con người 17

2 I/O với file text FileReader và FileWriter

19 Xử lý file text Sử dụng FileReader và FileWriter FileReader: Luồng đọc các ký tự FileReader(String filename) read(): làm việc với char và char[] FileWriter: Luồng ghi các ký tự FileWriter(String filename) write(): làm việc với char và char[]. 19

Mở và đóng file try { // Try to open the file. FileReader inputfile = new FileReader(filename); // Process the file's contents.... // Close the file now that it is finished with. inputfile.close(); } catch(filenotfoundexception e) { System.out.println("Unable to open "+filename); } catch(ioexception e) { // The file could not be read or closed. System.out.println("Unable to process "+filename); } 20

Copy từng ký tự vào file static void copyfile(filereader inputfile, FileWriter outputfile) { try{ // Read the first character. int nextchar = inputfile.read(); // Have we reached the end of file? while(nextchar!= -1) { outputfile.write(nextchar); // Read the next character. nextchar = inputfile.read(); } outputfile.flush(); } catch(ioexception e) { System.out.println("Unable to copy file"); } }

Copy nhiều ký tự static void copyfile(filereader inputfile, FileWriter outputfile) throws IOException { final int buffersize = 1024; char[] buffer = new char[buffersize]; // Read the first chunk of characters. int numberread = inputfile.read(buffer); while(numberread > 0) { // Write out what was read. outputfile.write(buffer,0,numberread); numberread = inputfile.read(buffer); } outputfile.flush(); } 22

Làm việc với dòng Trong rất nhiều trường hợp chúng ta làm việc với từng dòng thay vì làm việc với char Ví dụ: Các file config.ini Java hỗ trợ hai lớp BufferedReader và BufferedWriter cho việc này Khởi tạo bằng các đối tượng FileReader và FileWriter tương ứng 23

Ví dụ try { FileReader in = new FileReader(infile); BufferedReader reader = new BufferedReader(in); FileWriter out = new FileWriter(outfile); BufferedWriter writer = new BufferedWriter(out);... reader.close(); writer.close(); } catch(filenotfoundexception e) { System.out.println(e.getMessage()); } catch(ioexception e) { System.out.println(e.getMessage()); } 24

Copy từng dòng BufferedReader reader = new BufferedReader(...); // Read the first line. String line = reader.readline(); // null returned on EOF. while(line!= null) { // Write the whole line. writer.write(line); // Add the newline character. writer.newline(); // Read the next line. line = reader.readline(); } 25

PrintWriter In trực tiếp ra màn hình try { FileWriter out = new FileWriter(outfile); PrintWriter writer = new PrintWriter(out); writer.println( ); writer.close(); } catch(ioexception e) { System.out.println(e.getMessage()); }

3 I/O với file nhị phân FileInputStream và FileOutputStream

Luồng input, output nhị phân Sử dụng lớp FileInputStream và FileOutputStream FileInputStream/FileOutputStream liên kết một luồng input/output nhị phân với một file liên kết ngoài Tất các các phương thức trong FileInputStream và FileOutputStream đều được thừa kế từ các lớp cha 28

FileInputStream Phương thức khởi tạo public FileInputStream(String filename) public FileInputStream(File file) Ngoại lệ java.io.filenotfoundexception có thể xảy ra nếu ta sử dụng FileInputStream với file không tồn tại 29

Các phương thức của FileInputStream 1. read(): int 2. read(b: byte[]): int 3. read(b: byte[], off: int, len: int): int 4. available(): int 5. close(): void 6. skip(n: long): long 7. marksupported(): boolean 8. mark(readlimit: int): void 9. reset(): void 30

FileOutputStream Phương thức khởi tạo public FileOutputStream(String filename) public FileOutputStream(File file) public FileOutputStream(String filename, boolean append) public FileOutputStream(File file, boolean append) Nếu file không tồn tại thì file mới sẽ được tạo Nếu file tồn tại, 2 phương thức khởi tạo đầu tiên sẽ xóa nội dung hiện tại của file. Để có thể giữ lại nội dung và thêm dữ liệu vào file, ta sử dụng 2 phương thức khởi tạo ở dưới với tham số append là true 31

FileOutputStream 1. write(int b): void 2. write(b: byte[]): void 3. write(b: byte[], off: int, len: int): void 4. close(): void 5. flush(): void 32

Ví dụ FileOutputStream import java.io.*; class FileOutputStreamDemo { public static void main(string args[]) throws Exception { String source = "Now is the time for all good men\\n" + " to come to the aid of their country\\n" + " and pay their due taxes."; byte buf[] = source.getbytes(); OutputStream f0 = new FileOutputStream("file1.txt"); 33

Ví dụ FileOutputStream (tiếp) for (int i=0; i < buf.length; i += 2) { f0.write(buf[i]); } f0.close(); OutputStream f1 = new FileOutputStream("file2.txt"); f1.write(buf); f1.close(); } } OutputStream f2 = new FileOutputStream("file3.txt"); f2.write(buf,buf.length-buf.length/4,buf.length/4); f2.close(); 34

Ví dụ FileOutputStream (tiếp) file1.txt: Nwi h iefralgo e t oet h i ftercuty n a hi u ae. file2.txt: Now is the time for all good men to come to the aid of their country and pay their due taxes. file3.txt: nd pay their due taxes.

Làm việc với đối tượng Ta có thể đọc và ghi các đối tượng vào file Quá trình này được gọi là quá trình tuần tự - serialization Quá trình tuần tự ở các ngôn ngữ khác có thể rất khó khăn vì các đối tượng có thể chứa các tham chiếu đến các đối tượng khác. Java giúp cho quá trình này khá dễ dàng 36

Điều kiện cho quá trình tuần tự Để một đối tượng có thể được tuần tự hóa thì Lớp đó phải được khai báo public Thực thi giao diện Serializable Phải có một phương thức khởi tạo không tham số Tất cả các thành phần của lớp đó phải có thể tuần tự hóa được: Hoặc là kiểu nguyên thủy hoặc là các đối tượng Serializable 37

Giao diện Serializable Thông thường để thực thi một giao diện đồng nghĩa với việc phải viết tất cả các phương thức được khai báo bởi giao diện đó. Tuy nhiên, giao diện Serializable không định nghĩa bất kỳ phương thức nào Lý do: Java sử dụng giao diện Serializable như là một flag để xử lý với các lớp 38

Làm việc với đối tượng Sử dụng các lớp ObjectStreamReader và ObjectStreamWriter Khởi tạo bằng các đối tượng FileInputStream và FileOutputStream tương ứng 39

Ghi đối tượng ra file FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeobject(new Date()); oos.writeobject("today"); oos.writeint(12345); oos.close();

Đọc đối tượng từ file FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); Date date = (Date) ois.readobject(); String today = (String) ois.readobject(); int i = ois.readint(); ois.close();

4 Một số luồng trong Java Scanner & printf

Các luồng có sẵn trong Java Tất cả các chương trình Java đều tự động import gói java.lang Gói java.lang định nghĩa một lớp gọi là System đóng gói nhiều thành phần khác nhau của môi trường làm việc Lớp System chứa 3 biến stream có sẵn in, out, err (System.in, System.out, System.err) Nhưng biến này được khai báo public và static trong lớp System. 43

Các luồng có sẵn trong Java System.out sử dụng cho luồng output tiêu chuẩn đưa dữ liệu mặc định ra console (màn hình) System.in sử dụng luồng input tiêu chuẩn mặc định là bàn phím (bàn phím) System.err sử dụng luồng in lỗi, cũng đưa dữ liệu mặc định ra console (màn hình) Những luồng này có thể được định hướng lại đến bất kỳ thiết bị I/O phù hợp nào 44

Các luồng có sẵn trong Java System.in là một đối tượng kiểu InputStream. (byte stream) System.out là một đối tượng kiểu PrintStream. (byte stream) System.err là một đối tượng kiểu PrintStream. (byte stream) đều là luồng byte, KHÔNG PHẢI LÀ luồng character 45

java.util.scanner Đọc input Đầu tiên, chúng ta cần tạo một đối tượng Scanner Đọc từ bàn phím (System.in) Scanner scanner = new Scanner(System.in); Đọc từ file: File myfile = new File("myFileName.txt"); Scanner scanner = new Scanner(myFile); + Ngoại lệ FileNotFound có thể được tung ra Đọc một String: Scanner scanner = new Scanner(myString); + Hữu ích khi cần parse một String 46

Sử dụng Scanner Đầu tiên, chúng ta phải bảo đảm Scanner có dữ liệu để đọc scanner.hasnext() boolean Không cần phải dùng nếu chúng ta sử dụng bàn phím Có thể đọc từng dòng một scanner.nextline() String Có thể đọc từng "khối" Một khối là một chuỗi các ký tự không chứa khoảng trắng scanner.next () String nextline và next trả về String, chúng ta cần phải convert về số hoặc về kiểu tương ứng Bên cạnh đó cũng có những phương thức trả trực tiếp về các kiểu nguyên thủy 47

Sử dụng Scanner Các phương thức trả về các kiểu nguyên thủy boolean b = sc.nextboolean(); byte by = sc.nextbyte(); short sh = sc.nextshort(); int i long l float f = sc.nextint(); = sc.nextlong(); = sc.nextfloat(); double d = sc.nextdouble(); Các phương thức kiểm tra hasnextboolean() hasnextbyte() hasnextshort() hasnextint() hasnextlong() hasnextfloat() hasnextdouble() 48

Định dạng output Java có phương thức printf tương tự C Các định dạng sử dụng ký tự % với s cho string, d cho integer, f cho số floating point Ví dụ: double pi = Math.PI; System.out.printf("%8s %-8s %6d %-6d %8f %-8.2f :)\n", "abc", "def", 123, 456, pi, pi); System.out.printf("%8s %-8s %6d %-6d", "abcdef", "ghijkl", 12345, 6789); Output: abc def 123 456 3.141593 3.14 :) abcdef ghijkl 12345 6789 49

Tổng kết Mô hình làm việc với luồng I/O Mở luồng -> Sử dụng -> Đóng luồng I/O với file text Làm việc với char: FileReader và FileWriter Làm việc với từng dòng: BufferredReader và BufferredWriter (khởi tạo bằng đối tượng FileReader và FileWriter) I/O với file nhị phân Làm việc với byte: FileInputStream và FileOutputStream Làm việc với đối tượng: ObjectInputStream và ObjectOutputStream (khởi tạo bằng đối tượng FileInputStream và FileOutputStream) Cần thực thi giao diện Serializable

Thank you! Any questions?