Đọc nội dung của tệp vào bộ nhớ là một nhiệm vụ lập trình rất phổ biến và cũng như nhiều thứ khác, Node. js core API cung cấp các phương thức để thực hiện điều này tầm thường. Có nhiều phương thức hệ thống tệp, tất cả đều có trong mô-đun
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
7. Cách dễ nhất để đọc toàn bộ nội dung của tệp là với fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
8, như saufs = require['fs'];
fs.readFile[file, [encoding], [callback]];
// file = [string] filepath of the file to read
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
9 là tham số tùy chọn chỉ định loại mã hóa để đọc tệp. Các mã hóa có thể là fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
0, fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
1 và fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
2. Nếu không cung cấp mã hóa, giá trị mặc định là fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
0fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
1 là một chức năng để gọi khi tệp đã được đọc và nội dung đã sẵn sàng - nó được truyền hai đối số, fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
2 và fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
3. Nếu không có lỗi, fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
2 sẽ là fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
0 và fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
3 sẽ chứa nội dung tệp; Vì vậy, nếu chúng tôi muốn đọc
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
8 và in nó ra thiết bị xuất chuẩn [giống như Unix fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
9]fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
Giờ đây, nội dung của
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
8 sẽ hiển thị với bạn, miễn là bạn có quyền đọc tệp ngay từ đầuBây giờ chúng ta hãy xem một ví dụ về điều gì sẽ xảy ra khi bạn cố đọc một tệp không hợp lệ - ví dụ đơn giản nhất là một tệp không tồn tại
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
3Đây là đầu ra
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
4Đây là một nút cơ bản. js Đối tượng lỗi - thường có thể hữu ích khi ghi nhật ký trực tiếp
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
31, vì đối tượng này chứa dấu vết ngăn xếp đến vị trí trong mã mà tại đó đối tượng Lỗi được tạo Một trong những điều phổ biến nhất bạn muốn làm với bất kỳ ngôn ngữ lập trình nào là mở và đọc một tệp. Với hầu hết các ngôn ngữ, điều này khá đơn giản, nhưng đối với các cựu chiến binh JavaScript thì có vẻ hơi lạ. Trong nhiều năm, JavaScript chỉ khả dụng trong trình duyệt, vì vậy các nhà phát triển front-end có thể chỉ quen thuộc với API FileReader hoặc tương tự
Nút. js, như bạn có thể biết, khác nhiều so với JavaScript điển hình của bạn trong trình duyệt. Nó có bộ thư viện riêng để xử lý các tác vụ của hệ điều hành và hệ thống tệp, như mở và đọc tệp. Trong bài viết này tôi sẽ chỉ cho bạn cách sử dụng Node. js để đọc tệp. Cụ thể, chúng tôi sẽ sử dụng mô-đun fs để làm điều đó
Có hai cách để bạn có thể mở và đọc tệp bằng mô-đun
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
7- Tải tất cả nội dung cùng một lúc [đệm]
- Tăng dần nội dung tải [truyền phát]
Mỗi phương pháp này sẽ được giải thích trong hai phần tiếp theo
Nội dung đệm với fs. Đọc tài liệu
Đây là cách phổ biến nhất để đọc tệp bằng Node. js, đặc biệt dành cho người mới bắt đầu, do tính đơn giản và tiện lợi của nó. Mặc dù, như bạn sẽ nhận ra trong phần tiếp theo, nó không nhất thiết là tốt nhất hoặc hiệu quả nhất.
Đây là một ví dụ nhanh sử dụng fs. Đọc tài liệu
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
6Đối số
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
4 cho cuộc gọi lại chứa toàn bộ nội dung của tệp được biểu thị dưới dạng chuỗi ở định dạng fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
1. Nếu bạn bỏ qua hoàn toàn đối số fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
1, thì phương thức sẽ chỉ trả về nội dung thô trong đối tượng Bộ đệm. Loại bỏ đối số fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
1 trong đoạn mã trên [và giả sử my-file. txt chứa chuỗi "Xin chào. "], chúng tôi sẽ nhận được kết quả nàyfs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
7Bạn có thể nhận thấy rằng
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
70 trả về nội dung trong một cuộc gọi lại, điều đó có nghĩa là phương thức này chạy không đồng bộ. Điều này nên được sử dụng bất cứ khi nào có thể để tránh chặn luồng thực thi chính, nhưng đôi khi bạn phải thực hiện mọi thứ một cách đồng bộ, trong trường hợp đó, Node cung cấp cho bạn phương thức readFileSyncPhương thức này hoạt động chính xác theo cùng một cách, ngoại trừ nội dung tệp được trả về trực tiếp từ lời gọi hàm và luồng thực thi bị chặn trong khi nó tải tệp. Tôi thường sử dụng điều này trong các phần khởi động của chương trình của mình [chẳng hạn như khi chúng tôi đang tải tệp cấu hình] hoặc trong các ứng dụng dòng lệnh mà việc chặn luồng chính không phải là vấn đề lớn
Đây là cách tải tệp đồng bộ với Node
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
9Lưu ý rằng với cuộc gọi chặn [đồng bộ], chúng tôi phải sử dụng
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
71 để xử lý bất kỳ lỗi nào, không giống như phiên bản không chặn [không đồng bộ] trong đó các lỗi chỉ được chuyển cho chúng tôi dưới dạng đối sốKhác với cách các phương thức này trả về dữ liệu và xử lý lỗi, chúng hoạt động rất giống nhau
Truyền phát nội dung với fs. tạoReadStream
Cách thứ hai để mở và đọc tệp là mở tệp đó dưới dạng Luồng bằng lệnh fs. phương thức createReadStream. Tất cả các luồng Node là phiên bản của đối tượng EventEmitter, cho phép bạn đăng ký các sự kiện quan trọng
Một đối tượng luồng có thể đọc được có thể hữu ích vì nhiều lý do, một vài trong số đó bao gồm
- Dung lượng bộ nhớ nhỏ hơn. Vì dữ liệu của tệp đích được tải theo khối nên không cần nhiều bộ nhớ để lưu trữ dữ liệu trong bộ đệm
- Thời gian đáp ứng nhanh hơn. Đối với các ứng dụng nhạy cảm với thời gian, thời gian giữa yêu cầu và phản hồi là rất quan trọng. Các luồng cắt giảm thời gian phản hồi [đặc biệt đối với các tệp lớn] vì chúng không cần đợi tải toàn bộ tệp trước khi trả về dữ liệu
- dữ liệu đường ống. Sự trừu tượng hóa luồng cho phép bạn sử dụng giao diện chung giữa nhà sản xuất dữ liệu và người tiêu dùng để truyền dữ liệu đó qua đường ống. Điều này rất giống với khái niệm ống Unix
Mặc dù thực sự không khó để sử dụng các luồng, nhưng chúng có thể hơi đáng sợ và không hoàn toàn trực quan như phương pháp
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
70. Đây là 'thế giới xin chào' của truyền phát tệpfs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
2Mã này thực hiện chính xác những gì mã trong phần đầu tiên thực hiện, ngoại trừ việc chúng tôi phải "thu thập" các khối dữ liệu trước khi in ra bảng điều khiển. Nếu tệp của bạn khá nhỏ thì có thể bạn sẽ chỉ nhận được một đoạn duy nhất, nhưng đối với các tệp lớn hơn, như âm thanh và video, bạn sẽ phải thu thập nhiều đoạn. Đây là trường hợp bạn sẽ bắt đầu nhận thấy giá trị thực của các tệp phát trực tuyến
Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó
Lưu ý rằng ví dụ mà tôi đã trình bày ở trên hầu như đánh bại mục đích sử dụng luồng vì dù sao thì chúng tôi cũng thu thập dữ liệu trong bộ đệm [biến], nhưng ít nhất nó cũng cho bạn ý tưởng về cách chúng hoạt động. Có thể xem một ví dụ tốt hơn cho thấy điểm mạnh của các luồng tệp ở đây, trong một tuyến Express xử lý một yêu cầu tệp
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
3Tất cả những gì chúng ta làm ở đây là mở tệp bằng
fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
73 và chuyển nó đến đối tượng phản hồi, fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
74. Chúng tôi thậm chí có thể đăng ký fs = require['fs']
fs.readFile['/etc/hosts', 'utf8', function [err,data] {
if [err] {
return console.log[err];
}
console.log[data];
}];
75 sự kiện và xử lý những sự kiện đó khi chúng xảy ra. Đó là một phương pháp tốt hơn nhiều để xử lý tệp khi bạn học cách sử dụng đúng cách. Để có ví dụ đầy đủ hơn và giải thích về đoạn mã trên, hãy xem bài viết này về cách tạo máy chủ tệp tĩnh bằng NodeSự kết luận
Từ bài viết này, bạn đã biết những điều cơ bản về đọc tệp, cũng như một số phương pháp tải nâng cao bằng cách sử dụng các đối tượng Stream. Biết khi nào nên sử dụng chúng là chìa khóa và cần được xem xét cẩn thận đối với các ứng dụng hạn chế về bộ nhớ hoặc thời gian
Phương pháp xử lý tệp ưa thích của bạn là gì?