JPopupMenu
Context-sensitive popup menus
◦ JPopupMenu
◦ Menu được phát sinh phụ thuộc vào thành phần đang truy cập.
Cách tạo:
◦ JPopupMenu popup = new JPopupMenu();
◦ JMenuItem items = new JMenuItem(“Red”);
◦ popup.add(items);
◦
◦ // handling event – mousePressed
◦ popup.show(ev.getComponent(), ev.getX(), ev.getY());
MỘT SỐ VẤN ĐỀ TRONG JAVA 47JPopupMenu
MỘT SỐ VẤN ĐỀ TRONG JAVA 48Quản lý luồng nhập xuất
Một chương trình máy tính cần phải lấy dữ liệu từ bên ngoài vào
chương trình để xử lý. Sau khi chương trình xử lý xong sẽ xuất kết quả
ra ngoài cho thành phần khác để tiếp tục xử lý hoặc lưu trữ.
Dữ liệu được truyền bằng các luồng dữ liệu.
Java cung cấp package java.io với rất nhiều lớp và các tính năng phong
phú.
MỘT SỐ VẤN ĐỀ TRONG JAVA 49Phân loại các luồng nhập xuất
Xét theo loại dữ liệu
luồng byte (byte stream)
luồng ký tự (character stream)
Xét theo thao tác
input (đọc byte) hoặc reader (đọc character)
output (ghi byte) hoặc writer (ghi character)
114 trang |
Chia sẻ: trungkhoi17 | Lượt xem: 532 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình Java - Chương 2: Một số vấn đề trong lập trình Java - Nguyễn Minh Thành, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ame1(){
frm = new JFrame();
frm.setLayout(null);
JRadioButton rad1 = new JRadioButton("Nam");
JRadioButton rad2 = new JRadioButton("Nu");
rad1.setBounds(50, 50, 100, 30);
rad2.setBounds(50, 70, 100, 30);
ButtonGroup gioitinh =new ButtonGroup();
gioitinh.add(rad1); gioitinh.add(rad2);
rad1.setSelected(true);
frm.add(rad1); frm.add(rad2); frm.setSize(300, 400);
frm.setTitle(“Ví dụ”);
frm.setVisible(true);
}
public static void main(String args[]){
DemoJFrame demo = new DemoJFrame();
}
}
MỘT SỐ VẤN ĐỀ TRONG JAVA 23
Ví dụ về Combo Box
Hộp danh sách chứa các mục từ đó người sử dụng có thể lựa chọn một mục khi nhấp vào
nó.
public class DemoJFrame {
JFrame frm;
public DemoJFrame1(){
frm = new JFrame();
frm.setLayout(null);
JComboBox cbo = new JComboBox();
cbo.addItem("item1");cbo.addItem("item2");
cbo.addItem("item3");cbo.addItem("item4");
cbo.setBounds(50, 50, 100, 30);
frm.add(cbo); frm.setSize(300, 400);
frm.setTitle(“Ví dụ”);
frm.setVisible(true);
}
public static void main(String args[]){
DemoJFrame demo = new DemoJFrame();
}
}
MỘT SỐ VẤN ĐỀ TRONG JAVA 24
JList
Danh sách chọn tương tự ComboBox, nhưng có thể chọn nhiều item.
public class DemoJFrame {
JFrame frm;
public DemoJFrame1(){
frm = new JFrame();
frm.setLayout(null);
String[] items = new
String[]{"item1","item2","item3"};
JList lst = new JList(items);
lst.setBounds(50, 50, 100, 150);
frm.add(lst); frm.setSize(300, 400);
frm.setTitle(“Ví dụ”);
frm.setVisible(true);
}
public static void main(String args[]){
DemoJFrame demo = new DemoJFrame();
}
}
MỘT SỐ VẤN ĐỀ TRONG JAVA 25
Xử lý sự kiện chuột
Các giao tiếp lắng nghe cho các sự kiện chuột
◦ MouseListener
◦ MouseMotionListener
Lắng nghe cho đối tượng sự kiện MouseEvent.
MỘT SỐ VẤN ĐỀ TRONG JAVA 26
Các phương thức của
MouseListener
public void mousePressed( MouseEvent event): Được gọi khi một
nút chuột được nhấn trên một thành phần.
public void mouseClicked( MouseEvent event ): Được gọi khi một
nút chuột được nhấn và thả ra trên một thành phần.
public void mouseReleased( MouseEvent event): Được gọi khi
một nút chuột được thả ra sau khi được nhấn. Trước sự kiện này
luôn luôn là một sự kiện mousePressed.
public void mouseEntered(MouseEvent event ): Được gọi khi con
trỏ chuột vào những ranh giới của một thành phần.
public void mouseExited(MouseEvent event ): Được gọi khi con
trỏ chuột rời ranh giới của một thành phần
MỘT SỐ VẤN ĐỀ TRONG JAVA 27
Các phương thức của
MouseMotionListener
public void mouseDragged(MouseEvent event)
◦ Được gọi khi nút chuột được nhấn và di chuyển.
◦ Trước sự kiện này luôn luôn là gọi tới sự kiện mousePressed.
◦ Tất cả các sự kiện kéo đều được gửi tới thành phần mà trên đó sự kéo bắt
đầu.
public void mouseMoved(MouseEvent event):
◦ Được gọi khi con chuột được di chuyển trên một thành phần.
◦ Tất cả các sự kiện chuyển động đều được gửi tới thành phần mà vị trí con
chuột hiện thời ở đó.
MỘT SỐ VẤN ĐỀ TRONG JAVA 28
Ví dụ
MỘT SỐ VẤN ĐỀ TRONG JAVA 29
Tạo một lớp chuyên lắng nghe sự kiện, cho nó kế thừadieejn1 trong 2 giao tiêp trên,
Viết lại các hàm tương ứng với các sự kiện nhận được
public class ButtonListener implements MouseListener{
public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(null, "Ban da nhan
nut");
}
// các hàm khác
}
Ví dụ (tt)
Đăng ký Control trên Frame với lớp vừa tạo
JButton btn = new JButton("Click me");
btn.setBounds(50, 50, 100, 30);
btn.addMouseListener(new ButtonListener());
MỘT SỐ VẤN ĐỀ TRONG JAVA 30
Xử lý sự kiện phím
Giao tiếp KeyListener
Xử lý những sự kiện phím
◦ Sinh ra khi những phím trên bàn phím được nhấn và thả
Lớp KeyEvent chứa mã phím ảo mà đại diện cho phím.
Thực hiện tương tự sự kiện chuột
MỘT SỐ VẤN ĐỀ TRONG JAVA 31
Panel – Khung chứa
Giúp tổ chức các thành phần
Lớp JPanel là lớp xuất của JComponent
Có thể có nhiều thành phần (và các khung chứa panel khác)
được thêm vào chúng.
MỘT SỐ VẤN ĐỀ TRONG JAVA 32
Panel – Khung chứa
MỘT SỐ VẤN ĐỀ TRONG JAVA 33
Panel – Khung chứa
MỘT SỐ VẤN ĐỀ TRONG JAVA 34
Panel – Khung chứa
MỘT SỐ VẤN ĐỀ TRONG JAVA 35
JTabbedPane
Sắp xếp các thành phần trong các lớp
◦ Một lớp xuất hiện tại một thời điểm
◦ Truy cập mỗi lớp thông qua Tab
Lớp JTabbedPane
MỘT SỐ VẤN ĐỀ TRONG JAVA 36
JTabbedPane
MỘT SỐ VẤN ĐỀ TRONG JAVA 37
JTabbedPane
MỘT SỐ VẤN ĐỀ TRONG JAVA 38
JTabbedPane
MỘT SỐ VẤN ĐỀ TRONG JAVA 39
Thanh trượt - JSlider
Cho phép người sử dụng chọn giá trị nguyên trong một vùng giá trị xác
định.
Một số đặc tính:
◦ Tick marks (major and minor)
◦ Snap-to ticks
◦ Hướng (ngang hoặc đứng)
MỘT SỐ VẤN ĐỀ TRONG JAVA 40
Thanh trượt - JSlider
MỘT SỐ VẤN ĐỀ TRONG JAVA 41
Thanh trượt - JSlider
MỘT SỐ VẤN ĐỀ TRONG JAVA 42
Thanh trượt - JSlider
MỘT SỐ VẤN ĐỀ TRONG JAVA 43
Thanh trượt - JSlider
MỘT SỐ VẤN ĐỀ TRONG JAVA 44
Thanh trượt - JSlider
MỘT SỐ VẤN ĐỀ TRONG JAVA 45
Menu
Cho phép thực hiện các hành
động với GUI
Chứa bởi thanh menu (menu
bar)
◦ JMenuBar
Bao gồm các mục menu (menu
items)
◦ JMenuItem
MỘT SỐ VẤN ĐỀ TRONG JAVA 46
JPopupMenu
Context-sensitive popup menus
◦ JPopupMenu
◦ Menu được phát sinh phụ thuộc vào thành phần đang truy cập.
Cách tạo:
◦ JPopupMenu popup = new JPopupMenu();
◦ JMenuItem items = new JMenuItem(“Red”);
◦ popup.add(items);
◦
◦ // handling event – mousePressed
◦ popup.show(ev.getComponent(), ev.getX(), ev.getY());
MỘT SỐ VẤN ĐỀ TRONG JAVA 47
JPopupMenu
MỘT SỐ VẤN ĐỀ TRONG JAVA 48
Quản lý luồng nhập xuất
Một chương trình máy tính cần phải lấy dữ liệu từ bên ngoài vào
chương trình để xử lý. Sau khi chương trình xử lý xong sẽ xuất kết quả
ra ngoài cho thành phần khác để tiếp tục xử lý hoặc lưu trữ.
Dữ liệu được truyền bằng các luồng dữ liệu.
Java cung cấp package java.io với rất nhiều lớp và các tính năng phong
phú.
MỘT SỐ VẤN ĐỀ TRONG JAVA 49
Phân loại các luồng nhập xuất
Xét theo loại dữ liệu
luồng byte (byte stream)
luồng ký tự (character stream)
Xét theo thao tác
input (đọc byte) hoặc reader (đọc character)
output (ghi byte) hoặc writer (ghi character).
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
50
Các lớp nhập xuất cơ bản
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Có 4 lớp nhập xuất cơ bản
Các nguồn dữ liệu có thể nhập xuất từ Java
51
Các lớp nhập xuất luồng Byte
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Các luồng byte có chức năng đọc hoặc ghi dữ liệu dạng byte.
Các lớp nhập
52
Các lớp nhập xuất luồng Byte (tt)
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Các lớp xuất
53
Các lớp nhập xuất luồng Byte (tt)
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Các phương thức trong lớp InputStream
int available() Trả về số byte còn lại trong stream.
void close() Đóng stream.
void mark(int readLimit)
Đánh dấu vị trí hiện tại. Nếu sau khi mark ta đọc quá
readLimit byte thì chỗ đánh dấu không còn hiệu lực.
boolean markSupported() Trả về true nếu stream hỗ trợ mark và reset.
abstract intread()
Đọc byte kế tiếp trong stream. Quy ước: Trả về-1 nếu hết stream.
Đây là phương thức trừu tượng.
int read(byte[]buffer)
Đọc một dãy byte và lưu kết quả trong mảng buffer. Sốbyte đọc
được tối đa là sức chứa (length) của buffer. Nếu buffercó sức
chứa là 0 thì sẽkhông đọc được gì.
Sau khi đọc xong sẽ trả về số byte đọc được thật sự (nếu đang
đọc mà hết stream thì sốbyte đọc được thật sự sẽ nhỏ hơn sức
chứa của buffer). Nếu stream đã hết mà vẫn đọc nữa thì kết quả
trả về là -1. 54
Các lớp nhập xuất luồng Byte (tt)
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Các phương thức trong lớp InputStream
int read(byte[]buffer, int
offset, int len)
Đọc một dãy byte và lưu kết quả trong mảng buffer kể tự byte
thứ offset. Số byte đọc được tối đa là len. Nếu len là 0 thì sẽ
không đọc được gì. Sau khi đọc xong sẽ trả về số byte đọc được
thật sự (nếu đang đọc mà hết stream thì sốbyte đọc được thật sự
sẽ nhỏ hơn len). Nếu stream đã hết mà vẫn đọc nữa thì kết quả
trả về là -1.
void reset() Trở lại chỗ đã đánh dấu bằng phương thức mark().
55
Các lớp nhập xuất luồng Byte (tt)
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Các phương thức trong lớp OutputStream
void close() Đóng stream
void flush() Buộc stream ghi hết dữ liệu trong vùng đệm ra ngoài.
void write(byte[] buffer)
Ghi một dãy byte vào stream. Số byte được ghi sẽ là
buffer.length.
int write(byte[] buffer,
int offset, int len)
Ghi một dãy byte vào stream. Bắt đầu ghi từ byte thứ
offset, và ghi tổng cộng len byte.
abstract void write(int b) Ghi một byte vào stream. Đây là phương thức trừu tượng.
56
Các lớp nhập xuất luồng Byte (tt)
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Các phương thức trong lớp FileInputStream
FileInputStream(File file)
Tạo FileInputStream để đọc dữ liệu từ một tập tin liên kết tới
đối tượng File
FileInputStream(String
name)
Tạo FileInputStream để đọc dữ liệu từ một tập tin có tên là
name.
57
Các lớp nhập xuất luồng Byte (tt)
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Các phương thức trong lớp FileOutputStream
FileOutputStream(File file,
boolean append)
Tạo FileOutputStream để ghi dữ liệu tập tin liên kết tới đối
tượng File. Nếu append là true thì sẽ ghi tiếp vào cuối tập tin,
ngược lại thì ghi đè lên tập tin.
FileOutputStream(String
name)
Tạo FileOutputStream để ghi dữ liệu vào một tập tin có tên là
name.
FileOutputStream(String
name, boolean append)
Tạo FileOutputStream để ghi dữ liệu vào một tập tin có tên là
name. Nếu append là true thì sẽ ghi tiếp vào cuối tập tin,
ngược lại thì ghi đè lên tập tin.
58
Các lớp nhập xuất luồng Byte (tt)
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Các phương thức trong lớp ByteArrayInputStream
ByteArrayInputStream(byte[]
buf)
Tạo ra ByteArrayInputStreamvà dùng buf để làm vùng đệm.
ByteArrayInputStream(byte[]
buf, int off, int len)
Tạo ra ByteArrayInputStream và dùng một phần của buf để
làm vùng đệm.
FileOutputStream(String
name, boolean append)
Tạo FileOutputStream để ghi dữ liệu vào một tập tin có tên là
name. Nếu append là true thì sẽ ghi tiếp vào cuối tập tin,
ngược lại thì ghi đè lên tập tin.
59
Các lớp nhập xuất luồng Byte (tt)
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Các phương thức trong lớp ByteArrayOutputStream
ByteArrayOutputStream()
Tạo ra một ByteArrayOutputStream với vùng đệm 32 byte và
có thể tăng nếu cần.
ByteArrayOutputStream(int
size)
Tạo ra một ByteArrayOutputStream với vùng đệm size byte.
byte[] toByteArray() Tạo ra mảng byte là bản sao của vùng đệm của this.
String toString()
Tạo ra chuỗi là bản sao của vùng đệm
của thisvới các byte được đổi thành ký
tựtương ứng.
void writeTo(OutputStream
out)
Ghi dữ liệu trong vùng đệm vào một output stream khác.
60
Ví dụ : FileStream
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
String fileName="C:\\TestB.bin";
// Phát sinh và xuất mảng ngẫu nhiên
byte[]a=new byte[10];
System.out.print("Du lieu phat sinh: ");
for(int i=0;i<a.length;i++)
{
a[i]=(byte)Math.round(Math.random()*20);
System.out.print(a[i]+" ");
}
System.out.println();
// Ghi mảng a vào tập tin
FileOutputStream fo=new FileOutputStream(fileName);
fo.write(a);
fo.close();
61
Ví dụ : FileStream (tt)
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
// Đọc tập tin vào mảng b
FileInputStream fi=new FileInputStream (fileName);
byte[] b=new byte[fi.available()];
fi.read(b);
fi.close();
// Xuất mảng b
System.out.print("Du lieu doc duoc : ");
for(inti=0;i<b.length;i++)
{
System.out.print(b[i]+" ");
}
System.out.println();
62
Ví dụ : ByteArrayOutputStream
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
import java.io.*;
class LuongXuatMang
{
public static void main(String[] args)
{
try{
//Tao mot luong xuat mang 100 byte
ByteArrayOutputStream os = new ByteArrayOutputStream(100);
//Ghi du lieu vao luong
for(byte i=0;i<100;i++)
os.write(i); //Doc du lieu tu luong vao mang
byte[] b = os.toByteArray();
for(byte i=0;i<100;i++)
System.out.print(b[i]+" ");
os.close();
}catch(IOException e)
{
System.err.println(e); }
}
}
63
Các lớp nhập xuất luồng ký tự
Các luồng ký tự có chức năng đọc hoặc ghi dữ liệu dạng ký tự.
Các luồng nhập ký tự
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
64
Các lớp nhập xuất luồng ký tự (tt)
Các luồng xuất ký tự
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
65
Các lớp nhập xuất luồng ký tự (tt)
Các luồng xuất ký tự Reader :
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
void close() Đóng stream.
void mark(int readlimit)
Đánh dấu vịtrí hiện tại. Nếu sau khi đánh dấu ta đọc quá
readlimit ký tự thì chỗ đánh dấu không còn hiệu lực.
boolean markSupported()
Đọc ký tự kế tiếp trong stream. Quy ước: Trảvề-1 nếu hết
stream. Đây là phương thức trừu tượng.
abstract intread() Trởlại chỗ đã đánh dấu bằng phương thức mark().
int read(char[]cbuf)
Đọc một dãy ký tự và lưu kết quả trong mảng cbuf. Sau khi
đọc xong sẽ trả về số ký tự đọc được thật sự (nếu đang đọc mà
hết stream thì số ký tự đọc được thật sự sẽ nhỏ hơn sức chứa
của cbuf). Nếu stream đã hết mà vẫn đọc nữa thì kết quả trả về
là -1.
66
Các lớp nhập xuất luồng ký tự (tt)
Các luồng xuất ký tự Reader (tt) :
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
int read(char[] cbuf, int
offset, int len)
Đọc một dãy ký tự và lưu kết quả trong mảng cbuf kể từ ký tự
thứ offset. Sau khi đọc xong sẽ trả về số ký tự đọc được thật sự
(nếu đang đọc mà hết stream thì sốký tự đọc được thật sẽ nhỏ
hơn len). Nếu stream đã hết mà vẫn đọc nữa thì kết quả trả về
là
-1.
voidread(CharBuffer target) Đọc một dãy ký tựvà lưu kết quảtrong target.
boolean ready() Trảvề true nếu stream sẵn sàng để đọc.
void reset() Trởlại chỗ đã đánh dấu bằng phương thức mark().
long skip(longn) Bỏqua n ký tự (để đọc các ký tự tiếp sau).
67
Các lớp nhập xuất luồng ký tự (tt)
Các luồng xuất ký tự Writer :
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
Writer append(charc) Nối đuôi ký tự cvào stream.
Writer append(CharSequence csq) Nối đuôi dãy ký tự csqvào stream.
Writer append(CharSequence csq,
int start, int end)
Nối đuôi một phần của dãy ký tự csqvào stream.
void close() Đóng stream.
void flush() Buộc stream ghi hết dữ liệu trong vùng đệm ra ngoài.
void write(char[]cbuf)
Ghi một mảng ký stream. Sốký tự được ghi sẽ
là cbuffer.length.
abstract void write(int c)
Ghi một ký tự vào stream. Đây là phương thức trừu
tượng.
void write(String c) Ghi một chuỗi vào stream
Void write(String str, int off, int len) Ghi một phần của chuỗi vào stream.
68
Các lớp nhập xuất luồng ký tự (tt)
Các phương thức trong lớp FileReader
Các phương thức trong lớp FileWriter
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
FileReader(File file)
Tạo FileReader để đọc dữ liệu từ một tập tin liên kết tới đối
tượng File.
FileReader(String name) Tạo FileReader để đọc dữ liệu từ một tập tin có tên là name.
FileWriter (File file)
Tạo FileWriter để ghi dữ liệu vào một tập tin liên kết tới đối
tượng File.
FileWriter(File file, boolean
append)
Tạo FileWriter để ghi dữ liệu tập tin liên kết tới đối tượng
File. Nếu append là true thì sẽ ghi tiếp vào cuối tập tin, ngược
lại thì ghi đè lên tập tin.
FileWriter(String name) Tạo FileWriter để ghi dữl iệu vào một tập tin có tên là name.
FileWriter(String name,
boolean append)
Tạo FileWriter để ghi dữ liệu vào một tập tin có tên là name.
Nếu append là true thì sẽ ghi tiếp vào cuối tập tin, ngược lại
thì ghi đè lên tập tin.
69
Các lớp nhập xuất luồng ký tự (tt)
Các phương thức trong lớp CharArrayReader
Các phương thức trong lớp CharArrayWriter
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
CharArrayReader(char[]
buf)
Tạo FileReader để đọc dữ liệu từ một tập tin liên kết tới đối
tượng File.
CharArrayReader(char[]
buf, int off, int len)
Tạo ra CharArrayReader và dùng một phần của buf để làm
vùng đệm.
CharArrayWriter() Tạo ra một CharArrayWriter.
CharArrayWriter(int
size)
Tạo ra một CharArrayWriter với vùng đệm size ký tự.
char[] toCharArray() Tạo ra mảng ký tự là bản sao của vùng đệm của this.
String toString()
Tạo ra chuỗi là bản sao của vùng đệm của this với các byte
được đổi thành ký tự tương ứng.
void writeTo(Writer out) Ghi dữ liệu trong vùng đệm vào một writer khác.
70
Các lớp nhập xuất luồng ký tự (tt)
Các phương thức trong lớp StringReader
Các phương thức trong lớp CharArrayWriter
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
StringReader(String s) Tạo ra một StringReader.
StringWriter()
Tạo ra một StringReader, dùng vùng đệm có kích thước mặc
định.
StringWriter(int initialSize)
Tạo ra một StringReader, dùng vùng đệm có kích thước là
initialSize.
StringBuffer getBuffer() Trả về vùng đệm của stream.
71
Ví dụ : file reader và file writer
String fileName="C:\\TestC.txt";
String s="Hello File Reader/Writer!";
System.out.println("Du lieu ban dau : "+s);
// Ghi s vào tập tin
FileWriter fw=new FileWriter(fileName);
fw.write(s);
fw.close();
// Đọc tâp tin vào chuỗi sb
FileReader fr=new FileReader(fileName);
StringBuffer sb=new StringBuffer();
char ca[]=new char[5]; // Đọc mỗi lần tối đa 5 ký tự
while(fr.ready())
{
int len=fr.read(ca); // len: số ký tự đọc được thật sự
sb.append(ca,0,len);
}
fr.close();
// Xuất chuỗi sb
System.out.println("Du lieu doc duoc : "+sb);
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
72
Các luồng lọc dữ liệu (Filter
Stream)
Bởi vì các luồng dữ liệu được chuyển tải dạng byte hoặc ký tự, nên cần có
một bộ biến đổi các luồng dữ liệu này sang những giá trị có định kiểu
khác nhau. Java cung cấp thêm các luồng lọc dữ liệu :
DataInputStream
DataOutputStream
Các luồng này sẽ kết hợp với các luồng khác để lọc ra dữ liệu có định
dạng thích hợp.
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
73
Các luồng lọc dữ liệu (Filter
Stream) (tt)
Các phương thức lớp DataInputStream
Các phương thức lớp DataOutputStream
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
DataInputStream (InputStream in) Tạo stream để đọc dữliệu theo định dạng.
boolean readBoolean()
Đọc một giá trịkiểu boolean.
Các kiểu byte, char, double, float,... cũng có những
phương thức tương ứng.
DataOutputStream
(OutputStream out)
Tạo stream đểghi dữliệu theo định dạng
int size() Trả về số byte mà stream đã ghi.
void writeBoolean(boolean v)
Ghi một biến kiểu boolean. Các kiểu byte, char, double,
float,... cũng có những phương thức tương ứng.
void writeBytes(String s) Ghi chuỗi thành một dãy các byte.
void writeChars(String s) Ghi chuỗi thành một dãy các ký tự.
74
Các luồng lọc dữ liệu (Filter
Stream) (tt) – Ví dụ
String name="C:\\TestD.txt";
// Ghi dữliệu
DataOutputStream fo=new DataOutputStream(new
FileOutputStream(name));
fo.writeBoolean(true);
fo.writeInt(786);
fo.writeFloat(0.123f);
fo.close();
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
75
Các luồng lọc dữ liệu (Filter
Stream) (tt) – Ví dụ
// Đọc dữliệu
DataInputStream fi=new DataInputStream(new
FileInputStream(name));
boolean b=fi.readBoolean();
int i=fi.readInt();
float f=fi.readFloat();
fo.close();
// Xuất dữliệu đọc được ra màn hình
System.out.println("Du lieu doc duoc: ");
System.out.println(String.valueOf(b));
System.out.println(i);
System.out.println(String.valueOf(f));
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
76
Các luồng đệm dữ liệu
Để tăng tốc độ đọc/ghi, nhất là đối với thao tác đọc/ghi trên bộ nhớ
phụ, người ta dùng kỹ thuật vùng nhớ đệm.
Vùng đệm đọc: dữ liệu sẽ được đọc vào vùng đệm thành từng khối, sau đó
lấy ra dùng từ từ, khối hết thì sẽ đọc tiếp khối kế giảm số thao tác đọc.
Vùng đệm ghi: dữliệu cần ghi sẽ được gom lại đến khi đủ số lượng cần thiết
thì sẽ được ghi một lần giảm số thao tác ghi.
Các luồng đệm hỗ trợ đọc và ghi
BufferedInputStream: đọc dữliệu dạng byte, có dùng vùng đệm
BufferedOutputStream: ghi dữliệu dạng byte, có dùng vùng đệm
BufferedReader: đọc dữliệu dạng ký tự, có dùng vùng đệm
BufferedWriter: ghi dữliệu dạng ký tự, có dùng vùng đệm
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
77
Các luồng đệm dữ liệu
Các phương thức của các luồng đệm
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
78
Các luồng đệm dữ liệu
Các phương thức của các luồng đệm
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
79
Các luồng đệm dữ liệu – Ví dụ
String fileName="C:\\TestC.txt";
String s="Hello Buffered File Reader/Writer!";
System.out.println("Du lieu ban dau : "+s);
// Ghi s vào tập tin
BufferedWriter bw=new
BufferedWriter(newFileWriter(fileName));
bw.write(s);
bw.close();
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
80
Các luồng đệm dữ liệu – Ví dụ
// Đọc tâp tin vào chuỗi sb
BufferedReader br=new BufferedReader(new
FileReader(fileName));
StringBuffer sb=new StringBuffer();
char ca[]=new char[5];//Đọc mỗi lần tối đa 5 ký tự
while(br.ready())
{
int len=br.read(ca);//len:số ký tự đọc được thật sự
sb.append(ca,0,len);
}
br.close();
// Xuất chuỗi sb
System.out.println("Du lieu doc duoc : "+sb);
MỘT SỐ VẤN ĐỀ TRONG JAVA
Quản lý luồng nhập xuất
81
LẬP TRÌNH ĐA TUYẾN
Một số chương trình ứng dụng cần xử lý nhiều yêu cầu cùng một lúc. Ví
dụ : một Server cần đáp ứng dữ liệu cho nhiều yêu cầu.
Chương trình ứng dụng cần phải thực hiện xử lý mỗi yêu cầu trên một
tuyến riêng biệt để đảm bảo việc chờ Server thực thi không bị chậm trễ
Ngôn ngữ Java cho phép lập trình đa tuyến trình.
MỘT SỐ VẤN ĐỀ TRONG JAVA
LẬP TRÌNH ĐA TUYẾN
82
LẬP TRÌNH ĐA TUYẾN
Một số chương trình ứng dụng cần xử lý nhiều yêu cầu cùng một lúc. Ví
dụ : một Server cần đáp ứng dữ liệu cho nhiều yêu cầu.
Chương trình ứng dụng cần phải thực hiện xử lý mỗi yêu cầu trên một
tuyến riêng biệt để đảm bảo việc chờ Server thực thi không bị chậm trễ
Ngôn ngữ Java cho phép lập trình đa tuyến trình.
MỘT SỐ VẤN ĐỀ TRONG JAVA
LẬP TRÌNH ĐA TUYẾN
83
LẬP TRÌNH ĐA TUYẾN (tt)
Lập trình đa tuyến
Một chương trình có thực hiện đa tiến trình cho phép nhiều tiến trình
thực hiện cùng một lúc. Mỗi tiến trình được xử lý bởi một CPU riêng.
Với máy có nhiều CPU (hoặc CPU đa nhân) thì việc xử lý đồng thời
là thật nhưng số lệnh chạy cùng lúc không thể vượt quá số CPU. Khi
đó, việc điều phối xem tiến trình chạy trên CPU nào thông thường
sẽdo HĐH quy định.
Với CPU (đơn nhân) thì chỉcó thể thực thi lệnh một cách tuần tự,
nghĩa là một CPU chỉchạy một lệnh trong một thời điểm. CPU sẽ thực
hiện phương pháp xoay vòng.
MỘT SỐ VẤN ĐỀ TRONG JAVA
LẬP TRÌNH ĐA TUYẾN
84
Lớp Thread
Để lập trình đa tiến trình, lớp dẫn xuất từ lớp Thread được cài đặt sau đó
override phương thức run()
Để thực thi một tiến trình, ta gọi phương thức start()
Ví dụ :
public class Main01
{
public static void main(String[]args) {
MyThread t1=new MyThread(); // Tạo tiến trình
MyThread t2=new MyThread();
t1.start(); // Gọi thực thi tiến trình
t2.start();
}
}
MỘT SỐ VẤN ĐỀ TRONG JAVA
LẬP TRÌNH ĐA TUYẾN
85
Lớp Thread (tt)
Class MyThread extends Thread // Kếthừa lớp Thread
{
public void run() // Override phương thức run
{
int i=0;
while(i<200)
{
System.out.println(getName()+" "+i);
i++;
}
}
}
MỘT SỐ VẤN ĐỀ TRONG JAVA
LẬP TRÌNH ĐA TUYẾN
86
Lớp Thread (tt)
Một số phương thức của lớp Thread
MỘT SỐ VẤN ĐỀ TRONG JAVA
LẬP TRÌNH ĐA TUYẾN
Thread() Tạo Thread với giá trịmặc định
Thread(String name) Thread(String name)
Thread(Runnable target) Tạo thread liên kết với đối tượng Runnable
Thread(Runnable target, String
name)
Tạo Thread liên kết với đối tượng Runnable và có tên
cho trước
void setPriority(int n) Thiết lập độ ưu tiên (n từ 1 – 10)
void start() Chạy Thread
void interrupt() Dừng thread
87
Interface Runnable
Nếu không thể tạo class kế thừa từ Thread, ta có thể cho nó implement interface
Runnable. Khi đó, class phải hiện thực phương thức void run() của interface này.
Class MyRunnable implements Runnable {
public void run() { // Cài đặt phương thức run của
Runnable
int i=0;
while(i<200)
{
System.out.println(getName()+" "+i);
i++;
}
}
}
MỘT SỐ VẤN ĐỀ TRONG JAVA
LẬP TRÌNH ĐA TUYẾN
88
Interface Runnable (tt)
public class Main01
{
public static void main(String[]args)
{
Runnable r1=new MyRunnable(); // Tạo runnable
Runnable r2=new MyRunnable();
Thread t1=new Thread(r1); // Tạo thread liên kết
Thread t2=new Thread(r2); // với runnable
t1.start();
t2.start();
}
}
MỘT SỐ VẤN ĐỀ TRONG JAVA
LẬP TRÌNH ĐA TUYẾN
89
Đồng Bộ Hóa
Khi các tuyến chạy độc lập có thể sử dụng chung các phương thức hoặc các
đối tượng dữ liệu. Điều này sẽ gây ra sự mất toàn vẹn hoặc sai trong quá trình
tính toán.
Đồng bộ hóa giúp cho các tuyến sử dụng chung phương thức hoặc dữ liệu
khôn
Các file đính kèm theo tài liệu này:
- bai_giang_lap_trinh_java_chuong_2_mot_so_van_de_trong_lap_tr.pdf