Khi một luồng được thiết lập và chỉ đến một tập tin, chúng ta có thể viết vào trong
luồng và
nó sẽ được viết vào tập tin:
myFile.WriteLine(“Khong co viec gi kho”);
Dòng lệnh trên viết một chuỗi vào trong tập tin, việc viết này giống như là viết ra
màn hình console. Nhưng ở đây là được viết ra thiết bị khác, tức là ra tập tin. Sau khi
thực hiện toàn bộ công việc, cần thiết phải đóng luồng lại bằng cách gọ
i phương thức
Close.
Đọc tập tin văn bản
Đọc dữ liệu từ tập tin văn bản cũng tương tự như việc viết thông tin vào nó. Ví dụ
minh họa tiếp sau đây thực hiện việc đọc tập tin mà chúng ta đã tạo ra từ chương trình
minh họa
12.7 trước. Đây là chương trình đọc tập tin văn bản.
Ví dụ 12.8: Đọc một tập tin văn bản.
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
{
string buffer;
StreamReader myFile = File.OpenText( args[0]);
while ( (buffer = myFile.ReadLine()) !=null)
{
Console.WriteLine(buffer
);
}
myFile.Close();
}
}
}
}
Nếu chúng ta nhập đúng tên của tập tin vừa tạo trong ví dụ trước thì kết quả chương
trình thực hiện như sau:
Kết quả:
Khong co viec gi kho
Chi so long khong ben
Dao nui va lap bien
Quyet chi at lam nen
0 1 2 3 4 5 6 7 8 9
Nếu chương trình được cung cấp đầy đủ tên tập tin thì nó sẽ bắt đầu thực hiện việc đọc
thông
tin. Đầu tiên là khai báo một chuỗi dùng làm chỗ lưu thông tin đọc tử tập tin ra. Để mở
tập tin văn bản thì phương thức OpenText được gọi. Phương thức này được truyền vào
tên của tập
tin văn bản cần mở. Một lần nữa một luồng tên myFile được tạo ra gắn với tập tin
đã cho, luồng này có kiểu là StreamReader. Phương thức ReadLine() của myFile thực
hiện việc đọc từng dòng trong tập tin và sau đó được xuất ra màn hình console. Việc
đọc này kết hợp với việc ki
ểm tra là đã đọc đến cuối tập tin chưa, nếu đọc đến cuối
tập tin, tức là hàm ReadLine() trả về chuỗi rỗng, lúc này chương trình sẽ kết thúc
việc đọc. Cuối cùng hàm Close được gọi để đóng tập tin lại, và chương trình chấm
dứt.
Trong chương trình này cũng không xử lý ngoại lệ, nếu tập tin không tồn tại chương
trình sẽ phát sinh ra ngoại lệ và ngoại lệ này không được x
ử lý. Đề nghị người đọc
nên đưa vào các đoạn xử lý ngoại lệ tương tự như ví dụ 12.6
Viết thông tin nhị phân vào tập tin
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);
f
o
r
(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ương trì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ị Định nghĩa
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ó.
Bảng 12.4: Giá trị của FileMode.
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ở.
Đọc thông tin nhị phân từ tập tin
Trong phầ
n trước chúng ta đã thực hiện việc viết thông tin nhị phân vào trong tập
tin, và bây giờ chúng ta mong muốn được đọc các thông tin đã ghi vào trong tập tin.
Việc đọc thông
tin cũng khá đơn giản như là việc viết vào. Chương trình 12.10 sau minh họa cho công
việc
này.
Ví dụ 12.10: Đọc thông tin nhị phân.
// BinaryRead.cs: Doc thong tin tu file nhi
phan namespace Programming_CSharp
{
using System;
using System.IO;
public class
Tester
{
public static void Main( String[] args)
{
if ( args.Length < 1)
{
}
else
{
Console.WriteLine(“Phai nhap ten tap tin”);
FileStream myFile = new FileStream( args[0],
FileMode.Open); BinaryReader brFile = new
BinaryReader(myFile);
// đọc dữ liệu
Console.WriteLine(“Dang doc tap tin ”);
while (brFile.PeekChar() != -1)
{
Console.Write(“<{0}>”, brFile.ReadInt32());
}
Console.WriteLine(“ Doc xong”);
brFile.Close();
myFile.Close();
}
}
}
}
. 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. dung của nó.
Bảng 12 .4: Giá trị của FileMode.
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