我需要从文件中读取一个大数组。通常我会把它保存为JSON,但是UTF-8编码文件的大小要大得多,而且我有非常严格的大小要求所以每个Kb都很珍贵。
这是我到目前为止所拥有的:
// https://www.npmjs.com/package/typedarray-to-buffer
var toBuffer = require('typedarray-to-buffer');
var buffer = toBuffer(myArray);
var wstream = fs.createWriteStream('./myArray');
wstream.write(buffer);
// later...
var buff = new Buffer(data); // <-- file data passed in as a buffer
myArray = buff; // <--still binary :-(
我正在关注这个helpful article about writing binary files,但它没有介绍如何重新阅读它们。我认为我陷入困境的部分是将缓冲区数据转回数组。
更新
这是数组在写入文件之前的console.log()
:
Int32Array {
'0': 2107281600,
'1': -370226405,
'2': 274543611,
'3': 172775319,
'4': -1927927544,
'5': -248215383,
'6': -1295527238,
'7': -1774538531,
'8': -784581845,
'9': 651425656,
'10': -534521241,
'11': -1788883022,
'12': 1679049410,
'13': -1728518340,
...
答案 0 :(得分:0)
实际上,将二进制文件写入文件非常简单。对FS中的writeFileSync方法使用“二进制”编码类型字符串。像这样:
IF (@Flag='Authenticate')
BEGIN
Declare @UserID varchar(50) = null
SELECT @UserID = UserID FROM UserInformation WITH(NOLOCK) WHERE UserName=@UserName and Password=@UserPassword )
IF (@UserID is not NULL)
BEGIN
INSERT INTO UserLoginHistory(UserId,LastLoggedIn)
SELECT @Userid,GETDATE()
SELECT @Userid
END
END
现在,您可以检查文件的大小是否与类型数组的字节大小匹配。例如,myArray.length * 4将是您的数据大小,在我的情况下是1228624。文件系统显示:
// Assume you have an Int32Array called myArray
var fs = require('fs');
fs.writeFileSync('/tmp/test.bin', myArray, 'binary');