Nodejs đọc nội dung tệp dưới dạng chuỗi

Đọ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ư sau

fs = 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);
});
0

fs = 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ừ đầu

Bâ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ày

fs = require('fs')
fs.readFile('/etc/hosts', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  console.log(data);
});
7

Bạ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 readFileSync

Phươ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);
});
9

Lư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ệp

fs = require('fs')
fs.readFile('/etc/hosts', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  console.log(data);
});
2

Mã 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);
});
3

Tấ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 Node

Sự 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ì?

Làm cách nào để đọc nội dung của tệp trong nút js?

Ba cách đọc tệp trong nút. .
Đọc tệp theo cách Promise. Cách Hứa hẹn cho phép chúng tôi sử dụng tính năng Javascript không đồng bộ hiện đại - không đồng bộ và chờ đợi. .
Đọc File với cách Callback. Cách tiếp cận cho cách Gọi lại là sử dụng fs. .
Đọc tệp theo cách đồng bộ

Làm cách nào để chuyển đổi tệp thành chuỗi trong js?

var fs = require("fs"); . readFile(". /Văn bản của tôi. txt", function(text){ var textByLine = text. tách("\n") });

readFileSync có trả về chuỗi không?

readFileSync("/path/to/file", "encoding-type"); . nhật ký (tệpNội dung); . Nếu không, nó sẽ được trả về dưới dạng chuỗi .

readFile trả về cái gì?

Hàm ReadFile trả về khi xảy ra một trong các điều kiện sau. Số byte yêu cầu đã được đọc . Thao tác ghi hoàn thành ở đầu ghi của đường ống. Một trình điều khiển không đồng bộ đang được sử dụng và quá trình đọc diễn ra không đồng bộ.