写点什么

鸿蒙 Next 文件读写操作支持写入汉字等符号

作者:auhgnixgnahz
  • 2025-06-25
    北京
  • 本文字数:2007 字

    阅读完需:约 7 分钟

本文介绍一下:


1.获取指定目录下的文件


2.向文件内追加写入


3.读取文件中的内容


看一下实现效果:



实现步骤:


1.使用 fileIo.writeSync(fd: number, buffer: ArrayBuffer | string, options?: WriteOptions)写入到文件中


// 文件不存在时创建并打开文件,文件存在时打开文件  let file = fileIo.openSync(filesDir + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);  // 写入一段内容至文件  let writeLen = fileIo.writeSync(file.fd, str);  fileIo.closeSync(file);
复制代码


这种写法,每次都是从文件的开头写入,会覆盖之前的内容,肯定不是我们要实现的效果,因此可以设置 WriteOptions,可以设置偏移量,从文件末尾写入


2.以同步方法基于文本方式读取文件(即直接读取文件的文本内容)readTextSync(filePath: string, options?: ReadTextOptions)


function readFileSync(): string {  let content = ''  let readTextOptions: ReadTextOptions = {    encoding: 'utf-8'  };  try {    content = fileIo.readTextSync(filesDir + fileName,readTextOptions)  }catch (e) {  }  return content;}
复制代码


3.获取到当前文件的内容,然后写入最后面的位置,应该就可以了吧?



发现,插入位置不对,插入内容多了个异常符合,这是为什么呢?


4.尝试了多次,发现只有汉字会出现这种情况,那肯定是计算文件长度的时候出了问题,1 个汉字的长度是 1,但是 UTF-8 编码时大部分是 3,所以需要在计算长度时做个转码


//string转Uint8Arrayfunction stringToUint8Array(str: string): Uint8Array {  if (isEmpty(str)){    return new Uint8Array()  }  try {    let textEncoder = new util.TextEncoder("utf-8");    let array: Uint8Array = textEncoder.encodeInto(str);    return array  } catch (err) {    return new Uint8Array()  }}
复制代码


5.修改 offset:stringToUint8Array(readFileSync())



写入汉字,符号,都显示正常了


核心代码


function writeFile(str:string): void {  // 文件不存在时创建并打开文件,文件存在时打开文件  let file = fileIo.openSync(filesDir + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);  // 写入一段内容至文件  let writeLen = fileIo.writeSync(file.fd, str,{offset:stringToUint8Array(readFileSync()).length});  fileIo.closeSync(file);}
function readFileSync(): string { let content = '' let readTextOptions: ReadTextOptions = { encoding: 'utf-8' }; try { //如果文件内容为空会报错,因此加个catch content = fileIo.readTextSync(filesDir + fileName,readTextOptions) }catch (e) { } return content;}function deleteFile(): void { let filePath =filesDir + fileName; try { //如果文件不存在 会报错 fileIo.unlinkSync(filePath); }catch (e) { //No such file or directory }}// 获取应用文件路径let context = getContext(this) as common.UIAbilityContext;let filesDir = context.filesDir;let fileName = '/'+new Date().getFullYear()+'_'+(new Date().getMonth()+1)+'_'+new Date().getDate()+'_'+new Date().getHours()+'.txt'// 查看文件列表function getListFile(): string[] { let listFileOption: ListFileOptions = { recursion: false, //是否递归子目录下文件名 listNum: 0, //当设置0时,列出所有文件 filter: { suffix: [".png", ".jpg", ".txt"], //文件后缀名完全匹配 displayName: ["*"], //文件名模糊匹配 fileSizeOver: 0, //文件大小匹配,大于指定大小的文件 lastModifiedAfter: new Date(0).getTime() //文件最近修改时间匹配 } }; //以同步方式列出当前目录下所有文件名和目录名 let files = fileIo.listFileSync(filesDir, listFileOption);
return files}
复制代码


读文件还有其他的方式,例如按行读:readLinesSync(filePath: string, options?: Options): ReaderIterator


以同步方式逐行读取文件的文本内容


function readFile(): string {  let content = ''  let file = fileIo.openSync(filesDir + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);  let options: Options = {    encoding: 'utf-8'  };  //逐行读取文件文本内容  let readerIterator = fileIo.readLinesSync(filesDir + fileName, options);  try {    //如果文件内容为空,会报错    for (let it = readerIterator.next(); !it.done; it = readerIterator.next()) {      content+=it.value    }    fileIo.closeSync(file);  }catch (e) {    fileIo.closeSync(file);  }  return content;}
复制代码


总结:


1.需要注意写入位置,汉字的长度计算


2.读取空文件,活删除不存在的文件时需要 catch


发布于: 刚刚阅读数: 4
用户头像

auhgnixgnahz

关注

还未添加个人签名 2018-07-10 加入

欢迎关注:HarmonyOS开发笔记

评论

发布
暂无评论
鸿蒙Next文件读写操作支持写入汉字等符号_鸿蒙Next_auhgnixgnahz_InfoQ写作社区