[转载] HTML5 文件操作API——HTML5系列

简介

我常常想,如果网络应用能够读取和写入文件与目录,将会非常方便。从离线转移到在线后,应用变得更加复杂,而文件系统方面的API的缺乏也一直阻碍着网络前进。存储二进制数据或与其进行交互不应局限于桌面。令人欣慰的是,由于FileSystemAPI的出现,这一现状终于得到了改变。有了FileSystemAPI,网络应用就可以创建、读取、导航用户本地文件系统中的沙盒部分以及向其中写入数据。

API 被分为以下不同的主题:

  • 读取和处理文件:File/BlobFileListFileReader
  • 创建和写入:BlobBuilderFileWriter
  • 目录和文件系统访问:DirectoryReaderFileEntry/DirectoryEntryLocalFileSystem

浏览器支持与存储限制

在写这篇文章时,只有 GoogleChrome 浏览器可以实施此FileSystemAPI。目前尚不存在专门用于文件/配额管理的浏览器用户界面。要在用户的系统上存储数据,您的应用可能需要请求配额。不过,可使用--unlimited-quota-for-files标记运行Chrome浏览器进行测试。此外,如果您要开发的是用于Chrome网上应用店的应用或扩展程序,可使用unlimitedStorage清单文件权限,而无需请求配额。最后,用户会收到授予、拒绝或为应用增加存储的权限对话框。

如果您要通过 file://调试您的应用,可能需要--allow-file-access-from-files标记。不使用这些标记会导致SECURITY_ERRQUOTA_EXCEEDED_ERRFileError。

请求文件系统

网络应用可通过调用 window.requestFileSystem()请求对沙盒文件系统的访问权限:

  1. // Note: The file system has been prefixed as of Google Chrome 12:
  2. window.requestFileSystem  = window.requestFileSystem || window.webkitRequestFileSystem;
  3. window.requestFileSystem(type, size, successCallback, opt_errorCallback)
type
文件存储是否应该是持久的。可能的值包括window.TEMPORARYwindow.PERSISTENT。通过TEMPORARY存储的数据可由浏览器自行决定删除(例如在需要更多空间的情况下)。要清除PERSISTENT存储,必须获得用户或应用的明确授权,并且需要用户向您的应用授予配额。请参阅请求配额
size
应用需要用于存储的大小(以字节为单位)。
successCallback
文件系统请求成功时调用的回调。其参数为 FileSystem对象。
opt_errorCallback
用于处理错误或获取文件系统的请求遭到拒绝时可选的回调。其参数为FileError对象。

如果您是首次调用requestFileSystem(),系统会为您的应用创建新的存储。请注意,这是沙箱文件系统,也就是说,一个网络应用无法访问另一个应用的文件。这也意味着您无法在用户硬盘上的任意文件夹(例如“我的图片”、“我的文档”等)中读/写文件。

用法示例:

function onInitFs(fs) {
  console.log(‘Opened file system: ‘ + fs.name);
}

window.requestFileSystem(window.TEMPORARY, 5*1024*1024 /*5MB*/, onInitFs, errorHandler);

FileSystem 规范还定义了计划用于WebWorkers的同步API(LocalFileSystemSync)接口。不过,本教程不涉及该同步API。

在本文档的其余部分中,我们将使用相同的处理程序处理异步调用引发的错误:

  1. function errorHandler(e) {
  2. var msg = ‘‘;
  3. switch (e.code) {
  4. case FileError.QUOTA_EXCEEDED_ERR:
  5. msg = ‘QUOTA_EXCEEDED_ERR‘;
  6. break;
  7. case FileError.NOT_FOUND_ERR:
  8. msg = ‘NOT_FOUND_ERR‘;
  9. break;
  10. case FileError.SECURITY_ERR:
  11. msg = ‘SECURITY_ERR‘;
  12. break;
  13. case FileError.INVALID_MODIFICATION_ERR:
  14. msg = ‘INVALID_MODIFICATION_ERR‘;
  15. break;
  16. case FileError.INVALID_STATE_ERR:
  17. msg = ‘INVALID_STATE_ERR‘;
  18. break;
  19. default:
  20. msg = ‘Unknown Error‘;
  21. break;
  22. };
  23. console.log(‘Error: ‘ + msg);
  24. }
当然,这种错误回调非常通用,能让您充分理解,但您提供给用户的应是易于一般人理解的讯息。请求存储配额要使用 PERSISTENT 存储,您必须向用户取得存储持久数据的许可。由于浏览器可自行决定删除临时存储的数据,因此这一限制不适用于 TEMPORARY 存储。为了将 PERSISTENT 存储与 FileSystem API 配合使用,Chrome 浏览器使用基于 window.webkitStorageInfo 的新 API 以请求存储:
  1. window.webkitStorageInfo.requestQuota(PERSISTENT, 1024*1024, function(grantedBytes) {
  2. window.requestFileSystem(PERSISTENT, grantedBytes, onInitFs, errorHandler);
  3. }, function(e) {
  4. console.log(‘Error‘, e);
  5. });
用户授予许可后,就不必再调用 requestQuota() 了。后续调用为无操作指令。您还可以使用 API 查询源的当前配额使用情况和分配情况:window.webkitStorageInfo.queryUsageAndQuota()使用文件沙盒环境中的文件通过 FileEntry 接口表示。FileEntry 包含标准文件系统中会有的属性类型(nameisFile...)和方法(removemoveTocopyTo...)。FileEntry 的属性和方法:
  1. fileEntry.isFile === true
  2. fileEntry.isDirectory === false
  3. fileEntry.name
  4. fileEntry.fullPath
  5. ...
  6. fileEntry.getMetadata(successCallback, opt_errorCallback);
  7. fileEntry.remove(successCallback, opt_errorCallback);
  8. fileEntry.moveTo(dirEntry, opt_newName, opt_successCallback, opt_errorCallback);
  9. fileEntry.copyTo(dirEntry, opt_newName, opt_successCallback, opt_errorCallback);
  10. fileEntry.getParent(successCallback, opt_errorCallback);
  11. fileEntry.toURL(opt_mimeType);
  12. fileEntry.file(successCallback, opt_errorCallback);
  13. fileEntry.createWriter(successCallback, opt_errorCallback);
  14. ...
为了更好地理解 FileEntry,本部分还提供了执行常规任务的众多技巧。创建文件您可以使用文件系统的 getFile()DirectoryEntry 接口的一种方法)查找或创建文件。请求文件系统后,系统会向成功回调传递FileSystem 对象,其中包含指向该应用相应文件系统的根的 DirectoryEntry (fs.root)。以下代码会在该应用相应文件系统的根中创建名为“log.txt”的空白文件:
  1. function onInitFs(fs) {
  2. fs.root.getFile(‘log.txt‘, {create: true, exclusive: true}, function(fileEntry) {
  3. // fileEntry.isFile === true
  4. // fileEntry.name == ‘log.txt‘
  5. // fileEntry.fullPath == ‘/log.txt‘
  6. }, errorHandler);
  7. }
  8. window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
请求文件系统后,系统会向成功处理程序传递 FileSystem 对象。我们可以将回调中的 fs.root.getFile() 命名为要创建的文件的文件名。您可以传递绝对路径或相对路径,但该路径必须有效。例如,如果您尝试创建一个其直接父级文件不存在的文件,将会导致出错。getFile() 的第二个参数是在文件不存在时从字面上说明函数行为的对象。在此示例中,create: true 会在文件不存在时创建文件,并在文件存在时 (exclusive: true) 引发错误。如果 create: false,系统只会获取并返回文件。无论是哪种情况,系统都不会覆盖文件内容,因为我们只是获取相关文件的引用路径。通过名称读取文件以下代码会检索名为“log.txt”的文件,并使用 FileReader API 读取文件内容,然后将其附加到页面上新的 <textarea>。如果 log.txt 不存在,系统将引发错误。
  1. function onInitFs(fs) {
  2. fs.root.getFile(‘log.txt‘, {}, function(fileEntry) {
  3. // Get a File object representing the file,
  4. // then use FileReader to read its contents.
  5. fileEntry.file(function(file) {
  6. var reader = new FileReader();
  7. reader.onloadend = function(e) {
  8. var txtArea = document.createElement(‘textarea‘);
  9. txtArea.value = this.result;
  10. document.body.appendChild(txtArea);
  11. };
  12. reader.readAsText(file);
  13. }, errorHandler);
  14. }, errorHandler);
  15. }
  16. window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
写入到文件以下代码会创建名为“log.txt”的空白文件(如果该文件不存在),并在文件中填入“Lorem Ipsum”文字。
  1. function onInitFs(fs) {
  2. fs.root.getFile(‘log.txt‘, {create: true}, function(fileEntry) {
  3. // Create a FileWriter object for our FileEntry (log.txt).
  4. fileEntry.createWriter(function(fileWriter) {
  5. fileWriter.onwriteend = function(e) {
  6. console.log(‘Write completed.‘);
  7. };
  8. fileWriter.onerror = function(e) {
  9. console.log(‘Write failed: ‘ + e.toString());
  10. };
  11. // Create a new Blob and write it to log.txt.
  12. var bb = new BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12.
  13. bb.append(‘Lorem Ipsum‘);
  14. fileWriter.write(bb.getBlob(‘text/plain‘));
  15. }, errorHandler);
  16. }, errorHandler);
  17. }
  18. window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);
此时,我们会调用 FileEntry 的 createWriter() 方法获取 FileWriter 对象。在成功回调中为error 事件和 writeend 事件设置事件处理程序。通过以下操作将文字数据写入文件:创建 Blob,向 Blob 附加文字,然后将 Blob 传递到FileWriter.write()。向文件附加文字以下代码会将“Hello World”文字附加到日志文件结尾。如果该文件不存在,系统将引发错误。
  1. function onInitFs(fs) {
  2. fs.root.getFile(‘log.txt‘, {create: false}, function(fileEntry) {
  3. // Create a FileWriter object for our FileEntry (log.txt).
  4. fileEntry.createWriter(function(fileWriter) {
  5. fileWriter.seek(fileWriter.length); // Start write position at EOF.
  6. // Create a new Blob and write it to log.txt.
  7. var bb = new BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12.
  8. bb.append(‘Hello World‘);
  9. fileWriter.write(bb.getBlob(‘text/plain‘));
  10. }, errorHandler);
  11. }, errorHandler);
  12. }
  13. window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);

复制用户选定的文件

以下代码可让用户使用 <input type="file" multiple /> 选择多个文件,并在应用的沙盒文件系统中复制这些文件。

  1. <input type="file" id="myfile" multiple />
  2. document.querySelector(‘#myfile‘).onchange = function(e) {
  3. var files = this.files;
  4. window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
  5. // Duplicate each file the user selected to the app‘s fs.
  6. for (var i = 0, file; file = files[i]; ++i) {
  7. // Capture current iteration‘s file in local scope for the getFile() callback.
  8. (function(f) {
  9. fs.root.getFile(file.name, {create: true, exclusive: true}, function(fileEntry) {
  10. fileEntry.createWriter(function(fileWriter) {
  11. fileWriter.write(f); // Note: write() can take a File or Blob object.
  12. }, errorHandler);
  13. }, errorHandler);
  14. })(file);
  15. }
  16. }, errorHandler);
  17. };

虽然我们通过输入导入文件,您也可以使用 HTML5 拖放功能轻松实现相同的目标。

正如评论中所说的,FileWriter.write() 可接受 Blob 或 File。这是因为 File 继承自 Blob,所以文件对象也是 Blob。

删除文件

以下代码会删除“log.txt”文件。

  1. window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
  2. fs.root.getFile(‘log.txt‘, {create: false}, function(fileEntry) {
  3. fileEntry.remove(function() {
  4. console.log(‘File removed.‘);
  5. }, errorHandler);
  6. }, errorHandler);
  7. }, errorHandler);

使用目录

沙盒中的目录通过 DirectoryEntry 接口表示,该接口共享了 FileEntry 的大部分属性(继承自常用 Entry 接口)。不过,DirectoryEntry 还可使用其他方法处理目录。

DirectoryEntry 的属性和方法:

  1. dirEntry.isDirectory === true
  2. // See the section on FileEntry for other inherited properties/methods.
  3. ...
  4. var dirReader = dirEntry.createReader();
  5. dirEntry.getFile(path, opt_flags, opt_successCallback, opt_errorCallback);
  6. dirEntry.getDirectory(path, opt_flags, opt_successCallback, opt_errorCallback);
  7. dirEntry.removeRecursively(successCallback, opt_errorCallback);
  8. ...

创建目录

使用 DirectoryEntry 的 getDirectory() 方法读取或创建目录。您可以递交名称或路径作为查找或创建所用的目录。

例如,以下代码会在根目录中创建名为“MyPictures”的目录:

  1. window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
  2. fs.root.getDirectory(‘MyPictures‘, {create: true}, function(dirEntry) {
  3. ...
  4. }, errorHandler);
  5. }, errorHandler);

子目录

创建子目录的方法与创建其他任何目录的方法完全相同。不过,如果您尝试创建其直接父目录不存在的目录,API 将引发错误。相应的解决方法是,依次创建各级目录,而这对异步 API 而言非常麻烦。

以下代码会在系统创建父文件夹后以递归方式添加各个子文件夹,从而在应用相应 FileSystem 的根中创建新的层次结构 (music/genres/jazz)。

  1. var path = ‘music/genres/jazz/‘;
  2. function createDir(rootDirEntry, folders) {
  3. // Throw out ‘./‘ or ‘/‘ and move on to prevent something like ‘/foo/.//bar‘.
  4. if (folders[0] == ‘.‘ || folders[0] == ‘‘) {
  5. folders = folders.slice(1);
  6. }
  7. rootDirEntry.getDirectory(folders[0], {create: true}, function(dirEntry) {
  8. // Recursively add the new subfolder (if we still have another to create).
  9. if (folders.length) {
  10. createDir(dirEntry, folders.slice(1));
  11. }
  12. }, errorHandler);
  13. };
  14. function onInitFs(fs) {
  15. createDir(fs.root, path.split(‘/‘)); // fs.root is a DirectoryEntry.
  16. }
  17. window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);

在“music/genres/jazz”处于合适的位置后,我们就可以将完整路径传递到 getDirectory(),然后在其下方创建新的子文件夹。例如:

window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
  fs.root.getFile(‘/music/genres/jazz/song.mp3‘, {create: true}, function(fileEntry) {
    ...
  }, errorHandler);
}, errorHandler);

读取目录内容

要读取目录的内容,可先创建 DirectoryReader,然后调用 readEntries() 方法。我们不能保证所有目录条目都能在仅调用一次 readEntries() 的情况下同时返回。也就是说,您需要一直调用 DirectoryReader.readEntries(),直到系统不再返回结果为止。以下代码对此作了说明:

  1. <ul id="filelist"></ul>
  2. function toArray(list) {
  3. return Array.prototype.slice.call(list || [], 0);
  4. }
  5. function listResults(entries) {
  6. // Document fragments can improve performance since they‘re only appended
  7. // to the DOM once. Only one browser reflow occurs.
  8. var fragment = document.createDocumentFragment();
  9. entries.forEach(function(entry, i) {
  10. var img = entry.isDirectory ? ‘<img src="folder-icon.gif">‘ :
  11. ‘<img src="file-icon.gif">‘;
  12. var li = document.createElement(‘li‘);
  13. li.innerHTML = [img, ‘<span>‘, entry.name, ‘</span>‘].join(‘‘);
  14. fragment.appendChild(li);
  15. });
  16. document.querySelector(‘#filelist‘).appendChild(fragment);
  17. }
  18. function onInitFs(fs) {
  19. var dirReader = fs.root.createReader();
  20. var entries = [];
  21. // Call the reader.readEntries() until no more results are returned.
  22. var readEntries = function() {
  23. dirReader.readEntries (function(results) {
  24. if (!results.length) {
  25. listResults(entries.sort());
  26. } else {
  27. entries = entries.concat(toArray(results));
  28. readEntries();
  29. }
  30. }, errorHandler);
  31. };
  32. readEntries(); // Start reading dirs.
  33. }
  34. window.requestFileSystem(window.TEMPORARY, 1024*1024, onInitFs, errorHandler);

删除目录

DirectoryEntry.remove() 方法的行为与 FileEntry 相应方法的行为非常相似。差别在于:尝试删除非空目录时会引发错误。

以下代码会从“/music/genres/”删除空的“jazz”目录:

  1. window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
  2. fs.root.getDirectory(‘music/genres/jazz‘, {}, function(dirEntry) {
  3. dirEntry.remove(function() {
  4. console.log(‘Directory removed.‘);
  5. }, errorHandler);
  6. }, errorHandler);
  7. }, errorHandler);

以递归方式删除目录

如果您不需要某个包含条目的目录,不妨使用 removeRecursively()。该方法将以递归方式删除目录及其内容。

以下代码会以递归方式删除“music”目录及其包含的所有文件和目录:

  1. window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
  2. fs.root.getDirectory(‘/misc/../music‘, {}, function(dirEntry) {
  3. dirEntry.removeRecursively(function() {
  4. console.log(‘Directory removed.‘);
  5. }, errorHandler);
  6. }, errorHandler);
  7. }, errorHandler);

复制、重命名和移动

FileEntry 和 DirectoryEntry 享有共同的操作。

复制条目

FileEntry 和 DirectoryEntry 均可使用 copyTo() 复制现有条目。该方法会自动以递归方式复制文件夹。

以下代码示例会将“me.png”文件从一个目录复制到另一个目录:

  1. function copy(cwd, src, dest) {
  2. cwd.getFile(src, {}, function(fileEntry) {
  3. cwd.getDirectory(dest, {}, function(dirEntry) {
  4. fileEntry.copyTo(dirEntry);
  5. }, errorHandler);
  6. }, errorHandler);
  7. }
  8. window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
  9. copy(fs.root, ‘/folder1/me.png‘, ‘folder2/mypics/‘);
  10. }, errorHandler);

移动或重命名条目

FileEntry 和 DirectoryEntry 的 moveTo() 方法可让您移动或重命名文件或目录。其第一个参数是文件要移动到的目标父目录,其第二个参数是文件可选的新名称。如未提供新名称,系统将使用文件的原名称。

以下示例将“me.png”重命名为“you.png”,但并不移动该文件:

  1. function rename(cwd, src, newName) {
  2. cwd.getFile(src, {}, function(fileEntry) {
  3. fileEntry.moveTo(cwd, newName);
  4. }, errorHandler);
  5. }
  6. window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
  7. rename(fs.root, ‘me.png‘, ‘you.png‘);
  8. }, errorHandler);
  9. 以下示例将“me.png”(位于根目录中)移动到名为“newfolder”的文件夹。
  10. function move(src, dirName) {
  11. fs.root.getFile(src, {}, function(fileEntry) {
  12. fs.root.getDirectory(dirName, {}, function(dirEntry) {
  13. fileEntry.moveTo(dirEntry);
  14. }, errorHandler);
  15. }, errorHandler);
  16. }
  17. window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
  18. move(‘/me.png‘, ‘newfolder/‘);
  19. }, errorHandler);

filesystem: 网址

FileSystem API 使用新的网址机制,(即 filesystem:),可用于填充 src 或 href 属性。例如,如果您要显示某幅图片且拥有相应的 fileEntry,您可以调用 toURL() 获取该文件的 filesystem: 网址:
  1. var img = document.createElement(‘img‘);
  2. img.src = fileEntry.toURL(); // filesystem:http://example.com/temporary/myfile.png
  3. document.body.appendChild(img);
另外,如果您已具备 filesystem: 网址,可使用 resolveLocalFileSystemURL() 找回 fileEntry:
  1. window.resolveLocalFileSystemURL = window.resolveLocalFileSystemURL ||
  2. window.webkitResolveLocalFileSystemURL;
  3. var url = ‘filesystem:http://example.com/temporary/myfile.png‘;
  4. window.resolveLocalFileSystemURL(url, function(fileEntry) {
  5. ...
  6. });

支持的浏览器:

Opera仅支持FileAPI  IE不支持   Safari不支持   Firefox仅支持FileAPI   Chrome/Chromium浏览器支持。

http://www.cnblogs.com/zhwl/p/3201975.html
时间: 2024-10-11 05:01:57

[转载] HTML5 文件操作API——HTML5系列的相关文章

HTML5 文件操作API

简介 我常常想,如果网络应用能够读取和写入文件与目录,将会非常方便.从离线转移到在线后,应用变得更加复杂,而文件系统方面的API的缺乏也一直阻碍着网络前进.存储二进制数据或与其进行交互不应局限于桌面.令人欣慰的是,由于FileSystemAPI的出现,这一现状终于得到了改变.有了FileSystemAPI,网络应用就可以创建.读取.导航用户本地文件系统中的沙盒部分以及向其中写入数据. API 被分为以下不同的主题: 读取和处理文件:File/Blob.FileList.FileReader 创建

(3)HTML5 文件操作API

读取目录内容 要读取目录的内容,可先创建 DirectoryReader,然后调用 readEntries() 方法. 我们不能保证所有目录条目都能在仅调用一次 readEntries() 的情况下同时返回. 也就是说,您需要一直调用 DirectoryReader.readEntries(),直到系统不再返回结果为止.以下代码对此作了说明: <ul id="filelist"></ul> function toArray(list) { return Arra

HTML5文件操作API

fiileList对象: file对象的集合 document.getElementById("fileDemo").files取到的就是fileList对象 Blob对象: 原始数据对象,有两个属性 size和type file对象 继承于Blob对象,指向具体的文件除了继承到的size和type属性,另外 还有name和lastModifiedData属性 #获取file对象 var file_obj=document.getElementById("fileDemo&q

Html5 学习系列(四)文件操作API

原文:Html5 学习系列(四)文件操作API 引言 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或者跨浏览器.跨设备等情况下实现统一的表现,从另外一个角度来说就是让我们的web应用依赖了第三方的插件,而不是很独立,不够通用.在HTML5标准中,默认提供了操作文件的API让这一切直接标准化.有了操作文件的API,让我们的Web应用可以很轻松的通过JS来控制文件的读取.写入.文件夹.文件等一系列的操作,

C语言 文件操作API介绍

文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名. 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等.文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来.从不同的角度可对文件作不同的分类.从用户的角度看,文件可分为普通文件和设备文件两种. 普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件.目标文件.可执行程序:也可以是一组待输入处理的原始数据,或者是一组输出的结果.

HTML5 文件拖放API讲解

本章向大家讲解一下HTML 5中文件API与拖放API的使用方法.HTML5的文件API,可以在浏览器中直接显示客户端文件的信息或文件中的内容,而通过拖放API,可以直接将位于客户端中的文件拖动到浏览器中,也可以单独拖动页面中的元素或者元素中的内容. HTML5拖拽文件预览效果图: 在线演示 以前,我们使用file控件,单击上传按钮后选择计算机中的文件.在HTML5中,我们可以先将计算机中的文件直接拖动到浏览器中进行预览,确定文件是我们所需要的,然后单击上传按钮将该文件上传到服务器端. 我们使用

nodejs模块fs——文件操作api

// fs模块常用api // 读取文件 .写入文件 .追加文件. 拷贝文件 .删除文件 // 读取文件 // fs.readFile(path[, options], callback) // fs.readFileSync(path[, options]) const fs = require('fs') // 异步读取 fs.readFile('./test.json', (error, data) => { if (error) return var data = data.toStri

Hadoop学习笔记之二 文件操作

HDFS分布式文件系统:优点:支持超大文件存储.流式访问.一次写入多次读取.缺点:不适应大量小文件.不适应低时延的数据访问.不适应多用户访问任意修改文件. 1.hadoop用于大数据处理,在数据量较小时,并不适用于实时性强的任务,并不是所有的job放到hadoop上,性能都会提升. 2.大量小文件的情况下会极大的降低系统的性能,所以处理前需要先将少文件聚合成大文件,map的输出也应该首先combine在传输给reduce. 3.数据传输时的IO开销,存储在内存中还是硬盘中,节点之间共享数据的分发

C语言复习:文件操作

文件操作专题 C语言文件读写概念 文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁盘.磁带等) 设备文件:非存储介质(键盘.显示器.打印机等) 按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放 每个文件都以文件名为标识,I/O设备的文件名是系统定义的,如: COM1或AUX--第一串行口,附加设备