LUỒNG & TẬP TIN (STREAMS & FILES)

NỘI DUNG

 Dữ liệu lưu trong bộ nhớ & tập tin  Khái niệm về luồng  Các loại luồng:

 Luồng byte (byte stream)  Luồng ký tự (character stream)  Thư viện luồng & tập tin trong java  Xử lý tập tin và thư mục  Một số ví dụ minh họa

Dữ liệu trong bộ nhớ & tập tin

 Dữ liệu trong bộ nhớ RAM  Tính chất tạm thời  Dung lượng bộ nhớ

RAM hạn chế hơn so với đĩa cứng

 Dữ liệu trong tập tin  Tính chất lâu dài  Dung lượng đĩa lớn hơn nhiều so với bộ nhớ RAM

 Xử lý luồng & Xử lý File

Khái niệm về luồng

2 lớp trừu tượng InputStream và

OutputStream trong gói java.io

InputStream

OutputStream

Khái niệm về luồng

 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ập trong

java gắn kết với một thiết bị vật lý.

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

Khái niệm về luồng

 Có thể hiểu luồng là một lộ trình dữ liệu được truyền

trong chương trình.

 Chức năng của luồng: vận chuyển dữ liệu từ nơi này

qua nơi khác. Các chương trình muốn chuyển dữ

liệu cho nhau phải tạo các luồng để gửi và nhận dữ

liệu.

 Tất cả các task liên quan đến các lớp nhập xuất

trong java nếu có lỗi sẽ quăng ra một IOException.

Các loại luồng

 Luồng byte (Byte Streams) (java.io)

Hai lớp trừu tượng ở mức trên cùng do Java

định nghĩa  InputStream  Output Stream

 Luồng ký tự (Character Streams) (java.io)

 Reader  Writer

Byte Stream

Phương thức Ý nghĩa

InputStream int available( )

Trả về số luợng bytes có thể đọc được từ luồng nhập

void close( )

void mark(int numBytes)

Đánh dấu ở vị trí hiện tại trong luồng nhập

boolean markSupported( )

Kiểm tra xem luồng nhập có hỗ trợ phương thức mark() và reset() không.

Đóng luồng nhập và giải phóng tài nguyên hệ thống gắn với luồng. Không thành công sẽ ném ra một lỗi IOException

int read( ) Đọc byte tiếp theo từ luồng nhập

Byte Stream

int read(byte buffer[ ])

int read(byte buffer[ ], int offset, int numBytes)

Đọc numBytes bytes bắt đầu từ địa chỉ offset và lưu vào trong vùng nhớ buffer. Kết quả trả về số bytes thật sự đọc được

Đọc buffer.length bytes và lưu vào trong vùng nhớ buffer. Kết quả trả về số bytes thật sự đọc được

void reset( )

Nhảy con trỏ đến vị trí được xác định bởi việc gọi hàm mark() lần sau cùng.

long skip(long numBytes) Nhảy qua numBytes dữ liệu từ luồng nhập

Byte Stream

void close( )

Đóng luồng xuất và giải phóng tài nguyên hệ thống gắn với luồng. Không thành công sẽ ném ra một lỗi IOException

OutputStream

void flush( )

void write(int b)

Ghi byte dữ liệu chỉ định xuống luồng

Ép dữ liệu từ bộ đệm phải ghi ngay xuống luồng (nếu có)

Ghi numBytes bytes dữ liệu từ vị trí offset của mảng chỉ định buffer xuống luồng

void write(byte buffer[ ], int offset, int numBytes)

void write(byte buffer[ ]) Ghi buffer.length bytes dữ liệu từ mảng chỉ định xuống luồng

Đọc dữ liệu từ bàn phím (nhập thiết bị nhập chuẩn)

- Dùng luồng nhập chuẩn InputStream

Ví dụ minh họa - Đọc dữ liệu từ Console

byte data[] = new byte[100]; System.out.print("Enter some characters."); System.in.read(data); System.out.print("You entered: "); for(int i=0; i < data.length; i++)

System.out.print((char) data[i]);

{ }

import java.io.*; class ReadBytes { public static void main(String args[]) throws IOException }

Ví dụ minh họa - Đọc dữ liệu từ Console

Kết quả thực thi chương trình:

Ví dụ minh họa - Đọc dữ liệu từ Console

 Dùng đối tượng Scanner (java.util.Scanner hỗ trợ từ

phiên bản jdk 1.5): một đối tượng scanner text đơn

giản có thể dùng để phân tích các chuỗi, kiểu dữ liệu

cơ sở dùng regular expressions.

Ví dụ minh họa - Đọc dữ liệu từ Console

import java.util.*;

public class ScannerInputDemo {

public static void main( String args[] ){

System.out.println(“Đọc dữ liệu từ bàn phím dùng Scanner ”);

Scanner scanner= new Scanner(System.in);

System.out.println(“Please enter your full name:”);

String fullname = scanner.nextLine();

System.out.println(“how old are you?”);

int age = scanner.nextInt();

Ví dụ minh họa - Đọc dữ liệu từ Console

System.out.println(“Hello “ + fullname + “.”);

System.out.println(“Are you “ + age + ” years old. Oh, really. You

are too young!”);

}

}

Ví dụ minh họa - Đọc dữ liệu từ File

Viết chương trình cho phép người dùng chọn mở 1 tập tin trên đĩa và nạp nội dung của tập tin vào ô TextArea tương tự chức năng mở đọc file của chương trình MS Notepad của Windows.

Ví dụ minh họa - Đọc dữ liệu từ File

Ví dụ minh họa - Đọc dữ liệu từ File

Ví dụ minh họa – Ghi dữ liệu ra File

Viết chương trình cho phép người dùng nhập dữ liệu vào ô TextArea và chọn 1 tập tin trên đĩa để lưu nội dung nội dung đã nhập tương tự chức ghi file của chương trình MS Notepad của Windows.

Ví dụ minh họa – Ghi dữ liệu ra File

Xử lý thư mục – Lớp File

 java.lang.Object  +--java.io.File

 Lớp File không phục vụ cho việc nhập/xuất dữ liệu trên luồng. Lớp File thường được dùng để biết được các thông tin chi tiết về tập tin cũng như thư mục (tên, ngày giờ tạo, kích thước, …)

Xử lý thư mục – Lớp File

 Các Constructor:

 Tạo đối tượng File từ đường dẫn tuyệt đối

public File(String pathname) ví dụ: File f = new File(“C:\\Java\\vd1.java”);

 Tạo đối tượng File từ tên đường dẫn và tên tập tin tách biệt

public File(String parent, String child) ví dụ: File f = new File(“C:\\Java”, “vd1.java”);  Tạo đối tượng File từ một đối tượng File khác

public File(File parent, String child) ví dụ: File dir = new File (“C:\\Java”);

File f = new File(dir, “vd1.java”);

Xử lý thư mục – Lớp File

 Một số phương thức thường gặp của lớp File

public String getName()

Lấy tên của đối tượng File

public String getPath()

Lấy đường dẫn của tập tin

public boolean isDirectory() Kiểm tra xem tập tin có phải là thư mục không?

public boolean isFile()

Kiểm tra xem tập tn có phải là một file không?

public String[] list()

Lấy danh sách tên các tập tin và thư mục con của đối tượng File đang xét và trả về trong một mảng.