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

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)

pdf114 trang | Chia sẻ: trungkhoi17 | Lượt xem: 532 | Lượt tải: 0download
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:

  • pdfbai_giang_lap_trinh_java_chuong_2_mot_so_van_de_trong_lap_tr.pdf