1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Bài 8: Luồng vào ra

18 10 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 145,82 KB

Nội dung

Bài giảng Bài 8: Luồng vào ra tổng quan về luồng vào ra, các kiểu luồng vào ra (luồng byte, luồng kí tự, luồng có đệm, luồng dữ liệu, luồng đối tượng). Với các bạn chuyên ngành Công nghệ thông tin thì đây là tài liệu hữu ích.

Bài 8: Luồng vào Lê Hồng Phương phuonglh@gmail.com Khoa Toán-Cơ-Tin học Trường Đại học Khoa học Tự nhiên Hà Nội Nội dung ● Tổng quan luồng vào ● Các kiểu luồng vào ra: – Luồng byte – Luồng kí tự – Luồng có đệm – Luồng liệu – Luồng đối tượng 2012-2013 Object-Oriented Programming: I/O Streams Luồng vào ● Luồng vào (input/output streams – IO streams) – ● Có nhiều kiểu nguồn đích: – ● Biểu diễn nguồn vào đích tệp đĩa, thiết bị, chương trình, nhớ Có nhiều kiểu liệu khác nhau: – bytes – kiểu liệu đơn giản – đối tượng 2012-2013 Object-Oriented Programming: I/O Streams Luồng vào ● Định nghĩa tổng quát: luồng chuỗi liệu ● Mỗi chương trình thường sử dụng: – Một luồng vào để đọc liệu từ nguồn, lần đọc đơn vị liệu – Một luồng để ghi liệu đích, lần ghi đơn vị liệu stream Data source 2012-2013 010111000111 Object-Oriented Programming: I/O Streams Program Luồng vào ● ● ● Các chương trình sử dụng luồng byte để đọc/ghi byte (8 bits) Trong Java, có nhiều lớp luồng byte Các lớp phái sinh từ hai lớp: – InputStream – OutputStream Khi đọc/ghi liệu byte từ/vào tệp, ta sử dụng – FileInputStream – FileOutputStream 2012-2013 Object-Oriented Programming: I/O Streams Luồng byte ● ● ● Viết chương trình chép tệp, mô lệnh – cp input.txt output.txt (Unix, Linux) – copy input.txt output.txt (MS Windows) Sử dụng hai luồng byte gắn với hai tệp: – Một luồng để đọc tệp input.txt – Một luồng để ghi tệp output.txt Vòng lặp: lần đọc byte tệp input.txt ghi vào tệp output.txt Khi hết tệp hàm đọc trả -1 2012-2013 Object-Oriented Programming: I/O Streams Luồng byte public class CopyBytes { public static void main(String[] args) throws IOException { InputStream in = null; OutputStream out = null; try { in = new FileInputStream("input.txt"); out = new FileOutputStream("output.txt"); int c; while ((c = in.read()) != -1) { Tại khơng có out.write(c); khối catch? } } finally { if (in != null) in.close(); if (out != null) Ln phải đóng luồng out.close(); liệu sử dụng xong } } } 2012-2013 Object-Oriented Programming: I/O Streams Luồng byte ● ● ● Tuy nhiên, luồng byte biểu diễn thao tác vào/ra mức thấp, ta nên tránh sử dụng trực tiếp luồng Vì tệp input.txt, output.txt chứa liệu dạng kí tự, cách tốt sử dụng luồng kí tự Nếu không nên dùng trực tiếp, lại giới thiệu luồng byte? – 2012-2013 Vì luồng byte sở để xây dựng kiểu luồng khác Object-Oriented Programming: I/O Streams Luồng kí tự ● ● ● Nền tảng Java lưu giá trị kí tự sử dụng chuẩn Unicode Mọi lớp biểu diễn luồng kí tự phái sinh từ hai lớp Reader Writer Khi đọc/ghi tệp văn (luồng kí tự tệp), ta sử dụng lớp – FileReader – FileWriter 2012-2013 Object-Oriented Programming: I/O Streams Luồng kí tự public class CopyCharacters { public static void main(String[] args) throws IOException { Reader in = null; Writer out = null; try { in = new FileReader("input.txt"); out = new FileWriter("output.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } } finally { if (in != null) in.close(); if (out != null) out.close(); } } } 2012-2013 Object-Oriented Programming: I/O Streams 10 Luồng có đệm ● ● Luồng khơng đệm: – Mỗi lệnh đọc, ghi thực trực tiếp hệ điều hành – Chương trình hiệu quả, lệnh đòi hỏi truy xuất ổ đĩa, truyền liệu qua mạng thao tác tốn khác Luồng có đệm hiệu nhiều: – Đọc/ghi liệu từ/vào vùng nhớ (gọi đệm) – Khi đệm đầy gọi lệnh đọc/ghi hệ điều hành 2012-2013 Object-Oriented Programming: I/O Streams 11 Luồng có đệm ● ● Các lớp hỗ trợ luồng có đệm: – BufferedInputStream, BufferedOutputStream – BufferedReader, BufferedWriter Kích hoạt việc đọc/ghi đệm đệm chưa đầy: Gọi phương thức flush() – ● Để chuyển luồng khơng đệm thành luồng có đệm, ta tạo luồng có đệm (tương ứng): BufferedReader bufferedReader = new BufferedReader(new FileReader("input.txt")); BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("output.txt")); 2012-2013 Object-Oriented Programming: I/O Streams 12 Luồng liệu ● ● Luồng liệu hỗ trợ việc đọc, ghi giá trị thuộc kiểu liệu sở: – boolean, char, byte, short, int, long, float, double – String Mọi luồng liệu cài đặt hai giao diện sau: – ● DataInput, DataOutput Hai cài đặt sử dụng nhiều – 2012-2013 DataInputStream, DataOutputStream Object-Oriented Programming: I/O Streams 13 Luồng liệu ● ● Ví dụ, giả sử ta có biến price, unit desc chứa giá trị thuộc kiểu double, int String Ghi giá trị vào tệp: Sử dụng luồng có đệm để ghi vào tệp dataFile.dat DataOutputStream out; try { out = new DataOutputStream(new BufferedOutputStream( new FileOutputStream("dataFile.dat"))); out.writeDouble(price); Gọi phương out.writeInt(unit); thức tương ứng out out.writeUTF(desc); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 2012-2013 Object-Oriented Programming: I/O Streams 14 Luồng liệu ● Đọc liệu từ tệp gán giá trị cho biến tương ứng: DataInputStream in; try { in = new DataInputStream(new BufferedInputStream( new FileInputStream("dataFile.dat"))); double price = in.readDouble(); Gọi phương int unit = in.readInt(); thức tương ứng in String desc = in.readUTF(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 2012-2013 Object-Oriented Programming: I/O Streams 15 Luồng đối tượng ● ● ● Luồng đối tượng hỗ trợ việc đọc, ghi đối tượng Nếu đối tượng thuộc lớp cài đặt giao diện Serializable ta sử dụng luồng đối tượng để đọc, ghi đối tượng Hai lớp hỗ trợ luồng đối tượng: – ● ObjectInputStream, ObjectOutputStream Hai lớp tương ứng cài đặt giao diện – 2012-2013 ObjectInput ObjectOutput Object-Oriented Programming: I/O Streams 16 Luồng đối tượng ● ● ObjectInput ObjectOutput tương ứng giao diện giao diện DataInput DataOutput Chính vậy, phương thức vào, kiểu liệu sở DataInput, DataOutput hỗ trợ cài đặt ObjectInput, ObjectOutput ObjectOutput oo = null; try { oo = new ObjectOutputStream(new BufferedOutputStream( new FileOutputStream("dates.dat"))); oo.writeObject(Calendar.getInstance()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 2012-2013 Object-Oriented Programming: I/O Streams 17 Luồng đối tượng ObjectInput oi = null; try { oi = new ObjectInputStream(new BufferedInputStream( new FileInputStream("dates.dat"))); Calendar date = (Calendar)oi.readObject(); } catch (FileNotFoundException e) { e.printStackTrace(); Phương thức readObject() } catch (IOException e) { trả kiểu Object nên ta phải e.printStackTrace(); ép thành kiểu thích hợp } catch (ClassNotFoundException e) { e.printStackTrace(); } 2012-2013 Object-Oriented Programming: I/O Streams 18 ... Tổng quan luồng vào ● Các kiểu luồng vào ra: – Luồng byte – Luồng kí tự – Luồng có đệm – Luồng liệu – Luồng đối tượng 2012-2013 Object-Oriented Programming: I/O Streams Luồng vào ● Luồng vào (input/output... 010111000111 Object-Oriented Programming: I/O Streams Program Luồng vào ● ● ● Các chương trình sử dụng luồng byte để đọc/ghi byte (8 bits) Trong Java, có nhiều lớp luồng byte Các lớp phái sinh từ... null) Ln phải đóng luồng out.close(); liệu sử dụng xong } } } 2012-2013 Object-Oriented Programming: I/O Streams Luồng byte ● ● ● Tuy nhiên, luồng byte biểu diễn thao tác vào/ ra mức thấp, ta nên

Ngày đăng: 11/04/2021, 22:11

TỪ KHÓA LIÊN QUAN

w