(更新:async function main() { ... }
不再需要包装代码,因为 Deno 现在支持顶层await
)
使用内置Deno.readTextFile
const countWords = (s: string): number =>
s.split(/\s+/g).filter(w => /[a-z0-9]/.test(w)).length;
const text = await Deno.readTextFile('input.txt');
const count = countWords(text);
console.log(`I read ${count} words.`);
请参阅以下文档:https ://doc.deno.land/builtin/stable#Deno.readTextFile
使用内置Deno.readFile
const countWords = (s: string): number =>
s.split(/\s+/g).filter(w => /[a-z0-9]/.test(w)).length;
const decoder = new TextDecoder('utf-8');
const text = decoder.decode(await Deno.readFile('input.txt'));
const count = countWords(text);
console.log(`I read ${count} words.`);
请注意,您需要将数据显式解码为 UTF-8。
请参阅以下文档:https ://deno.land/typedoc/index.html#readfile
使用阻塞读取
接受的答案使用readFileSync()
which 是一个阻塞函数,因此不需要main()
存在(更新:非阻塞也不再需要它)。一个简化(和工作)的例子是:async
await
const countWords = (s: string): number =>
s.split(/\s+/g).filter(w => /[a-z0-9]/.test(w)).length;
const decoder = new TextDecoder('utf-8');
const text = decoder.decode(Deno.readFileSync('input.txt'));
const count = countWords(text);
console.log(`I read ${count} words.`);
请注意,没有await
任何地方,所以代码稍微简单一些(更新:在 Deno 支持顶级之前await
,简单性的差异更大)但是Deno.readFileSync()
会阻塞线程直到文件被读取 - 对于一个简单的脚本,它执行一系列像这个例子中的步骤这很好,但如果它在服务器的请求处理程序中,那么这将对性能造成灾难。
使用较低级别Deno.open
和Deno.readAll
const countWords = (s: string): number =>
s.split(/\s+/g).filter(w => /[a-z0-9]/.test(w)).length;
const decoder = new TextDecoder('utf-8');
const file = await Deno.open('input.txt');
const text = decoder.decode(await Deno.readAll(file));
const count = countWords(text);
console.log(`I read ${count} words.`);
您可以将前两行main()
放在一行中:
const text = decoder.decode(await Deno.readAll(await Deno.open('input.txt')));
但它的可读性会降低。
请参阅以下文档:https ://deno.land/typedoc/index.html#readall
甚至更低级别Deno.open
和Deno.read
您甚至可以使用更低的杠杆Deno.read
,但您还必须分配缓冲区
请参阅以下文档:https ://deno.land/typedoc/index.html#read
使用new File()
抽象
还有一种用于读写文件的类式抽象。
请参阅以下文档:https ://deno.land/typedoc/classes/deno.file.html