Viết thông tin nhị phân vào tập tin trong csharp

c-sharp

(Phạm Quyết Nghị) #1

Nếu chúng ta sử dụng một tập tin văn bản, thì khi chúng ta lưu dữ liệu kiểu số thì phải thực hiện việc chuyển đổi sang dạng chuỗi ký tự để lưu vào trong tập tin văn bản và khi lấy ra ta cũng lấy được giá trị chuỗi ký tự do đó ta phải chuyển sang dạng số. Đôi khi chúng ta muốn có cách thức nào đó tốt hơn để lưu trực tiếp giá trị vào trong tập tin và sau đó đọc trực tiếp giá trị ra từ tập tin. Ví dụ khi viết một số lượng lớn các số integer vào trong tập tin như là những số nguyên, thì khi đó ta có thể đọc các giá trị này ra như là số integer. Trường hợp nếu chúng được viết vào tập tin với dạng văn bản, thì khi đọc ra ta phải đọc ra văn bản và phải chuyển mỗi giá trị từ một chuỗi đến các số integer. Tốt hơn việc phải thực hiện thêm các bước chuyển đổi, ta có thể gắn một kiểu luồng nhị phân BinaryStream vào trong một tập tin, rồi sau đó đọc và ghi thông tin nhị phân từ luồng này.

Tiếp theo ta sẽ xem một ví dụ minh họa việc đọc viết dữ liệu nhị phân vào một tập tin. Mặc dù trong chương trình này thực hiện việc viết 100 giá trị integer vào trong một tập tin nhưng có thể dễ dàng viết bất cứ kiểu dữ liệu nào khác.

Ghi chú: Thông tin nhị phân là thông tin đã được định dạng kiểu lưu trữ dữ liệu.

Ví dụ 12.9: Viết vào một tập tin nhị phân.

//binarywriter.cs
using System;
using System.IO;
namespace Programming_CSharp
{
	public class Tester
	{
		public static void Main(string[] args)
		{
			if ( args.Length < 1)
			{
				Console.WriteLine(“Phai nhap ten tap tin!”);
			}
			else
			{
				FileStream myFile = new FileStream( args[0], FileMode.CreateNew);
				BinaryWriter bwFile = new BinaryWriter(myFile);
				
				for (int i=0; i < 100; i++)
				{
					bwFile.Write(i);
				}
				
				bwFile.Close();
				myFile.Close();
			}
		}
	}
}

Cũng tương tự như các ví dụ trên thì tên tập tin được đưa vào tham số dòng lệnh. Nếu chươngtrình được nhập các tham số đầy đủ, chương trình sẽ thực hiện việc viết thông tin nhị phân vào trong tập tin, và không có output ra màn hình console. Nếu chúng ta mở tập tin và xem thì chỉ thấy các ký tự mở rộng đựơc thể hiện, sẽ không thấy những số đọc được.

Trong chương trình này cũng chưa thực hiện việc xử lý các ngoại lệ. Nếu thực hiện việc viết thông tin vào một tập tin đã hiện hữu, thì một ngoại lệ sẽ được phát sinh khi thực hiện lệnh:

FileStream myFile = new FileStream( args[0], FileMode.CreateNew);

Trong chương trình 12.9 này thực hiện việc tạo và mở tập tin khác với việc mở tập tin văn bản. Lệnh trên tạo một đối tượng FileStream gọi là myFile. Luồng này được gắn với tập tin thông qua bộ khởi dựng. Tham số đầu tiên của bộ khởi dựng là tên của tập tin mà chúng ta tạo (args[0]), tham số thứ hai là mode mà chúng ta mở. Tham số này là giá trị kiểu liệt kê FileMode, trong chương trình thì do chúng ta thực hiện việc tạo mới để ghi nên sử dụng giá trị FileMode.CreateNew. Bảng 12.3 sau liệt kê những mode giá trị khác trong kiểu liệt kê FileMode.

Giá trị của FileMode.

Append
Mở một tập tin hiện hữu hoặc tạo một tập tin mới

Create
Tạo một tập tin mới. Nếu một tập tin đã hiện hữu, nó sẽ bị xóa và một tập tin mới sẽ được tạo ra với cùng tên.

CreateNew
Tạo một tập tin mới. Nếu một tập tin đã tồn tại thì một ngoại lệ sẽ được phát sinh.

Open
Mở tập tin hiện hữu.

OpenOrCreate
Mở tập tin hay tạo tập tin mới nếu tập tin chưa tồn tại

Truncate
Mở một tập tin hiện hữu và xóa nội dung của nó.

Sau khi tạo ra FileStream, chúng ta cần thiết phải thiết lập để nó làm việc với dữ liệu nhị phân. Dòng lệnh tiếp theo:

BinaryWriter bwFile = new BinaryWriter(myFile);

Dòng này thiết lập một kiểu viết dữ liệu nhị phân vào trong luồng bằng cách khai báo kiểu BinaryWrite. Đối tượng thể hiện của BinaryWrite là bwFile được tạo ra. myFile được truyền vào bộ khởi dựng BinaryWrite, nó sẽ gắn bwFile với myFile.

for (int i=0; i < 100; i++)
{
	bwFile.Write(i);
}

Vòng lặp này thực hiện việc viết trực tiếp giá trị integer vào trong BinaryWrite bwFile bằng cách sử dụng phương thức Write. Dữ liệu được viết có thể là kiểu dữ liệu đặc biệt khác. Trong chương trình này thì sử dụng giá trị integer. Khi thực hiện xong các công việc viết vào tập tin, chúng ta cần thiết phải đóng luồng mà chúng tả đã mở.


89% Thành viên có cách giải cho một câu hỏi. Bạn thì sao?