Java - Chương 4.1: Nhập xuất

Bài 1: Viết chương trình đếm xem trong một file văn bản cho trước có bao nhiêu câu. Biết rằng các câu kết thúc bởi dấu chấm. • Bài 2: Viết chương trình tạo file ghi 100 số Fibonacci đầu tiên. Viết chương trình thứ hai để đọc và hiển thị dữ liệu từ file này.

pdf56 trang | Chia sẻ: nguyenlam99 | Lượt xem: 982 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Java - Chương 4.1: Nhập xuất, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 4.1 Nhập xuất Chương 4.1: Nhập xuất o Định dạng nhập/xuất o Khái niệm luồng o Các luồng byte o Các luồng ký tự o File truy cập ngẫu nhiên o Luồng nhập/xuất đối tượng. o Nhập/xuất với Scanner. o Nhập/xuất với JOptionPane Định dạng nhập xuất o Sử dụng hàm printf() và println() để định dạng kiểu dữ liệu ở console. Mã định dạng Mô tả %d Kết quả định dạng như một số nguyên thập phân %f Kết quả định dạng như là một số thực %o Kết quả định dạng như là một số Octal (Cơ số 8) %e Kết quả định dạng như là một số thập phân trong kiểu số khoa học %n Kết quả được hiển thị trong một dòng mới Định dạng nhập xuất o Ví dụ: Thực hiện đoạn chương trình sau: public static void main(String[] args){ float i = 8; float j = 3; System.out.println(“Ket qua cua i/j la: “ + i/j); System.out.printf(“Ket qua cua i/j la %.2f”, i/j); } o Kết quả: Luồng (Stream) o Luồng là một “dòng chảy” của dữ liệu được gắn với các thiết bị vào ra. o Hai loại luồng:  Luồng nhập: Gắn với các thiết bị nhập như bàn phím, máy scan, file...  Luồng xuất: Gắn với các thiết bị xuất như màn hình, máy in, file, Các luồng cơ bản o Byte streams  Hỗ trợ việc xuất nhập dữ liệu trên byte, thường được dùng khi đọc ghi dữ liệu nhị phân.  InputStream: Luồng nhập byte cơ bản  OutputStream: Luồng xuất byte cơ bản o Character streams  Cho các ký tự Unicode  Reader: Luồng nhập ký tự cơ bản  Writer: Luồng xuất ký tự cơ bản Biến / Đối tượng Dòng nhập byte vật lý Xử lý từng byte một Dòng nhập ký tự Xử lý theo đơn vị 2 byte Dòng xuất byte vật lý Xử lý từng byte một Dòng xuất ký tự Xử lý theo đơn vị 2 byte Lớp trừu tượng trên cùng java.io.InputStream Lớp trừu tượng trên cùng java.io.OutputStream Lớp trừu tượng trên cùng java.io.Reader Lớp trừu tượng trên cùng java.io.Writer o Các lớp luồng nằm trong gói java.io Các luồng cơ bản Luồng byte o input stream: sử dụng để đọc dữ liệu. o output stream: sử dụng để ghi dữ liệu. Cây thừa kế InputStream Các phương thức của InputStream int available( ) Trả về số luợng bytes có thể đọc được từ luồng nhập void close( ) Đó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 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. int read( ) Đọc byte tiếp theo từ luồng nhập int read(byte buffer[ ]) Đọ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 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 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 Cây thừa kế OutputStream Các phương thức của OutputStream 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 void flush( ) Ép dữ liệu từ bộ đệm phải ghi ngay xuống luồng (nếu có) void write(int b) Ghi byte dữ liệu chỉ định xuống luồng void write(byte buffer[ ]) Ghi buffer.length bytes dữ liệu từ mảng chỉ định xuống luồng void write(byte buffer[ ], int offset, int numBytes) Ghi numBytes bytes dữ liệu từ vị trí offset của mảng chỉ định buffer xuống luồng 13 o Mở một file để đọc dữ liệu FileInputStream(String fileName) throws FileNotFoundException Nếu file không tồn tại: thì ném ra FileNotFoundException o Đọc dữ liệu: dùng phương thức read() int read( ) throws IOException: đọc từng byte từ file và trả về giá trị của byte đọc được. Trả về -1 khi hết file, và ném ra IOException khi có lỗi đọc. o Đóng file: dùng phương thức close() void close( ) throws IOException: sau khi làm việc xong cần đóng file để giải phóng tài nguyên hệ thống đã cấp phát cho file. Đọc dữ liệu từ file o Mở một file để ghi dữ liệu FileOutputStream(String fileName) throws FileNotFoundException Nếu file không tạo được: thì ném ra FileNotFoundException o Ghi dữ liệu xuống: dùng phương thức write() void write(int byteval) throws IOException: ghi một byte xác định bởi tham số byteval xuống file, và ném ra IOException khi có lỗi ghi. o Đóng file: dùng phương thức close() void close( ) throws IOException: sau khi làm việc xong cần đóng file để giải phóng tài nguyên hệ thống đã cấp phát cho file. Ghi dữ liệu từ file Sử dụng FileInputStream & FileOutputStream //Ví dụ chép dữ liệu từ file doc.txt sang ghi.txt import java.io.*; public class DocFile1 { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream(“d:/doc.txt"); out = new FileOutputStream(“d:/ghi.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } }finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } } import java.io.*; public class ReadFile { public static void main(String[] args){ try { FileInputStream f = new FileInputStream("readme.txt"); int ch; while ( (ch = f.read()) != -1 ) { System.out.print((char)ch); } f.close(); } catch (FileNotFoundException d) { System.out.println("File not found"); } catch (IOException d) { System.out.println("Can not read file"); } }} Ví dụ import java.io.*; public class WriteFile { public static void main(String[] args) { byte buffer[] = new byte[80]; try { System.out.println("Enter a string to write to file: "); int num = System.in.read(buffer); FileOutputStream f = new FileOutputStream("line.txt"); f.write(buffer, 0, num); f.close(); } catch (IOException e) { System.out.println("Error IO file"); } }} Ví dụ Luồng ký tự (Character Stream) o Java platform lưu trữ những giá trị ký tự theo dạng Unicode o Tất cả các lớp character stream được kế thừa từ Reader và Writer o Có các lớp character stream:  FileReader  FileWriter 19 • Để đọc và ghi những giá trị nhị phân của các kiểu dữ liệu trong java, chúng ta sử dụng: – DataInputStream – DataOutputStream. Đọc ghi dữ liệu nhị phân 20 void writeBoolean(boolean val) Ghi xuống luồng một giá trị boolean được xác định bởi val. void writeByte (int val) Ghi xuống luồng một byte được xác định bởi val. void writeChar (int val) Ghi xuống luồng một Char được xác định bởi val. void writeDouble(double val) Ghi xuống luồng một giá trị Double được xác định bởi val. void writeFloat (float val) Ghi xuống luồng một giá trị float được xác định bởi val. void writeInt (int val) Ghi xuống luồng một giá trị int được xác định bởi val. void writeLong (long val) Ghi xuống luồng một giá trị long được xác định bởi val. void writeShort (int val) Ghi xuống luồng một giá trị short được xác định bởi val. Contructor: DataOutputStream(OutputStream outputStream) OutputStream: là luồng xuất dữ liệu. Để ghi dữ liệu ra file thì đối tượng outputStream có thể là FileOutputStream. Đọc ghi dữ liệu nhị phân 21 boolean readBoolean( ) Đọc một giá trị boolean Byte readByte( ) Đọc một byte char readChar( ) Đọc một Char double readDouble( ) Đọc một giá trị Double float readFloat( ) Đọc một giá trị float int readInt( ) Đọc một giá trị int long readLong( ) Đọc một giá trị long short readShort( ) Đọc một giá trị short Contructor: DataInputStream(InputStream inputStream) InputStream: là luồng nhập dữ liệu. Để đọ dữ liệu từ file thì đối tượng InputStream có thể là FileInputStream. Đọc ghi dữ liệu nhị phân 22 import java.io.*; class RWData{ public static void main(String args[]) throws IOException{ DataOutputStream dataOut; DataInputStream dataIn; int i = 10; double d = 1023.56; boolean b = true; try { dataOut = new DataOutputStream(new FileOutputStream("D:\\testdata")); }catch(IOException exc) { System.out.println("Cannot open file."); return; } try { System.out.println("Writing " + i); dataOut.writeInt(i); System.out.println("Writing " + d); dataOut.writeDouble(d); System.out.println("Writing " + b); Đọc ghi dữ liệu nhị phân 23 dataOut.writeBoolean(b); System.out.println("Writing " + 12.2 * 7.4); dataOut.writeDouble(12.2 * 7.4); } catch(IOException exc) { System.out.println("Write error."); } dataOut.close(); System.out.println(); // Now, read them back. try { dataIn = new DataInputStream( new FileInputStream("D:\\testdata")); } catch(IOException exc) { System.out.println("Cannot open file."); return; } Đọc ghi dữ liệu nhị phân 24 try { i = dataIn.readInt(); System.out.println("Reading " + i); d = dataIn.readDouble(); System.out.println("Reading " + d); b = dataIn.readBoolean(); System.out.println("Reading " + b); d = dataIn.readDouble(); System.out.println("Reading " + d); } catch(IOException exc) { System.out.println("Read error."); } dataIn.close(); } } Đọc ghi dữ liệu nhị phân Cây kế thừa của Reader và Writer Các phương thức của Reader Các phương thức của Writer Sử dụng FileReader & FileWriter //Ví dụ chép dữ liệu từ file doc.txt sang ghi.txt import java.io.*; public class DocFile2 { public static void main(String[] args) throws IOException { FileReader in = null; FileWriter out = null; try { in = new FileReader("d:/doc.txt"); out = new FileWriter("d:/ghi.txt"); int c; while ((c = in.read()) != -1){ out.write(c); } }finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } }} Sử dụng BufferedReader và BufferedWriter o Một I/O không có bộ đệm có nghĩa là mỗi yêu cầu đọc hoặc ghi được xử lý trực tiếp bởi HĐH.  Điều này làm chương trình kém hiệu quả, vì mỗi yêu cầu thường phải truy xuất đĩa, hoạt động mạng-> tốn thời gian. o Java platform thực thi luồng I/O có bộ đệm  Buffered input stream:  Đọc dữ liệu từ vùng nhớ như là bộ đệm  API input được gọi chỉ khi bộ đệm rỗng.  Buffered output stream:  Ghi dữ liệu xuống bộ đệm.  API output chỉ được gọi khi buffer đầy. //Ví dụ chép dữ liệu từ file doc.txt sang ghi.txt import java.io.*; public class DocFile3 { public static void main(String[] args) throws IOException { BufferedReader in = null; BufferedWriter out = null; try { in = new BufferedReader(new FileReader("d:/doc.txt")); out = new BufferedWriter(new FileWriter("d:/ghi.txt")); int c; while ((c = in.read()) != -1) { out.write(c);} } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } }}} Sử dụng BufferedReader và BufferedWriter Chuẩn Buffered Streams o Tất cả các chương trình viết bằng java luôn tự động import gói java.lang. Gói này có định nghĩa lớp System, nó có ba biến luồng được định nghĩa trước là in, out và err, chúng là các fields được khai báo static trong lớp System.  System.out: luồng xuất chuẩn, mặc định là console. System.out là một đối tượng kiểu PrintStream.  System.in: luồng nhập chuẩn, mặc định là bàn phím. System.in là một đối tượng kiểu InputStream.  System.err: luồng lỗi chuẩn, mặc định cũng là console. System.err cũng là một đối tượng kiểu PrintStream giống System.out. 32 //nhập liệu sử dụng phương thức System.in.read() import java.io.*; class ReadBytes { public static void main(String args[]) throws IOException { 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]); } } Ví dụ 33 //nhập liệu sử dụng phương thức System.out.write() import java.io.*; class WriteDemo { public static void main(String args[]) { int b; b = 'X'; System.out.write(b); System.out.write('\n'); } } Ví dụ Ví dụ import java.io.*; public class TestInput{ public static void main(String[] args) throws Exception{ BufferedReader inStream = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Nhap mot so nguyen:"); String siNumber = inStream.readLine(); //đọc dữ liệu -> chuỗi int iNumber = Integer.parseInt(siNumber); //chuyển sang định dạng số System.out.print("Nhap mot so thuc:"); String sfNumber = inStream.readLine(); float fNumber = Float.parseFloat(sfNumber); System.out.println("So nguyen:" + iNumber); System.out.println("So thuc:" + fNumber); } } Ví dụ import java.io.*; public class OutStream1 { public static void main(String[] args) { OutputStream os = System.out; //Monitor try{ String str = "The example of OutputStream\n"; byte b[] = str.getBytes(); os.write(b); } catch(IOException ie){ System.out.println("Error: " + ie); } } } o Hai hạn chế của việc xử lý file thông qua luồng  Không thể đọc và ghi file cùng một lúc  Truy nhập file mang tính tuần tự o Java hỗ trợ việc truy nhập và xử lý file một cách tự do thông qua lớp RandomAccessFile. File truy nhập ngẫu nhiên o Các phương thức cơ bản – RandomAccessFile(String name, String mode) // trong đó mode có thể là “r”, “w”, “rw” – int readInt(); // đọc số nguyên – void writeInt(int v); // ghi số nguyên – long readLong(); // đọc số long – void writeLong(long v); // ghi số long – void seek(long pos); // di chuyển vị trí con trỏ file – long getFilePointer(); // lấy vị trí của con trỏ file – long length(); // lấy kích cỡ của file – void close(); // đóng file – ... File truy nhập ngẫu nhiên try{ RandomAccessFile f = new RandomAccessFile("randfile.dat","rw"); f.writeBoolean(true); f.writeInt(123456); f.writeChar('j'); f.writeDouble(1234.56); f.seek(1); System.out.println(f.readInt()); System.out.println(f.readChar()); System.out.println(f.readDouble()); f.seek(0); System.out.println(f.readBoolean()); f.close(); } catch (IOException e) { System.out.println(“Error IO file”); } Sử dụng RandomAccessFile Để lưu lại một đối tượng, ta có thể lưu lần lượt từng thuộc tính của nó. Khi đọc lại đối tượng ta phải tạo đối tượng mới từ các thuộc tính đã ghi. => Dài dòng, kém linh hoạt. Java hỗ trợ đọc/ghi các đối tượng một cách đơn giản thông qua lớp ObjectInputStream và ObjectOutputStream. Một đối tượng muốn có thể được đọc/ghi phải cài đặt giao tiếp java.io.Serializable Luồng nhập/xuất đối tượng //ghi lại tên và ngày sinh try{ FileOutputStream f = new FileOutputStream("birthfile.dat"); ObjectOutputStream oStream = new ObjectOutputStream(f); String babyName = "Briney Spears"; Date today = new Date(); oStream.writeObject(babyName); oStream.writeObject(today); oStream.close(); } catch (IOException e) { System.out.println(“Error IO file”); } Ví dụ Ví dụ //đọc tên và ngày sinh try{ FileInputStream f = new FileInputStream("birthfile.dat"); ObjectInputStream inStream = new ObjectInputStream(f); String name = (String) inStream.readObject(); Date birthDate = (Date) inStream.readObject(); System.out.println("Name of baby: " + name); System.out.println("Birth date: " + birthDate); inStream.close(); } catch (IOException e) { System.out.println(“Error IO file”); } catch (ClassNotFoundException e) { System.out.println(“Class of serialized object not found”); } // file Student.java public class Student implements Serializable { private String name; private int age; Student(String name, int age) { this.name = name; this.age = age; } public String toString() { String ret = "My name is " + name + "\nI am " + age + " years old"; return ret; } } Đọc ghi đối tượng tự tạo // file WriteMyObject.java import java.io.*; public class WriteMyObject{ public static void main(String[] args){ try{ FileOutputStream f = new FileOutputStream("student.dat"); ObjectOutputStream oStream = new ObjectOutputStream(f); Student x = new Student("Bill Gates", 18); oStream.writeObject(x); oStream.close(); } catch (IOException e) { System.out.println(“Error IO file”); } Đọc ghi đối tượng tự tạo try { FileInputStream g = new FileInputStream("student.dat"); ObjectInputStream inStream = new ObjectInputStream(g); Student y = (Student) inStream.readObject(); System.out.println(y.toString()); inStream.close(); }catch (ClassNotFoundException e) { System.out.println(“Class not found”); } catch (IOException e) { System.out.println(“Error IO file”); } } } Đọc ghi đối tượng tự tạo • Đối tượng có thể cài đặt 2 phương thức sau để thực hiện đọc/ghi theo cách riêng của mình. – private void writeObject(ObjectOutputStream out) throws IOException – private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException Đọc ghi đối tượng tự tạo Đối tượng có thể cài đặt 2 phương thức sau để thực hiện đọc/ghi theo cách riêng của mình. private void writeObject(ObjectOutputStream out) throws IOException private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException Đọc ghi đối tượng tự tạo Nên dùng DataInputStream và DataOutputStream để nhập/xuất các dữ liệu kiểu sơ cấp (int, float...) Nên dùng ObjectInputStream và ObjectOutputStream nhập/xuất các đối tượng. Nên kết hợp luồng file và luồng đọc/ghi ký tự để nhập xuất các file ký tự Unicode. Nên dùng RandomAccessFile nếu muốn đọc/ghi tự do trên file. Dùng lớp File để lấy thông tin về file Tóm tắt về xử lý file Nhập dữ liệu sử dụng lớp Scanner o Scanner có nhiều tiến bộ hơn BufferReader. o Phân loại được dữ liệu mà người dùng nhập vào, có thể đọc kiểu int, float, double, BufferedReader in1 = new BufferedReader(new InputStreamReader(System.in)); System.out.println(“Nhập vào một số nguyên: "); String siNumber = in1.readLine(); //đọc dữ liệu -> chuỗi int iNumber = Integer.parseInt(siNumber); //chuyển sang định dạng số. Scanner in1=new Scanner(System.in); System.out.println(“Nhập vào một số nguyên: "); age= in1.nextInt(); //nhận trực tiếp kiểu int Một số phương thức của lớp Scanner o nextInt() : trả về kiểu int o nextFloat() : trả về kiểu float o nextBoolean() : trả về kiểu boolean o nextByte() : trả về kiểu byte o nextLine() : trả về kiểu String. Nhập dữ liệu sử dụng lớp Scanner import java.util.Scanner; public class GetInputFromKeyboard { public static void main(String[] args) { //Tạo một đối tượng Scanner Scanner in1=new Scanner(System.in); String name = ""; int age; System.out.println("Hãy nhập tên: "); name = in1.nextLine(); System.out.println("Hãy nhập tuổi: "); age= in1.nextInt(); System.out.println("Name is " + name +"!"); System.out.println("Age is " + age +"!"); } } Nhập xuất với JOptionPane o JOptionPane là một lớp kế thừa từ lớp JComponent. o Khi biên dịch program thì nó sẽ hiện lên một dialog box cho phép nhập dữ liệu. o Một số phương thức:  showConfirmDialog(): Hiển thị một câu hỏi lựa chọn giống như yes no cancel  showInputDialog(): Hiển thị box nhập  showMessageDialog(): Báo cho người dùng một sự kiện vừa xảy ra. Nhập xuất với JOptionPane import javax.swing.JOptionPane; public class InputFromKeyboardJOptionPane { public static void main(String[] args) { String name = ""; name=JOptionPane.showInputDialog(“Nhập vào tên của bạn:"); String msg = "Hello " + name + "!"; JOptionPane.showMessageDialog(null, msg); System.out.println("Name is:"+msg); } } Các thao tác với tập tin và thư mục o File (java.io.File): giúp thao tác với tập tin và thư mục o Một số hàm của lớp này như:  isFile kiểm tra đúng là tập tin hay không.  isDirectory kiểm tra phải thư mục  exists kiểm tra tập tin hoặc thư mục có tồn tại.  canRead kiểm tra quyền đọc của tập tin hoặc thư mục  canWrite kiểm tra có quyền ghi không  setReadable cài đặt quyền đọc cho tập tin hoặc thư mục  setWritable cài đặt quyền ghi cho tập tin hoặc thư mục  mkdir tạo một thư mục tại đường dẫn đó  renameTo đổi tên tập tin hay thư mục  delete xóa tập tin hoặc thư mục  createNewFile tạo tập tin Các thao tác với tập tin và thư mục o Đọc thư mục d:/eclipse rồi in ra kết quả đường dẫn của các file import java.io.File; public class CreateDirectoryExample { public static void main(String[] args) { File file = new File("d:/angiang/longxuyen"); if (!file.exists()) { if (file.mkdir()) { System.out.println("Directoryreated!"); } else { System.out.println("Failedreate directory!"); } } } } Các thao tác với tập tin và thư mục import java.io.File; public class CreateDirectory1 { public static void main(String[] args) { File myDocumentFolder = new File("d:/eclipse"); if(myDocumentFolder.exists() && myDocumentFolder.isDirectory() && myDocumentFolder.canRead()) { File[] files = myDocumentFolder.listFiles(); for(File f : files) { System.out.println(f); } } }} Bài tập tại lớp • Bài 1: Viết chương trình đếm xem trong một file văn bản cho trước có bao nhiêu câu. Biết rằng các câu kết thúc bởi dấu chấm. • Bài 2: Viết chương trình tạo file ghi 100 số Fibonacci đầu tiên. Viết chương trình thứ hai để đọc và hiển thị dữ liệu từ file này.

Các file đính kèm theo tài liệu này:

  • pdfjava_chuong_4_1_nhap_xuat_5051.pdf