Bài giảng CoreJava - Chương IX: Dòng vào/ra (I/O Streams)

Mục tiêu

Kết thúc chương, bạn có có thể :

 Đề cập đến các khái niệm về Stream

 Mô tả các lớp InputStream và OutputStream

 Mô tả vào ra mảng Byte

 Thực hiện lọc và đệm vào/ra

 Dùng lớp RandomAccesFile.

 Mô tả vào/ra chuỗi và ký tự

 Dùng lớp PrinterWriter

 

doc20 trang | Chuyên mục: Java | Chia sẻ: yen2110 | Lượt xem: 512 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng CoreJava - Chương IX: Dòng vào/ra (I/O Streams), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
n(s.length() + "characters were read");
	System.out.println("They are:" + s);
 }
}
Hình 9.4 Hiện kết xuất chương trình:
Hình 9.4 Các tác vụ nhập và xuất mảng các ký tự
Chương trình 9.5 Mô tả tiến trình nhập/xuất chuỗi.
Chương trình 9.5
import java.lang.System;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.IOException;
import java.io. * ;
public class strioexam
{
 public static void main(String args[ ]) throws IOException
 {
	StringWriter ost = new StringWriter( );
	String s = "Welcome to String Input Output Program";
	for(int i= 0; i <s.length(); ++i)
	ost.write(s.charAt(i)) ;
	System.out.println("Output Stream is: " + ost);
	StringReader inst;
	inst = new StringReader(ost.toString( ));
	int a= 0;
	StringBuffer sb1 = new StringBuffer(" ");
	while((a = inst.read())!=-1)
	sb1.append((char) a);
	s = sb1.toString( );
	System.out.println("No of characters read: " +s.length( ));
	System.out.println("They are: " + s);
 }
}
Hình 9.5 Hiện kết xuất chương trình:
Hình 9.5 Nhập và xuất chuỗi
9.3.9 Lớp PrinterWriter 
Lớp ‘PrintStream’ thực hiện việc kết xuất dữ liệu. Lớp này có các phương thức bổ sung, trợ giúp cho việc in ấn dữ liệu cơ bản.
Lớp PrinterWriter’ là một phiên bản hướng ký tự của lớp PrintStream. Nó thực tế cải thiện lớp PrintStream bằng cách dùng dấu tách dòng phụ thuộc hệ điều hành để in các dòng thay vì ký tự ‘\n’. Lớp này cũng cấp hỗ trợ ký tự Unicode tốt hơn so với PrintStream. Phương thức ‘checkError()’ được sử dụng kiểm tra kết xuất và xoá sạch các lỗi. Phương thức setError() được sử dụng để thiết lập lỗi điều kiện. Lớp PrinterWriter hỗ trợ in ấn các kiểu dữ liệu nguyên thuỷ, mảng ký tự, chuỗi và đối tượng.
9.3.10 Giao diện DataInput
Giao diện DataInput được sử dụng để đọc các byte từ dòng nhị phân và xây dựng lại các kiểu dữ liệu dạng nguyên thuỷ của Java.
DataInput cũng cho phép chúng ta chuyển đổi dữ liệu từ định dạng sửa đổi UTF-8 tới dạng chuỗi. Chuẩn UTF cho định dạng chuyển đổi Unicode. Nó là kiểu định dạng đặt biệt mã hoá các ký tự Unicode 16 bit . UTF cho rằng trong hầu hết các trường hợp, byte cao trong 2 byte Unicode sẽ là 0. Giao diện DataInput được định nghĩa một số các phương thức, các phương thức bao gồm việc đọc các kiểu dữ liệu nguyên thuỷ trong java. 
Bảng 9.3 Tóm lượt vài phương thức. Tất cả các phương thức đều có khả năng tạo ra ngoại lệ IOException trong trường hợp lỗi:
Tên phương thức
Mô tả
boolean readBoolean( )
Đọc một byte nhập, và trả về True nếu byte đó khác 0, và False nếu byte đó bằng 0.
byte readByte( )
Đọc một byte
char readChar( )
Đọc và trả về một giá trị ký tự
short redShort( )
Đọc 2 byte và trả về giá trị kiểu short
long readLong( )
Đọc 8 byte và trả về giá trị kiểu long.
float readFloat( )
đọc 4 byte và trả về giá trị kiểu float
int readInt( )
Đọc 4 byte và trả về giá trị kiểu int
double readDouble( )
Đọc 8 byte và trả về giá trị kiểu double
String readUTF( )
Đọc một chuỗi
String readLine( )
Đọc một dòng văn bản
Bảng 9.3 Các phương thức của giao diện DataInput
9.3.11 Giao diện DataOutput
Giao diện DataOutput được sử dụng để tái tạo lại các kiểu dữ liệu nguyên thuỷ trong java vthành dãy byte. Nó ghi các byte này lên trên dòng nhị phân.
Giao diện DataOutput cũng cho phép chúng ta chuyển đổi một chuỗi vào trong Java theo định dạng UTF-8 và ghi nó vào dòng.
Giao diện DataOutput định nghĩa một số phương thức được tóm tắt trong bảng 9.4. Tất cả các phương thức đều có khả năng gây ra ngoại lệ IOException trong trường hợp lỗi.
Tên phương thức
Mô tả
void writeBoolean(boolean b)
Ghi một giá trị Boolean vào dòng
void writeByte(int value)
Ghi giá trị 8 bit thấp 
void writeChar(int value)
Ghi 2 byte giá trị kiểu ký tự vào dòng
void writeShort(int value)
Ghi 2 byte, biểu diễn lại giá trị kiểu short 
void writeLong(long value)
Ghi 8 byte, biểu diễn lại giá trị kiểu long 
void writeFloat(float value)
Ghi 4 byte, biểu diễn lại giá trị kiểu float
void writeInt(int value)
ghi 4 byte
void writeDouble(double value)
Ghi 8 byte, biểu diễn lại giá trị kiểu double
void writeUTF(String value)
Ghi một chuỗi UTF tới dòng.
Bảng 9.4 Các phương thức của giao diện DataOutput
9.3.12 Lớp RandomAccessFile
Lớp RandomAccessFile cung cấp khả năng thực hiện vào/ra theo một vị trí cụ thể bên trong một tập tin. Trong lớp này, dữ liệu có thể đọc hoặc ghi ở vị trí ngẫu nhiên thay vì liên tục. Vì vậy lớp này có tên là RandomAccess. Phương thưc ‘seek( )’ hỗ trợ truy cập ngẫu nhiên. Vì thế, biến trỏ tương ứng với tệp tin hiện hành có thể ấn định theo vị trí bất kỳ trong tập tin. 
Lớp RandomAccessFile thực hiện cả hai việc nhập và xuất. Do vây, có thể thực hiện I/O bằng các kiểu dữ liệu nguyên thuỷ. Lớp này cũng hỗ trợ các quyền cơ bản về đọc hoặc ghi tập tin, điều này cho phép đọc tập tin theo chế độ chỉ đọc hoặc đọc-ghi. Tham số ‘r’ hoặc ‘rw’ được gán cho lớp RandomAccessFile chỉ định truy cập ‘chỉ đọc’ và ‘đọc-ghi’. Lớp này giới thiệu vài phương thức mới khác với phương thức đã thừa kế từ các lớp DataInput và DataOutput.
Các phương thức mới thêm vào bao gồm:
seek( )
Thiết lập con trỏ tập tin tới vị trí cụ thể bên trong tập tin.
getFilePointer( )
Trả về vị trí hiện hành của con trỏ tập tin.
length( )
Trả về chiều dài của tập tin tính theo byte.
Chương trình dưới đây minh hoạ cách dùng lớp RandomAccessFile. Nó ghi một giá trị boolean, một int, một char, một double tới một file có tên ‘abc.txt’. Nó sử dụng phương pháp seek( ) để tìm vị trí định vị bên trong tập tin (bắt đầu từ 1). Sau đó nó đọc giá trị số nguyên, ký tự và double từ tập tin và hiển thị chúng ra màn hình.
Chương trình 9.6
import java.lang.System;
import java.io.RandomAccessFile;
import java.io.IOException;
public class rndexam
{
	public static void main (String args[ ]) throws IOException
	{
	RandomAccessFile rf;
	rf = new RandomAccessFile(“abc.txt”, “rw”);
	rf.writeBoolean(true);
	rf.writeInt(67868);
	rf.writeChars(“J”);
	rf.writeDouble(678.68);
//making use of seek() method to move to a specific file location rf.seek(1);
	System.out.println(rf.readInt());
	System.out.println(rf.readChar());
	System.out.println(rf.readDouble());
	rf.seek(0);
	System.out.println(rf.readBoolean));
rf.close();
	}
}
Hình 9.6 Hiện kết xuất chương trình:
Hình 9.6: Lớp RandomAccessFile
 Gói java.awt.print
Đây là gói mới mà Java 1.2 cung cấp. Nó thay thế khả năng in của JDK 1.1. Nó bao gồm dãy các giao diện:
Pageable
Printable
PrinterGraphics 
Giao diện ‘Pageable’ định nghĩa các phương thức được sử dụng cho đối tượng mô tả các trang sẽ được in. Nó cũng chỉ ra số lượng trang sẽ được in cũng như sẽ được in trang hiện hành hay một dãy các trang.
Giao diện ‘Printable’ chỉ định phương thức print()được dùng để in một trạng trên một đối tượng Graphics.
Giao diện ‘PrinterGraphics‘ cung cấp khả năng truy cập đối tượng ‘PrinterJob’. Nó cung cấp các lớp sau đây:
Paper
Book
PageFormat
Printerjob
Lớp ‘Page’ định nghĩa các đặc tính vật lý của trang giấy in. Ngoài ra nó cũng cung cấp khổ giấy và vùng vẽ.
Lớp ‘Book’ là một lớp con của đối tượng duy trì một danh sách các trang được in. Lớp này cũng cung cấp các phương thức để thêm trang và quản lý trang. Nó cài đặt giao diện Pageable.
Lớp ‘PageFormat’ định nghĩa lề của trang như ‘Top’, ‘Bottom’,’Left’ và ‘Right’. Nó cũng chỉ định kích cỡ và hướng in như ‘Portrait’ (khổ dọc) hoặc ‘Landscape’ (khổ ngang).
Lớp ‘PrinterJob’ là một lớp con của đối lượng khởi tạo, quản lý, và điều khiển yêu cầu máy in. Lớp này cũng chỉ định các tính chất in.
Dưới đây là ngoại lệ và lỗi mà gói java.awt.print kích hoạt:
PrinterException 
PrinterIOException
PrinterAbortException
‘PrinterException‘ thừa kế java.lang.Exception nhằm cung cấp một lớp cơ sở để in các ngoại lệ liên quan.
‘PrinterIOException’ thừa ‘PrinterException’ chỉ rõ lỗi trong I/O. 
‘PrinterAbortException’ là lớp con của lớp PrinterException nêu rõ việc in đã được huỷ bỏ.
Tóm tắt bài học
Một dòng là một phương pháp qua đó dữ liệu di chuyển trong chương trình java.
Khi một dòng dữ liệu được gửi hoặc nhận. Chúng ta xem nó như đang ghi và đọc một dòng tương ứng.
Dòng nhập/xuất bao gồm các lớp sau đây:
Lớp System.out 
Lớp System.in
Lớp System.err
Lớp InputStream là một lớp trừu tượng định nghĩa cách nhận dữ liệu.
Lớp OutputStream cũng là lớp trừu tượng. Nó định nghĩa ghi ra các dòng được kết xuất như thế nào.
Lớp ByteArrayInputStream tạo ra một luồng nhập từ vùng đệm bộ nhớ trong khi ByteArrayOutputStream tạo một luồng xuất trên một mãng byte.
Java hổ trợ tác vụ nhập/xuất tập tin với sự trợ giúp của các lớp File, FileDescriptor, FileInputStream và FileOutputStream.
Các lớp Reader và Writer là lớp trừu tượng hỗ trợ đọc và ghi các dòng ký tự Unicode.
CharArrayReader, CharArrayWriter khác với ByteArrayInputStream, ByteArrayOutputStream hỗ trợ định dạng nhập/xuất 8 bit, Trong khi ByteArrayInputStream, ByteArrayOutputStream hỗ trợ nhập/xuất 16bit.
Lớp PrintStream cài đặt giao diện xuất, lớp này có bổ sung phương thức giúp ta in các kiểu dữ liệu nguyên thuỷ. 
Lớp RandomAccessFile cung cấp khả năng thực hiện I/O tới vị trí cụ thể trong một tập tin.
Kiểm tra mức độ tiến bộ
---------- là ống (pipeline) để gửi và nhận thông tin trong các chương trình java.
----------- là dòng lỗi chuẩn.
Phương thức ------------- đọc các byte dữ liệu từ một dòng.
Phương thức ------------- trả về giá trị boolean, kiểm tra xem dòng có hỗ trợ các khả năng mark và reset hay không.
Phương thức ------------ xả sạch dòng.
Nhập/xuất mảng byte sử dụng các lớp ------------ và ---------------------
Lớp --------------- được sử dụng truy cập các đối tượng thư mục và tập tin.
--------------là một nơi chứa dữ liệu.
Bài tập
Viết chương trình nhận một dòng văn bản từ người dùng và hiển thị đoạn văn bản đó lên màn hình.
Viết chương trình sao chép nội dụng từ một tập tin tới một tập tin khác.
Viết chương trình truy cập ngẫu nhiên tập tin, có giao diện như sau:
Các bản ghi nên được lưu ở tập tin ‘.dat’, vì vậy người dùng truy cập chúng sau này.

File đính kèm:

  • docbai_giang_corejava_chuong_ix_dong_vaora_io_streams.doc
Tài liệu liên quan