Chương Ghi/₫ọc liệu ứng dụng C# file 8.0 Dẫn nhập 8.1 Tổng quát ₫ời sống liệu ứng dụng VC# 8.2 Các cấp ₫ộ ghi/₫ọc liệu phổ biến 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file 8.4 Ghi/₫ọc chuỗi ký tự ra/từ file 8.5 Ghi/₫ọc liệu có kiểu ₫ịnh sẵn ra/từ file nhị phân 8.6 Ghi/₫ọc liệu có kiểu ₫ịnh sẵn ra/từ file văn 8.7 Ghi/Đọc hệ thống ₫ối tượng ra/vào file 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng 8.9 Kết chương Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 8.0 Dẫn nhập Chương giới thiệu ₫ối tượng phục vụ ghi/₫ọc liệu ra/vào file tác vụ ghi/₫ọc liệu cổ ₫iển ra/vào file Chương giới thiệu ₫ối tượng phục vụ ghi/₫ọc hệ thống ₫ối tượng ra/vào file tác vụ ghi/₫ọc hệ thống ₫ối tượng có mối quan hệ tham khảo phức tạp ra/vào file Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 8.1 Tổng quát ₫ời sống liệu ứng dụng VC# Nhu cầu ghi/₫ọc nội dung biến liệu thường rơi vào tình yếu sau ₫ây : Lưu kết phiên làm việc hành ₫ể dùng lại cho phiên làm việc Nhập nhiều liệu cho phần mềm Xuất nhiều liệu cho người dùng Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 8.2 Các cấp ₫ộ ghi/₫ọc liệu phổ biến ghi/₫ọc chuỗi byte thô ra/từ file, ngữ nghĩa byte chương trình tự qui ₫ịnh ghi/₫ọc chuỗi ký tự theo cách mã hóa xác ₫ịnh (ASCII, UTF8, UCS2, ) ra/từ file ghi/₫ọc liệu thuộc kiểu ₫ịnh sẵn bool, byte, int, double, String, ra/từ file theo dạng nhị phân, dạng mã hóa gốc bên chương trình giải mã liệu thuộc kiểu ₫ịnh sẵn bool, byte, int, double, String, thành chuỗi văn bản, ghi chuỗi file văn ₫ể cần ₫ọc chuỗi văn từ file vào chương trình, mã hóa chuỗi file thành liệu nhị phân bên chương trình trước xử lý tiếp 5.ghi/₫ọc ₫ối tượng ₫ối tượng ₫ược tham khảo trực tiếp hay gián tiếp ₫ối tượng gốc ra/từ file nhị phân hay file XML Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file class sử dụng : FileStream tác vụ : WriteByte(), ReadByte() Qui trình ghi ₫iển sau : //1 tạo ₫ối tượng quản lý file ₫ể ghi liệu FileStream oFile = new FileStream("C:\\data.bin", FileMode.Create); //2 ghi byte file oFile.WriteByte(1byte); //3 ₫óng file lại ₫ể phịng ngừa việc ghi bất hợp pháp lên file oFile.Close(); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 8.3 Ghi/₫ọc chuỗi byte thơ ra/từ file Code thí dụ việc ghi chuỗi byte : Bitmap bmScreen; //₫ịnh nghĩa biến chứa ảnh bitmap Graphics gpScreen; //₫ịnh nghĩa biến chứa tác vụ xử lý nội dung ₫ối tượng giao diện this.Hide(); //nếu cần, ẩn Form hành ₫ể không xuất bitmap chụp //tạo ₫ối tượng bitmap kích thước hình bmScreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); //tạo ₫ối tượng Graphics kết hợp với bmScreen gpScreen = Graphics.FromImage(bmScreen); //chụp tồn hình lưu vào bmScreen gpScreen.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file Code thí dụ việc ghi chuỗi byte : //hiển thị lại Form hành cần this.Show(); //chuyển bitmap thành dãy byte liên tục ImageConverter imgConverter = new ImageConverter(); byte[] xByte = (byte[])imgConverter.ConvertTo(bmScreen, typeof(byte[])); //1 tạo file ₫ể lưu trữ dãy byte nội dung bitmap FileStream oFile = new FileStream("d:\\screen.bin", FileMode.Create); //2 lặp ghi byte dãy xByte file for (int i = 0; i < xByte.Length; i++) oFile.WriteByte(xByte[i]); //3 ₫óng file lại oFile.Close(); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file Qui trình ₫ọc chuỗi byte ₫iển sau : //1 tạo ₫ối tượng quản lý file ₫ể ₫ọc liệu FileStream inFile = new FileStream("C:\\data.bin", FileMode.Open); //2 ₫ọc byte từ file inFile.ReadByte(1byte); //3 ₫óng file lại ₫ể phịng ngừa việc ₫ọc bất hợp pháp lên file inFile.Close(); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 8.3 Ghi/₫ọc chuỗi byte thơ ra/từ file Code thí dụ việc ₫ọc chuỗi byte : //1 mở file chứa liệu cần ₫ọc FileStream inFile = new FileStream("d:\\screen.bin", FileMode.Open); //tạo biến dãy byte với ₫ộ lớn ₫ộ lớn file byte[] xData = new byte[inFile.Length]; //2 lặp ₫ọc byte từ file vào dãy xData for (int i = 0; i < inFile.Length; i++) xData[i] = (byte)inFile.ReadByte(); //3 ₫óng file lại inFile.Close(); //tạo ₫ối tượng Stream MemoryStream ms = new MemoryStream(xByte, 0, xByte.Length); ms.Position = 0; Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 8.3 Ghi/₫ọc chuỗi byte thô ra/từ file Code thí dụ việc ₫ọc chuỗi byte : //copy dãy byte vào ₫ối tượng Stream ms.Write(xData, 0, xData.Length); //biến ₫ổi ₫ối tượng Stream thành ₫ối tượng Image System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true); //hiển thị bitmap lên ₫ối tượng PictureBox Form ứng dụng picImage.SizeMode = PictureBoxSizeMode.StretchImage; picImage.Image = image; Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 10 8.7 Ghi/Đọc hệ thống ₫ối tượng ra/vào file Đọc/ghi liệu biến thuộc kiểu giá trị (int, double, char[], ) rấr dễ nội dung biến không chứa tham khảo ₫ến thành phần khác Ngược lại, việc ₫ọc/ghi nội dung ₫ối tượng thường khó khăn ₫ối tượng chứa nhiều tham khảo ₫ến ₫ối tượng khác ₫ối tượng tham khảo vịng lẫn Để hỗ trợ việc ₫ọc/ghi nội dung ₫ối tượng, VC# ₫ề nghị kỹ thuật "Serialization" Một ₫ối tượng ₫ược "serialize/deserialize" (ghi/₫ọc dùng kỹ thuật Serialization) thuộc class "serializable" Để ₫ịnh nghĩa class "serializable" dễ dàng ₫ơn giản nhất, ta cần thêm mệnh ₫ề [Serializable] trước phát biểu ₫ịnh nghĩa class ₫ó : [Serializable] public class A { } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 39 8.7 Ghi/Đọc hệ thống ₫ối tượng ra/vào file Để ghi ₫ối tượng (và toàn ₫ối tượng mà phụ thuộc) dạng nhị phân, ta viết template sau : //1 xử lý xây dựng ₫ối tượng B b; //2 ₫ịnh nghĩa ₫ối tượng FileStream miêu tả file chứa kết FileStream fs = new FileStream("c:\\data.obj", FileMode.Create); //3 tạo ₫ối tượng BinaryFormatter phục vụ ghi ₫ối tượng BinaryFormatter formatter = new BinaryFormatter(); //4 gọi tác vụ Serialize formatter ₫ể ghi ₫ối tượng formatter.Serialize(fs, b); //₫óng file lại fs.Flush(); fs.Close(); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 40 8.7 Ghi/Đọc hệ thống ₫ối tượng ra/vào file Để ₫ọc lại ₫ối tượng (và toàn ₫ối tượng mà phụ thuộc) dạng nhị phân ta, viết template sau : //1 ₫ịnh nghĩa biến ₫ối tượng ₫ể chứa nội dung từ file B b; //2 ₫ịnh nghĩa ₫ối tượng FileStream miêu tả file chứa liệu ₫ã có FileStream fs = new FileStream("c:\\data.obj", FileMode.Open); //3 tạo ₫ối tượng BinaryFormatter phục vụ ₫ọc ₫ối tượng BinaryFormatter formatter = new BinaryFormatter(); //4 gọi tác vụ Deserialize ₫ể ₫ọc ₫ối tượng từ file vào b = (B) formatter.Deserialize(fs); //₫óng file lại fs.Close(); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 41 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng Giả sử ta có hệ thống ₫ối tượng với trạng thái mối quan hệ chúng cụ thể sau Lưu ý chúng có mối quan hệ bao gộp dạng vòng : intB1 = dblB2 = 2.345 ba pba pba1 intA1 = dblA2 = 1.234 pab intA1 = dblA2 = 3.456 pab ₫ối tượng class B ₫ối tượng class A Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 intA1 = dblA2 = 4.567 pab Môn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 42 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng Giả sử biến b ₫ang tham khảo tới ₫ối tượng class B Hãy viết chương trình ghi hệ thống ₫ối tượng lên file ₫ể cần, ₫ọc lại vào nhớ hầu xử lý tiếp Qui trình xây dựng ứng dụng giải yêu cầu sau : Chạy VS Net, chọn menu File.New.Project ₫ể hiển thị cửa sổ New Project Mở rộng mục Visual C# TreeView "Project Types", chọn mục Windows, chọn icon "Console Application" listbox "Templates" bên phải, thiết lập thư mục chứa Project listbox "Location", nhập tên Project vào textbox "Name:" (td WRObject), click button OK ₫ể tạo Project theo thông số ₫ã khai báo Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 43 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng Ngay sau Project vừa ₫ược tạo ra, cửa sổ soạn code cho chương trình ₫ược hiển thị Thêm lệnh using sau ₫ây vào ₫ầu file : using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; Viết code cho hàm Main hàm dịch vụ khác sau : class Program { static String fbuf; static void Main(string[] args) { //₫iểm nhập chương trình //xây dựng hệ thống ₫ối tượng ghi lên file Create_SaveObject(); //₫ọc lại hệ thống ₫ối tượng //ReadObject(); } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 44 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng //hàm xây dựng hệ thống ₫ối tượng ghi lên file public static void Create_SaveObject() { //khở tạo ₫ối tượng b theo hình silde 24 B b = new B(); b.init(2,2.345); b.Setba(1,1.234,b); b.Setpba(3,3.1416,b); b.Setpba1(4,4.567,b); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 45 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng //ghi ₫ối tượng b dùng kỹ thuật Serialization try { //1 ₫ịnh nghĩa ₫ối tượng FileStream miêu tả file chứa kết FileStream fs = new FileStream("c:\\data.obj", FileMode.Create); //2 tạo ₫ối tượng BinaryFormatter phục vụ ghi ₫ối tượng BinaryFormatter formatter = new BinaryFormatter(); //3 gọi tác vụ Serialize formatter ₫ể ghi ₫ối tượng formatter.Serialize(fs,b); //4 ₫óng file lại fs.Flush(); fs.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 46 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng //hàm ₫ọc ₫ối tượng b dùng kỹ thuật Serialization public static void ReadObject() { try { //1 ₫ịnh nghĩa ₫ối tượng FileStream miêu tả file chứa liệu ₫ã có FileStream fs = new FileStream("c:\\data.obj", FileMode.Open); //2 tạo ₫ối tượng BinaryFormatter phục vụ ₫ọc ₫ối tượng BinaryFormatter formatter = new BinaryFormatter(); //3 gọi tác vụ Deserialize ₫ể ₫ọc ₫ối tượng từ file vào B b = (B) formatter.Deserialize(fs); //4 ₫óng file lại fs.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } //hết hàm Main } //hết class program Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 47 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng Ấn phải chuột vào phần tử gốc Project cửa sổ Solution Explorer, chọn option Add.Class, ₫ặt tên A.cs ₫ể tạo file ₫ặc tả class A Khi cửa sổ hiển thị mã nguồn class A hiển thị, ₫ặc tả class A ₫oạn code ₫ây : //thêm lệnh using sau ₫ầu file using System.Runtime.Serialization; namespace WRObject { [Serializable] public class A { //₫ịnh nghĩa thuộc tính liệu private int intA1; private double dblA2; private B pab; Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 48 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng //₫ịnh nghĩa tác vụ public A() {} public void init(int a1, double a2, B p) { this.intA1 = a1; this.dblA2 = a2; this.pab = p; } } } Ấn phải chuột vào phần tử gốc Project cửa sổ Solution Explorer, chọn option Add.Class, ₫ặt tên B.cs ₫ể tạo file ₫ặc tả class B Khi cửa sổ hiển thị mã nguồn class B hiển thị, ₫ặc tả class B ₫oạn code ₫ây : Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 49 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng //thêm lệnh using sau ₫ầu file using System.Runtime.Serialization; namespace WRObject { [Serializable] public class B { //₫ịnh nghĩa thuộc tính liệu private int intB1; private double dblB2; private A ba; private A pba; private A pba1; //₫ịnh nghĩa tác vụ public B() { } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 50 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng public void init(int b1, double b2) { this.intB1 = b1; this.dblB2 = b2; ba = new A(); pba = new A(); pba1 = new A(); } public void Setba (int a1, double a2, B b) { this.ba.init (a1,a2,b); } public void Setpba (int a1, double a2, B b) { this.pba.init (a1,a2,b); } public void Setpba1 (int a1, double a2, B b) { this.pba1.init (a1,a2,b); } } //hết class B } //hết namespace WRObject Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 51 8.8 Thí dụ ₫ọc/ghi hệ thống ₫ối tượng Chọn menu Debug.Start Debugging ₫ể dịch chạy ứng dụng Hệ thống ₫ối tượng ₫ược tạo lưu lên file c:\data.obj Hiển thị cửa sổ soạn mã nguồn file Program.cs, thích lệnh gọi Create_SaveObject(); bỏ thích lệnh gọi ReadObject(); Dời chuột lệnh "B b = (B) formatter.Deserialize(fs);" hàm ReadObject(), click chuột vào lệnh trái lệnh ₫ể thiết lập ₫iểm dừng Chọn menu Debug.Start Debugging ₫ể dịch chạy ứng dụng Ứng dụng dừng lệnh dừng Dời chuột biến b, ta thấy cửa sổ hiển thị giá trị biến lúc null Ấn F10 ₫ể thực ₫úng lệnh dừng lại, dời chuột biến b, mở rộng phân cấp miêu tả nội dung biến b thấy chứa ₫úng thơng tin slide 14, nghĩa chương trình ₫ã ₫ọc ₫ược toàn hệ thống ₫ối tượng ₫ã lưu giữ trước ₫ây Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 52 8.9 Kết chương Chương ₫ã giới thiệu ₫ối tượng phục vụ ghi/₫ọc liệu ra/vào file tác vụ ghi/₫ọc liệu cổ ₫iển ra/vào file Chương ₫ã giới thiệu ₫ối tượng phục vụ ghi/₫ọc hệ thống ₫ối tượng ra/vào file tác vụ ghi/₫ọc hệ thống ₫ối tượng có mối quan hệ tham khảo phức tạp ra/vào file Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Mơn : Lập trình hướng ₫ối tượng Chương : Ghi/₫ọc liệu ứng dụng C# file Slide 53