繁体   English   中英

Java 的 Files.readAllBytes() 的 Javascript 等价物是什么?

[英]What is the Javascript equivalent of Java's Files.readAllBytes()?

我需要在我的服务器应用程序上使用 javascript。 我有一个变量保存到 PDF 的路径。

现在我想将该文件作为字节数组读取以将其发送到另一台服务器。 在 Java 中,我会做这样的事情:

String myPath = "\path\to\my.pdf";

try {
  byte [] myFile = Files.readAllBytes(Paths.get(myPath));

  //Own function
  sendData(myFile);
} catch (IO Exception e) {
  e.printStackTrace();
} 

我不知道 javascript 的等价物是什么。 使用 fs 库,我只能将文件读取为“缓冲区”类型的 object:

import fs from 'fs';
let myPath = '\path\to\my.pdf';
let myFileAsBuffer = fs.readFileSync(myPath, { flag: 'r' });
//Own function
sendData(myFileAsBuffer);

但我总是得到一个错误,因为服务器需要一个字节数组而不是一个缓冲区,它看起来像这样:

<Buffer 25 50 44 46 2d 31 2e 35 0d 0a 25 b5 b5 b5 b5 0d 0a 31 20 30 20 6f 62 6a 0d 0a 3c 3c 2f 54 79 70 ...>

您应该在调用sendData之前传播Buffer的可迭代values()

sendData([...myFileAsBuffer.values()])

请参阅: buf.values()


这是 Java 的等效示例:

import fs from 'fs';

class Files {
  static readAllBytes(path) {
    return [...fs.readFileSync(path, { flag: 'r' }).values()];
  }
}

sendData(Files.readAllBytes('/path/to/my.pdf'));

请注意, fs.readFileSync函数的path可以采用 各种类型,stringBufferURLinteger 上面示例中的static函数假设您的path是这四种类型之一。

给出的另一个答案只是一个重要说明:

在 Node.js 中,您应该远离readFileSync等函数。 如您所知 Node.js 是单线程的。 当您调用 function 之类的readFileSync时,您将锁定整个应用程序,直到从磁盘加载数据。 (如短暂的心脏骤停)

因此,更好的解决方案是使用readFile ,它可以与回调 function 或 promise 一起使用。

readFileSync可接受的唯一几次是应用程序仍在初始化时,例如加载设置。 出于这个原因,如果您正在制作客户端/服务器应用程序,我肯定会远离readFileSync

import { readFile } from 'node:fs/promises';

// use in an async function:  
const contents = await readFile(filePath);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM