Hãy giới thiệu ngắn gọn về dòng chảy io.
Trước đây tôi đã viết hai bài viết bằng ngôn ngữ Java và giới thiệu ngắn gọn về luồng io. Đây là bản tóm tắt về luồng io.
https://www.cnblogs.com/aoximin/p/12007925.html 。
https://www.cnblogs.com/aoximin/p/12044270.html 。
Đây là một kinh nghiệm, chỉ dành cho người mới bắt đầu.
Khi bạn viết mã lần đầu tiên để đọc hoặc ghi luồng io, bạn phải suy nghĩ về cách đọc luồng io từ đĩa hoặc đọc từ bộ nhớ.
Ý tưởng này đúng, nhưng nó không phải là thứ cần xem xét ở cấp độ ứng dụng. Nó là sự kết hợp giữa hệ điều hành và phần cứng (chương hệ điều hành sẽ giới thiệu một cách toàn diện), sẽ làm phức tạp bộ não con người. ở cấp độ ứng dụng dưới đây.
Có một số khái niệm bạn phải biết trong io flow:
-
luồng ký tự.
-
luồng byte.
-
luồng nút.
-
Dòng chảy quá trình.
Nếu bạn chưa rõ về những khái niệm này thì bạn cần đọc bài viết này và nhớ lại những điều cơ bản trước đó.
Ví dụ: trong Java, việc đọc tệp được chia thành FileInputStream và FileOutputStream.
Nhưng trong C#, nó được thiết kế như thế này. Luồng tệp là luồng tệp và đầu vào và đầu ra không được tách biệt.
Nhưng nói chung, chúng ta đọc hoặc viết nên độ phức tạp thấp hơn.
Ví dụ: nếu chúng ta tạo một luồng tệp
FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
Có một số tham số ở đây, cụ thể là: địa chỉ, FileMode, FileAccess, FileShare.
Vì vậy, chúng ta hãy xem có gì trong FileMode.
public enum FileMode { CreateNew = 1, Create = 2, Open = 3, OpenOrCreate = 4, Truncate = 5, Append = 6, }
Bạn có thể tham khảo trực tiếp tài liệu này
https://learn.microsoft.com/zh-cn/dotnet/api/system.io.filemode?view=net-7.0 。
Mô tả trong tài liệu tương đối rõ ràng nên tôi sẽ không đi sâu vào chi tiết.
FileAccess Tham số thứ hai là FileAccess.
[Cờ] public enum FileAccess { Đọc = 1, Ghi = 2, ReadWrite = Ghi | Đọc, // 0x00000003 }
Quyền được đọc, viết hoặc đọc và viết.
Tham số thứ tư là FileShare:
https://learn.microsoft.com/zh-cn/dotnet/api/system.io.fileshare?view=net-7.0 。
Đó là một số trạng thái được chia sẻ, chẳng hạn như tệp của tôi đang được đọc và liệu các tệp khác có thể được đọc hay không.
Điều này có thể được xử lý theo nhu cầu ứng dụng của riêng bạn.
Sau đó, chúng ta thường sử dụng một phương thức có tên File.create để tạo luồng tệp.
Sau đó, trạng thái mặc định của nó là
public static FileStream Create(string path, int bufferSize) => new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None, bufferSize);
Vì vậy, điều chúng ta cần biết ở đây là nếu chúng ta sử dụng FileStream thì chúng ta sẽ nhận được từ File.create.
Nếu tệp đã tồn tại thì tệp sẽ được ghi lại từ đầu. Đây là điều mà người mới sử dụng nên chú ý.
Sau khi biết những khái niệm cơ bản này, bạn có thể tiến xa hơn.
Chúng ta trở nên hướng đối tượng ở cấp độ ứng dụng, vậy chúng ta phải làm gì?
Những gì chúng ta cần làm là trừu tượng hóa tập tin này thành một đối tượng.
Vậy chúng ta có thể sử dụng phương pháp nào trong lập trình để trừu tượng hóa nó thành một đối tượng?
static void Main(string[] args) { FileInfo a = new FileInfo("a.txt"); Console.ReadKey(); }
Có một FileInfo để chúng tôi sử dụng để có thể ánh xạ tệp vào một đối tượng.
Với FileInfo chúng ta có thể có được thông tin trên.
Bạn cũng có thể thao tác trên các tập tin
Ví dụ:
Chúng được sử dụng để vận hành các tập tin, vì vậy có một câu hỏi, đó là làm thế nào để vận hành các thư mục?
Thông tin thư mục a = new Thông tin thư mục("c://a");
Thư mục có thông tin thư mục.
Điều đáng chú ý ở đây là một số ý tưởng đã trở thành ngôn ngữ lập trình là chuyển đổi thư mục thành tệp, sau đó tạo thư mục trong đối tượng tệp.
Sẽ thật tốt nếu chúng ta hiểu được suy nghĩ của các ngôn ngữ lập trình khi viết code.
Các đơn vị dữ liệu vận hành được chia thành:
-
luồng byte.
-
luồng ký tự.
Luồng byte - Nó bao gồm Luồng, FileStream, MemoryStream và BufferedStream.
Luồng ký tự - Nó bao gồm TextReader-TextWriter, StreamReader, StreamWriter và các luồng khác.
Hướng dòng chảy của dòng chảy được chia thành:
-
luồng đầu vào.
-
luồng đầu ra.
Các vai trò khác nhau thông qua quy trình được chia thành:
-
luồng nút.
-
Xử lý luồng/gói luồng.
Điều này sẽ được giới thiệu dưới đây.
Hãy giới thiệu ngắn gọn về dòng ký tự Có một vấn đề ở đây.
Chúng ta đều biết rằng đơn vị lưu trữ tệp nhỏ nhất là byte.
Tôi chưa bao giờ nghe nói về nó, một tập tin lưu trữ một bit. Byte là đơn vị lưu trữ nhỏ nhất.
Sau đó, có một vấn đề, ví dụ, trong io của chúng tôi, đơn vị hợp lệ nhỏ nhất cũng phải là byte.
Byte cũng được truyền đi, phải không? Dựa trên lý thuyết này, luồng byte của chúng ta là hợp lý.
Đây là ý nghĩa của mức độ truyền tải.
Vậy tại sao lại có dòng ký tự? Bởi vì chúng tôi nhận thấy rằng các định dạng ký tự bao gồm utf-8, ASCII, v.v.
Ví dụ: trong UTF-8, ký tự tiếng Trung là 3 byte. Ví dụ, đối với tôi, việc đọc 3 byte thay vì một byte là hợp lý phải không?
Sau đó là dòng chảy nhân vật. Luồng byte đọc một byte mỗi lần và luồng ký tự có thể đọc một byte, hai hoặc ba byte mỗi lần, tùy thuộc vào dạng mã hóa.
static void Main(string[] args) { TextReader textReader = new StreamReader("a.txt", Mã hóa.ASCII); Console.ReadKey(); }
StreamReader là một luồng ký tự tệp. TextReader là lớp cơ sở của nó.
Lớp cơ sở để đọc tất cả các dòng ký tự là TextReader.
StreamReader đọc và ghi luồng ký tự của tệp, trong khi StringReader đọc và ghi bộ nhớ.
Tôi sẽ không trình bày phần còn lại, chỉ giúp bạn làm quen với tài liệu C# chính thức chuyên nghiệp hơn.
Chỉ cần đọc tài liệu
https://learn.microsoft.com/zh-cn/dotnet/api/system.io.stringreader?view=net-7.0 。
Luồng nút là gì:
Các luồng nút đọc và ghi dữ liệu từ một nguồn dữ liệu cụ thể, chẳng hạn như: StreamReader, FileStream.
Nó có nghĩa là đọc và ghi trực tiếp từ nguồn dữ liệu.
Vậy quy trình xử lý là gì?
Các luồng xử lý còn được gọi là các luồng bao bọc, được kết nối với các luồng hiện có để cung cấp cho các chương trình chức năng đọc và ghi mạnh mẽ hơn, chẳng hạn như BufferedStream.
static void Main(string[] args) { var a= File.Create("a.txt"); BufferedStream stream = new BufferedStream(a); Console.ReadKey(); }
Luồng xử lý nhị phân giống như thế này. Nó thực sự rất giống với luồng ký tự.
Ví dụ, ngoài việc lưu trữ ký tự, chúng ta còn có thể lưu trữ số phải không?
Bạn cũng có thể lưu trữ các loại bool.
Vì vậy, trên thực tế, nếu bạn đọc int, bạn đọc 4 byte và khi bạn đọc bool, bạn đọc 2 byte.
static void Main(string[] args) { MemoryStream aStream = new MemoryStream(); BinaryWriter writer = new BinaryWriter(aStream); writer.Write(10); writer.Write(20); Console.Read(); }
Điều này cũng đúng khi đọc.
Không có gì phải nhớ. Chủ yếu là sắp xếp một số khái niệm và nguyên tắc thực hiện. Chỉ cần biết cách kiểm tra tài liệu.
Cuối cùng, bài viết về chuỗi học lại c# - IO flow [34] kết thúc tại đây. Nếu bạn muốn biết thêm về loạt bài học lại c# - IO flow [34], vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!