Bộ quản lý cách trình bày(Layout Manager) 1.Dạng hộp (Box Layout)

Một phần của tài liệu Chatting program (Trang 49 - 54)

3.4.1.Dạng hộp (Box Layout)

Sắp xếp các thành phần theo hàng hoặc cột, để tạo nên box layout cần sử dụng lớp container gọi lớp Box.

Bộ quản lý cách trình bày Box mỗi thành phần từ trái sang phải hoặc từ trên xuống dới. Các thành phần đợc sắp theo kích thớc của chúng.

Tạo khung chứa Box

Box hBox=Box.creatHoriontalBox(); Box vBox=Box.creatVerticalBox();

Thêm vào các thành phần bằng phơng thức add()

3.4.2.Dạng lới (Grid Layout)

Chia khung chứa thành các ô kích thớc bằng nhau. Nó sử dụng cấu trúc sau:

public GridLayout(int rows, int cols)

public GridLayout(int rows, int cols, int hgap, int vgap)

Cấu trúc đầu bộ quản lý kiểu Grid với số hàng cột xác định.

Cấu trúc thứ hai ngoài số hàng số cột còn xác định khoảng trống ngang dọc giữa các ô.

4.Lập trình Xuất/nhập dữ liệu

1.Luồng là gì ?

Ngôn ngữ java đóng gói rất nhiều lớp cho phép bạn thực hiện khả năng xuất/nhập (Input/Output hay IO) rất phong phú. Các luồng thể hiện vai trò rất đa dạng bao gồm cả những hàm truy cập tập tin của hệ thống (nh liệt kê danh sách các th mục, tạo th mục tạo tập tin, di chuyển, đổi tên ..) Luồng xuất nhập không những đợc kết nối với tập tin mà còn đợc dùng trong việc kết nối mạng, hay các vùng đệm của bộ nhớ máy tính giúp cho việc truy xuất đợc nhanh. Ngoài ra còn có những luồng trung gian (filter stream) giúp dễ dàng chuyển đổi dữ liệu từ luồng này đi qua luồng khác mà không cần quan tâm đến cấu trúc dữ liệu của luồng.

Tất cả những hoạt động nhập dữ liệu (nh gõ bàn phím, quét hay scan ảnh từ ngoài, lấy số liệu về từ mạng ..) hoặc xuất (nh in ra máy in, chép tập tin ra đĩa, gửi tập tin lên mạng ..) đều đợc quy về một khái niệm là luồng (stream). Hãy hình dung luồng nh là một “dòng chảy” của dữ liệu (data flow). Luồng nhập (input stream) là tất cả những gì từ thế giới bên ngoài du nhập vào máy tính của ta nh ta gõ từ bàn phím, đọc từ tập tin.. còn luồng xuất (output stream) là tất cả những gì đợc gửi ra ngoài thông qua thiết bị ngoại vi nh màn hình, máy in tập tin, đĩa cứng ..

Theo quan điểm tự nhiên, luồng không cần phải quan tâm đến dữ liệu mà nó mang theo phụ thuộc vào thiết bị xuất nhập nào, ví nh dây điện là luồng còn bản thân dòng điện truyền trong đó chính là dữ liệu, dây diện không cần quan tâm đến dòng điện bắt buộc phải đợc đa đến bóng đèn, TV hay máy giặt . Các thiết bị tiếp nhận luồng sẽ biết các sử lý dữ liệu mà luồng đa đến. Cơ bản thì một luồng xuất có thể đợc dẫn đến nhiều thiết bị khác nhau.

Trong java luồng đợc thiết kế thành nhiều lớp. Lớp đơn giản nhất trong số này thể hiện khả năng xuất nhập cơ bản là InputStream và OutputStream. Từ hai lớp luồng này Java dẫn xuất ra nhiều lớp luồng khác phục vụ cho từng quá trình xuất/nhập cụ thể hơn. Bất cứ khi nào muốn dùng đến khả năng luồng của java hãy thêm khối th viện java.io vào đầu chơng trình nh sau :

import java.io.* ;

InputStream, FileInputStream, BufferedInputStream, DataInputStream, LineNumberInputStream, PushbackInputStream, FileInputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream, OutputStream, FileOutputStream, BufferOutputStream, DataOutputStream, PrintStream, BytearrayOutputStream, FileOutputStream, ObjectOutputStream, FileOutputStream, Reader, BufferReader, LineNumberReader CharArrayReader, FilterReader, PushBackReader, InputStreamReader, FileReader, PipedReader, StringReader, Writer, BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, FileWrite, PipedWriter, PrintWriter, StringWriter, File, RandomAccessFile, FileDesciptor, FilePermission, StreamTokenize.

Hai lớp reader và writer cùng với những lớp con của chúng chủ yếu phục vụ cho thao tác xuất nhập trên luồng dùng với dữ liệu là các kí tự Unicode (mỗi kí tự có kích thớc là 2 byte )

Trên đây là tóm tắt các lớp chính trong khối th viện java.io ta sẽ lần lợt khám phá các lớp này trong những ví dụ dới đây

2. Lớp luồng xuất nhập cơ bản (InputStream và OutputStream)

Thờng ta chỉ dùng các lớp con của hai lớp này, bởi vì InputStreamvà OutputStream là hai lớp trừu tợng (abstract class) nên không thể dùng chúng để trực tiếp tạo ra đối tợng xử lý đợc, cần phải sử dụng các lớp con chuyên biệt hơn nh DataOutputStream hay FileInputStream chẳng hạn.

3. Lớp InputStream

Lớp InputStream cung cấp những phơng thức xử lý cơ bản sau : Phơng thức Chức năng

read ( ) Đọc dữ liệu từ luồng

skip ( ) Bỏ qua một số dữ liệu trong luồng trớc khi đọc

available Trả lại số byte có thể truy xuất đợc từ luồng

mark ( ) Đánh dấu một vị trí trên luồng reset ( ) Quay trở lại vị trí đã đánh dấu markSupprted ( ) Cho biết luồng đợc sử dụng chế đánh dấu hay không

close ( ) Đóng luồng ( giải phóng tài nguyên cho máy tính ) (adsbygoogle = window.adsbygoogle || []).push({});

Phơng thức read ( ) đợc cài đặt chồng (overloaded) nên ta có thể sử dụng phơng thức này theo 3 cách nh sau

int read ( )

int read ( byte b [ ] )

int read ( byte b [ ] , int offs , int len )

read ( ) là phơng thức cơ bản nhất để đọc dữ liệu từ bất cứ đối tợng InputStream nào, nó đợc khai báo trong lớp InputStream

public abstract int read ( ) throws IOException

Phơng thức này đọc đợc một byte từ luồng và trị trả về của byte đó ( lu ý là tuy đọc đợc nh trị trả về lại có kích thớc của int) . Phơng thức read ( ) lấy dữ liệu theo chế độ “chờ đọc” (blocking read) nghĩa là nếu luồng không có byte nào trong đó thì nó sẽ chờ cho đến khi ít nhất có byte đợc đa vào. Nếu gặp lỗi phơng thức này sẽ ném ra một ngoại lệ IOException cho biết việc đọc dữ liệu không thành công chơng trình phải bắt lấy và xử lý nó.

public abstract int read ( byte [ ] b ) throws IOException

Phơng thức này đọc một dãy các byte từ luồng và đa vào mảng b chỉ định, phơng thức này sẽ trả về số byte thực hiện sự đọc đợc, nếu đọc đến cuối luồng trị trả về sẽ là -1. Lu ý : số byte mà đọc đợc có thểc ít hơn số byte có sẵn của mảng b vì vậy ta nên lấy trị trả về để biết đích xác phơng thức này đã đọc đợc bao nhiêu byte. Ví dụ luồng inStream của ta có 40 byte, kích thớc mảng b là 70 byte, khi dùng phơng thức inStream.read (b) sẽ trả về trị 40 cho biết có 40 byte đợc lấy từ luồng đa vào mảng b, lúc này trong luồng đang cạn kiệt dữ liệu (không còn byte nào), nếu gọi tiếp phơng thức inStream.read (b) trị trả về sẽ là -1 cho biết không có byte nào cả .

public abstract int read (byte [ ] b, int offs, int length) throws IOException

Phơng thức này đọc một dãy các byte từ luồng để đa vào mảng b, vị trí bắt đầu đọc là offs , số byte cần đọc là length

Ngoài phơng thức read còn nhiều phơng thức dùng hỗ trợ cho lớp luồng InputStream nh :

public int available ( ) throws IOException

Xác định đợc hiện đang có bao nhiều byte trong luồng .

public long skip (long n)

Bỏ qua một số byte trong luồng để bắt đầu đọc từ vị trí khác, n là số byte mà ta muốn bỏ qua không đọc, trị trả về là số byte bỏ qua thành công, trờng hợp đến cuối luồng thì trị trả về là -1

Một vài luồng còn cung cấp khả năng đánh dấu vị trí hiện tại trên luồng để sau đó có thể quay lại vị trí này. Tuy nhiên không phải luồng nào cũng có, muốn xác định một luồng dẫn xuất từ lớp InputStream có khả năng đánh dấu hay không ta gọi các phơng thức sau :

Phơng thức này trả về true nếu luồng có khả năng đánh dấu (mark) , còn không sẽ là false.

public synchronized void mark (int readLimit )

Phơng thức này dùng để đánh dấu trên luồng, readLimit là số byte tối đa có thể đọc đợc từ vị trí đánh dấu. Hay nói đúng hơn nếu ta đọc quá số byte quy định thì sau này luồng sẽ không còn biết đờng đi về vị trí cũ (Một vài luồng cần tạo thêm vùng nhớ để lu trữ thông tin cho việc đánh dấu, chính vì vậy ta cần phải cung cấp thông số readLimit để luồng tự quyết định xem cần bao nhiêu vùng nhớ dành riêng ra)

public synchronized void reset ( ) throws IOException

Phơng thức này dùng quay lại vị trí đã đánh dấu nếu ban đầu

Cuối cùng nếu không cần đến luồng để đọc dữ liệu nữa ta có thể đóng luồng lại bằng phơng thức close ()

public void close () throws IOException

Đặc điểm của java là tự động huỷ bỏ đối tợng nếu đối tợng đó không còn dùng đến nữa (bằng bộ thu gom rác –garbage collector) có nghĩa là luồng cũng đợc đóng lại không cần ta phảI gọi phơng thức close () một cách tờng minh sẽ giúp loại bỏ luồng ngay tức khắc , giải phóng tài nguyên cho máy tính (trong khi bộ thu gom rác phải mất một thời gian nhất định mới huỷ bỏ đối tợng)

4. Lớp OutputStream

Ngợc với luồng InputStream dùng để đọc dữ liệu, ta có luồng OutputStream dành cho việc xuất hoặc ghi dữ liệu ra

Lớp OutputStream cung cấp những phơng thức xủ lý cơ bản sau :

Phơng thức Chức năng

write() ghi dữ liệu vào luồng (adsbygoogle = window.adsbygoogle || []).push({});

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

close( ) Đóng luồng

Phơng thức cơ bản nhất của lớp này là write ( ). Tơng tự nh phơng thức read ( ) của lớp InputStream, phơng thức write( ) cũng đợc cài đặt chồng nên ta có thể gọi nó theo 3 cách khác nhau :

Write (int b) Write (byte [ ] b)

Write (byte [ ] bytes, int offs, int length)

Các phơng thức write đợc khai báo trong lớp java.io.OutputStream nh sau:

Dùng để ghi một byte dữ liệu vào luồng

public void write (byte [ ] b) throws IOException

Dùng để ghi toàn bộ mảng b các byte đợc chỉ định vào luồng .

public voide write (byte [ ] bytes, int offs, int length) throws IOException

Dùng để ghi một mảng b các byte đợc chỉ định, không ghi toàn bộ mà ghi bắt đầu từ byte b (offs) cho đến byte b ([ offs + length –1) ] (ghi length bắt đầu từ byte thứ offs nếu offs = 0 nghĩa là toàn bộ mảng sẽ đợc ghi ra luồng )

Một vài luồng dùng cơ chế bộ đệm trong (internal buffer) để tăng tốc thao tác ghi dữ liệu cho nên mặc dù ghi dữ liệu cho nên mặc dù ta đã dùng write( ) để ghi dữ liệu nhng cha chắc dữ liệu đã đợc ghi vào luồng, nó vẫn còn nằm trong bộ đệm (vùng nhớ) chờ đến khi cần thiết mới đợc ghi xuống. Phơng thức flush ( ) sẽ ép tất cả dữ liệu từ bộ đệm phải ghi ngay xuống luồng không đợc chậm trễ.

Và cũng nh luồng nhập, nếu ta không còn dùng đến luồng xuất để ghi dữ liệu nữa thì hãy gọi phơng thức close ( ) để đóng luồng lại .

public voide close ( ) throws IOException

Một phần của tài liệu Chatting program (Trang 49 - 54)