Đọc và ghi dữ liệu
Stream hỗ trợ đọc và ghi dữ liệu đồng bộ và không đồng bộ. .Net Framework cung cấp một số lớp dẫn xuất từ lớp Stream, bao gồm cả FileStream, MemoryStream, và NetworkStream. Có một lớp BufferedStream cung cấp một vùng đệm I/O và có thể sử dụng cho bất kỳ ...
Stream hỗ trợ đọc và ghi dữ liệu đồng bộ và không đồng bộ. .Net Framework cung cấp một số lớp dẫn xuất từ lớp Stream, bao gồm cả FileStream, MemoryStream, và NetworkStream. Có một lớp BufferedStream cung cấp một vùng đệm I/O và có thể sử dụng cho bất kỳ luồng nhập xuất nào.
Sau đây là những lớp I/O chính của .Net Framework
Lớp | Cách sử dụng |
Stream | Abstract class that supports reading and writing bytes. |
BinaryReader/BinaryWriter | Read and write encoded strings and primitive datatypes to and from streams. |
File, FileInfo, Directory, DirectoryInfo | Provide implementations for the abstract FileSystemInfo classes, including creating, moving, renaming, and deleting files and directories. |
FileStream | For reading to and from File objects; supports random access to files. Opens files synchronously by default; supports asynchronous file access. |
Textreader,TextWriter, StringReader, StringWriter | TexTReader and TextWriter are abstract classes designed for Unicode character I/O. StringReader and StringWriter write to and from strings, allowing your input and output to be either a stream or a string. |
BufferedStream | A stream that adds buffering to another stream such as a NetworkStream. BufferedStreams can improve performance of the stream to which they are attached, but note that FileStream has buffering built in. |
MemoryStream | A nonbuffered stream whose encapsulated data is directly accessible in memory, and is most useful as a temporary buffer. |
NetworkStream | A stream over a network connection. |
StreamReader | Implements a TextReader that reads characters from a byte stream in a particular encoding |
StreamWriter | Implements a TextWriter for writing information to a string. The information is stored in an underlying StringBuilder. |
Để đọc/ghi dữ liệu vào tệp văn bản .Net Framework cung cấp cho ta hai lớp rất dễ sử dụng đó là lớp StreamWriter và StreamReader có chừa các phương thức để giúp ta rất dễ dàng thao tác trên tệp văn bản giống như ta thao tác với việc đọc ghi dữ liệu trên mà hình, bàn phím..
Ví dụ 1: Nhập vào từ bàn phím nội dung một bài thơ và ghi nó vào một tệp văn bản
using System;
using System.IO;
class ViDu
{
static void Main()
{
string fileName;
string cauTho;
string tenBaiTho;
bool ok;
ConsoleKeyInfo kt;
do{
Console.Write("Nhap vao ten tep chua bai tho:");
fileName = Console.ReadLine();
ok = false;
if(File.Exists(fileName))
{
Console.WriteLine("Tep nay da ton tai ban co muon ghi de C/K?");
kt=Console.ReadKey();
if (kt.KeyChar == 'c' || kt.KeyChar == 'C') ok = false;
else ok = true;
}
}while(ok);
StreamWriter myfile=File.CreateText(fileName);
Console.WriteLine(" BAN HAY NHAP VAO MOT BAI THO BAN YEU THICH ");
Console.Write("Nhap vao ten bai tho:");tenBaiTho = Console.ReadLine();
myfile.WriteLine(" {0}", tenBaiTho);
myfile.WriteLine();
int i=0;
do
{
Console.Write("Cau {0}:", ++i);
cauTho = Console.ReadLine();
myfile.WriteLine("{0}:{1}",i,cauTho);
Console.WriteLine("Ban co muon nhap tiep C/K");
kt = Console.ReadKey();
} while (kt.KeyChar == 'c' || kt.KeyChar == 'C');
myfile.Close();
}
}
Ví dụ 2: Cho một tệp văn bản có tên là D:/tho.txt hãy đọc nội dung tệp và đưa ra màn hình
using System;
using System.IO;
class Test
{
public static void Main()
{
try
{
using (StreamReader sr = new StreamReader("d:/tho.txt"))
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
catch (Exception e)
{
Console.WriteLine("Khong the doc duoc noi dung tep");
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
}
Ví dụ 3: Cho một tệp có tên là d:dulieu.txt lưu trữ thông tin về n dãy số. Biết rằng các phần tử của mỗi dãy được lưu trên một dòng, giữa các phần tử của dãy đặt cách nhau ít nhất một dấu cách . Hãy đọc nôi dung tệp và tìm giá trị lớn nhất trong số các phần tử của các dẫy và ghi giá trị này vào cuối tệp
using System;
using System.IO;
class ViDu1
{
static void Main()
{
string xau;
int[][] a=new int[50][];
int d,n=0;
StreamReader f1=File.OpenText("D:/dulieu.txt");
xau = f1.ReadLine();
do{
d = 0;
foreach(string con in xau.Split(' '))
if (con.Length > 0)
{
Array.Resize(ref a[n], ++d);
a[n][d - 1] = int.Parse(con);
}
xau = f1.ReadLine();
n = n + 1;
}while(xau!=null);
f1.Close();
int j,i,max=a[0][0];
for (i = 0; i < n; ++i)
for (j = 0; j < a[i].Length; ++j)
if (max < a[i][j]) max = a[i][j];
StreamWriter f2 = File.AppendText("D:/dulieu.txt");
f2.WriteLine();
f2.WriteLine("Phan tu lon nhat cua cac day la {0}", max);
f2.Close();
}
}
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.
Ví dụ 1: Nhập vào một dãy số nguyên sau đó ghi vào tệp với tên tệp là D:/dayso.dat
using System;
using System.IO;
class TepNhiPhan
{
static void Main()
{
FileStrean file =new FileStream("D:/Dayso.dat", FileMode.Create);
BinaryWriter myfile =new BinaryWriter(file);
int i=0, x;
ConsoleKeyInfo kt;
Console.WriteLine("Ban hay nhap vao day cac so nguyen");
do
{
Console.Write("Ban hay nhap so nguyen thu {0}:", i++);
x = int.Parse(Console.ReadLine());
myfile.Write(x);
Console.Write("Ban co nhap tiep C/K"); kt = Console.ReadKey();
if (kt.KeyChar == 'K' || kt.KeyChar== 'k') break;
} while (true);
myfile.Close();
Console.WriteLine("Da thuc hien xong!! Ban hay an phim bat ky de tiep tuc"); Console.ReadKey();
}
}
Để thao tác với tệp nhị phân trước tiên chúng ta tạo một thể hiện file của lớp FileStream bằng câu lệnh
FileStrean file =new FileStream("D:/Dayso.dat", FileMode.Create);
Đối đầu tiên là đường dẫn của tệp, đối thứ 2 là các mode khác nhau trong kiểu liệt kê FileMode cụ thể như sau:
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ộtngoạ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 bằng câu lệnh: 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à myfile được tạo ra. file được truyền vào bộ khởi dựng BinaryWrite, nó sẽ gắn myfile với file.
Ví dụ 2: Đọc nội dung tệp D:/dayso.dat đã nhập ở ví dụ trên sau đó cho biết số nguyên lớn nhất có ở trong tệp số nguyên ấy.
using System;
using System.IO;
class ViDuTepNhiPhan
{
static void Main()
{
FileStream file = new FileStream("D:/Dayso.dat", FileMode.Open);
BinaryReader myfile = new BinaryReader(file);
int x, max;
max = myfile.ReadInt32();
while (myfile.PeekChar() != -1)
{
x = myfile.ReadInt32();
if (x > max) max = x;
}
Console.WriteLine("So nguyen lon nhat o trong tep la " + max);
myfile.Close();
Console.Write("An phim bat ky de tiep tuc..."); Console.ReadKey();
}
}
Ở đây có một vài sự khác nhỏ, phương thức PeekChar của lớp BinaryReader được sử dụng. Phương thức này sẽ lấy ký tự kế tiếp trong luồng. Nếu ký tự kế tiếp là cuối tập tin thì giá trị -1 được trả về. Ngược lại, thì ký tự kế tiếp được trả về Khi ký tự kế tiếp không phải ký tự cuối tập tin thì lệnh bên trong vòng lặp sẽ đọc một số integer từ đối tượng BinaryStream myfile. Phương thức được sử dụng để đọc một số nguyên là ReadInt32, chúng ta sử dụng kiểu tên của Framework tốt hơn là kiểu do C# đưa ra. Nên nhớ rằng, tất cả những lớp từ Framework điều được gọi bởi ngôn ngữ C# và chúng không phải là một bộ phận của ngôn ngữ C#.
Những lớp này còn được sử dụng tốt bởi những ngôn ngữ khác C#.
Ngoài ra lớp BinaryReader còn có những phương thức khác để thực hiện việc đọc các kiểu dữ liệu khác nhau. Những phương thức đọc này được sử dụng cùng với cách mà ReadInt32 được sử dụng trong chương trình. Bảng sau liệt kê một số phương thức dùng để đọc các kiểu dữ liệu.