HarmonyOS 鸿蒙Next writeSync 写文件读文件长度不一致问题

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next writeSync 写文件读文件长度不一致问题

发现从网上接收的文件写入本地后,再读出来,读出来的内容只有写入的一半左右,后面的被截掉了。

写文件

let pathDir = globalThis.mainAbilityContext.filesDir;
let fileStr:string=pathDir+"/"+fileName;
let destFile = fs.openSync(fileStr, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); //若不存在则创建
// 写入至目的文件
let newsBuffer:Uint8Array=TQMisc.stringToUint8Array(str);
let buf:ArrayBuffer=newsBuffer.buffer;
if (newsBuffer.length > 0) {
  let len=fs.writeSync(destFile.fd, buf);
  TQMisc.debug(TAG,`write news file ${fileName} len:${len}`);
}

打印出来的

NewsModel write news file 20240704C.dat len:5222

读文件

static Uint8ArrayToStringWithEncoding(dataView:Uint8Array,encoding:string):string{
  let decoder = util.TextDecoder.create(encoding, {
    ignoreBOM: true
  })
  let str= decoder.decodeWithStream(dataView,{stream: false});
  return str;
}
let length=size;
let buf = new ArrayBuffer(length);
let readLen = inputStream.readSync(buf, { offset: 0, length: length });
let dataView: Uint8Array = new Uint8Array(buf);
let wholeStr=TQMisc.Uint8ArrayToStringWithEncoding(dataView,'utf-8');
TQMisc.debug(TAG,`read news buffer length:${readLen} convert string length:${wholeStr.length}`)

打印出来

NewsModel read news buffer length:5222 convert string length:2964

更多关于HarmonyOS 鸿蒙Next writeSync 写文件读文件长度不一致问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复
问题貌似写文件的地方。

```css
let newsBuffer:Uint8Array=TQMisc.stringToUint8Array(str);

这里

原来写法

static stringToUint8Array(str:string):Uint8Array{
  let tmpUint8Array:Uint8Array=new Uint8Array(str.length);
  TQMisc.textEncoder.encodeIntoUint8Array(str,tmpUint8Array);
}

改为:

let newsBuffer:Uint8Array=TQMisc.stringToUint8Array(str,2*str.length);

包含中文,转成unit8array,每个字符串占2位unit8,那么2倍的buffer才足够,否则有一部分被截掉。

static stringToUint8Array(str:string,len?:number):Uint8Array{
  let tmpUint8Array:Uint8Array=new Uint8Array(str.length);
  if(len!=undefined){
    tmpUint8Array=new Uint8Array(len);
  }
  TQMisc.textEncoder.encodeIntoUint8Array(str,tmpUint8Array);
  return tmpUint8Array
}

更多关于HarmonyOS 鸿蒙Next writeSync 写文件读文件长度不一致问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这样就没问题了吗?

姓名: 张三

职位: 软件工程师

工作经验: 5年

技能: Python, Java, C++

联系方式: zhangsan@example.com

读写文件内容大部分是中文

针对HarmonyOS(鸿蒙)系统中writeSync写文件后读文件长度不一致的问题,这通常可能是由于以下几个原因导致的:

  1. 文件写入未完全刷新:在调用writeSync后,虽然数据被写入了文件系统的缓冲区,但可能尚未实际写入磁盘。如果随后立即读取文件,可能会读取到旧的数据或者部分数据。可以通过调用fsync或类似方法来确保数据被完全刷新到磁盘。

  2. 文件指针位置:在写入后读取文件前,需要确保文件指针(或称为文件游标)位于文件的开始位置。如果文件指针在写入后未被重置,读取操作将从当前文件指针位置开始,可能导致读取到的数据长度不正确。

  3. 并发访问:如果有多个进程或线程同时访问同一个文件,可能会导致数据不一致。确保文件访问的同步性,避免并发写入或读取冲突。

  4. 文件系统错误或损坏:检查文件系统是否存在错误或损坏,这可能导致文件读写操作异常。

检查以上几点,确保写入操作正确完成,文件指针位置正确,以及文件访问的同步性。如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部