Reading/Writing to a file in javascript
我想以特定的方式读写一个文件。
示例文件可以是:
1 2 3 4 5 6 7 | name1:100 name2:400 name3:7865786 ...etc etc |
什么是读取和存储这些数据并最终写出这些数据的最佳方法?我不知道要使用哪种类型的数据结构?我对javascript还比较陌生。
我希望能够确定是否有任何键、值匹配。例如,如果我要添加到文件中,我可以看到文件中已经有了名称1,我只是编辑值而不是添加副本。
可以将localstorage用作读写之间的临时存储。
但是,您不能使用客户端JavaScript随意读写用户的文件系统。但是,您可以请求用户选择要读取的文件,方法与请求用户将推送的数据保存为文件的方式相同。
1 2 3 4 5 6 7 8 | // set some data localStorage.setItem("key","value"); // get some data var data = localStorage.getItem("key"); // check if key exists, set if not (though, you can simply override the key as well) if (!localStorage.getItem("key")) localStorage.setItem("key","value"); |
如果密钥不存在,方法
但请注意,
要读取文件,您必须请求用户选择一个(或多个):
HTML:
1 | <label>Select a file: <input type=file id=selFile></label> |
JavaScript
1 2 3 4 5 6 7 8 | document.getElementById("selFile").onchange = function() { var fileReader = new FileReader(); fileReader.onload = function() { var txt = this.result; // now we have the selected file as text. }; fileReader.readAsText(this.files[0]); }; |
要保存文件,可以使用以下方式使用文件对象:
1 2 3 | var file = new File([txt],"myFilename.txt", {type:"application/octet-stream"}); var blobUrl = (URL || webkitURL).createObjectURL(file); window.location = blobUrl; |
使用octet流的原因是"强制"浏览器显示"另存为"对话框,而不是试图在选项卡中显示文件,如果我们使用text/plain作为类型,就会发生这种情况。
那么,我们如何获得这些阶段之间的数据呢?假设您使用的是键/值方法和文本,那么您就可以使用JSON对象。
1 | var file = JSON.stringify(localStorage); |
然后以上述文件blob的形式发送给用户。
要读取,您必须手动分析文件格式(如果数据以特定格式存在),或者如果数据与您保存的数据相同,则可以如上图所示读取文件,然后将其从字符串转换为对象:
1 2 | var data = JSON.parse(txt); // continue in the function block above Object.assign(localStorage, data); // merge data from object with localStorage |
请注意,您可能必须先从存储中删除项目。其他数据也有可能存储在那里,因此需要考虑这些情况,但这是一种方法的基础。
例子1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // due to security reasons, localStorage can't be used in stacksnippet, // so we'll use an object instead var test = {"myKey":"Hello there!"}; // localStorage.setItem("myKey","Hello there!"); document.getElementById("selFile").onchange = function() { var fileReader = new FileReader(); fileReader.onload = function() { var o = JSON.parse(this.result); //Object.assign(localStorage, o); // use this with localStorage alert("done, myKey=" + o["myKey"]); // o[] -> localStorage.getItem("myKey") }; fileReader.readAsText(this.files[0]); }; document.querySelector("button").onclick = function() { var json = JSON.stringify(test); // test -> localStorage var file = new File([json],"myFilename.txt", {type:"application/octet-stream"}); var blobUrl = (URL || webkitURL).createObjectURL(file); window.location = blobUrl; } |
1 2 3 4 | Save first: <button>Save file</button> (<wyn>"myKey" ="Hello there!"</wyn>) Then read the saved file back in: <label>Select a file: <input type=file id=selFile></label> |
你在使用nodejs吗?还是浏览器javascript?
无论哪种情况,您应该使用的结构都是JS的标准对象。然后您可以将其转换为JSON,如下所示:
1 | var dataJSON = JSON.stringify(yourDataObj) |
对于nodejs,您需要使用fs模块,并使用writefile或appendfile函数之一——下面是示例代码:
1 2 | const fs = require('fs'); fs.writeFileSync('my/file/path', dataJSON); |
使用浏览器JS,这个stackoverflow可以帮助您:javascript:创建和保存文件
出于安全原因,不可能使用javascript写入客户机系统上的常规文本或类似文件。
但是,可以使用异步JavaScript和XML(Ajax)将XMLHttpRequest发送到服务器上的文件,该文件使用诸如PHP或ASP之类的服务器端语言编写。
然后,服务器端文件可以写入其他文件或服务器上的数据库。
如果您只需要在客户端系统上本地保存相对少量的数据,那么cookie非常有用。
有关更多信息,请查看使用jquery读/写文件
我知道你想写一个文件,但是考虑换一个数据库,这样你就不必重新发明轮子了。插入…在重复的密钥更新上,似乎是您想要做的事情的逻辑选择。