HarmonyOS 鸿蒙Next中读文件时用ArrayBuffer接收数据,转换string后JSON使用问题

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

HarmonyOS 鸿蒙Next中读文件时用ArrayBuffer接收数据,转换string后JSON使用问题

代码如下:

let file = await fileIo.open(filePath, fileIo.OpenMode.READ_ONLY)

let arrayBuffer = new ArrayBuffer(8192);
await fileIo.read(file.fd, arrayBuffer)

buffer.from(arrayBuffer).toString().split(new RegExp(`\r\n|\n|\r`)).forEach((line) => {
  let options: http.HttpRequestOptions = {
    method: http.RequestMethod.POST,
    extraData: {
      "input": line,
    },
    header: { 'Content-Type': 'application/json' },
    readTimeout: 60000,
    connectTimeout: 5000
  }

  console.info(`line:${line}, options:${JSON.stringify(options)}`)
})

最后一条打印如下:

![cke_8217.png](data-originheight=“53” data-originwidth=“1768” src="cmtybbs/105/179/415/0390086000105179415.20241223193847.19115228673303275995680760338455:50001231000000:2800:35BCDF6641B3A80E36AFA943E3B4349DCC27140AD226776845ED7B668DB6229F.png)

怀疑是ArrayBuffer中未使用的空间被JSON一起识别了,请教一下这如何解决


更多关于HarmonyOS 鸿蒙Next中读文件时用ArrayBuffer接收数据,转换string后JSON使用问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

您好!

目前系统没开放可变长的buffer,需要自己构建;

我这边写了一个demo;其中/test.txt为:

ArrayBuffer是预先申请的固定空间大小的buffer,并填充了一些数据,将ArrayBuffer转换为string类型,赋值给object中的字段,然后使用JSON把object转换成字符串。 END


如果直接定义arrayBuffer大小,那就回有空值一块返回,我们需要处理一下,请您参考以下demo;

```javascript
export class bufferWithLength {
  public arrays: ArrayBuffer | null = null;
  public lengths: number = 0

  constructor(arrays: ArrayBuffer, lengths: number) {
    this.arrays = arrays
    this.lengths = lengths
  }
}

function mergeArrayBuffer(buffers: bufferWithLength[]) {
  let size = 0
  for (let i = 0; i < buffers.length; i++) {
    size += buffers[i].lengths
  }
  let temp = new Uint8Array(size)
  let length = 0
  for (let i = 0; i < buffers.length; i++) {
    temp.set(new Uint8Array((buffers[i].arrays as ArrayBuffer).slice(0, buffers[i].lengths)), length)
    length += buffers[i].lengths
  }
  return temp.buffer as ArrayBuffer
}

async function savePhotoToGallery(context: common.UIAbilityContext) {
  let filesDir = context.filesDir;
  let file = await fileIo.open(filesDir + '/test.txt', fileIo.OpenMode.READ_ONLY)

  let readLen = 100
  let buffers: bufferWithLength[] = []
  let offset: number = 0

  while (readLen == 100) {
    let arrayBuffer = new ArrayBuffer(100);
    let readOptions: ReadOptions = { offset: offset, length: arrayBuffer.byteLength };
    readLen = fs.readSync(file.fd, arrayBuffer, readOptions);
    offset += readLen
    buffers.push(new bufferWithLength(arrayBuffer, readLen))
  } // 经验证可以得到所有信息,通过marge获得单一完整ArrayBuffer
  let res = mergeArrayBuffer(buffers) // 验证一下此arraybuffer读取到的内容
  let buf = buffer.from(res, 0, res.byteLength)
  console.info("the content of file: " + buf.toString())

  buf.toString().split(`\r\n|\n|\r`).forEach((line) => {
    let options: http.HttpRequestOptions = {
      method: http.RequestMethod.POST,
      extraData: {
        "input": line,
      },
      header: { 'Content-Type': 'application/json' },
      readTimeout: 60000,
      connectTimeout: 5000
    }
    console.info(`line:${line}, options:${JSON.stringify(options)}`)
    fs.closeSync(file);
  })
}

该demo 打印为:

line:ArrayBuffer是预先申请的固定空间大小的buffer,并填充了一些数据,将ArrayBuffer转换为string类型,赋值给object中的字段,然后使用JSONobject转换成字符串。, options:{"method":"POST","extraData":{"input":"ArrayBuffer是预先申请的固定空间大小的buffer,并填充了一些数据,将ArrayBuffer转换为string类型,赋值给object中的字段,然后使用JSON把object转换成字符串。"},"header":{"Content-Type":"application/json"},"readTimeout":60000,"connectTimeout":5000}
line:END, options:{"method":"POST","extraData":{"input":"END"},"header":{"Content-Type":"application/json"},"readTimeout":60000,"connectTimeout":5000}

更多关于HarmonyOS 鸿蒙Next中读文件时用ArrayBuffer接收数据,转换string后JSON使用问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


您好!想问下您期望得到什么效果?可以进一步描述下您想通过什么方法,达到什么样的数据类型?

转换string后JSON,JSON期望是?

ArrayBuffer是预先申请的固定空间大小的buffer,并填充了一些数据,将ArrayBuffer转换为string类型,赋值给object中的字段,然后使用JSON把object转换成字符串。

期望:JSON转换后的字符串与原object中的字段一致,ArrayBuffer中未使用的空间不应该展示出来

实际:JSON转换后的字符串后面包含大量0值,

收到!我这边按您的思路看下,

在HarmonyOS鸿蒙Next中,使用ArrayBuffer接收文件数据后,可以通过TextDecoder将其转换为字符串。如果字符串是JSON格式,可以直接使用JSON.parse方法将其解析为JavaScript对象。例如:

let arrayBuffer = ...; // 从文件读取的ArrayBuffer数据
let decoder = new TextDecoder('utf-8');
let jsonString = decoder.decode(arrayBuffer);
let jsonObject = JSON.parse(jsonString);

确保TextDecoder的编码格式与文件编码一致,通常为utf-8。如果JSON字符串格式不正确,JSON.parse会抛出异常。

在HarmonyOS鸿蒙Next中,使用ArrayBuffer接收文件数据后,可以通过TextDecoder将其转换为字符串,再通过JSON.parse解析为JSON对象。代码示例如下:

let arrayBuffer = ...; // 从文件读取的ArrayBuffer
let decoder = new TextDecoder('utf-8');
let jsonString = decoder.decode(arrayBuffer);
let jsonObject = JSON.parse(jsonString);

注意确保文件编码为UTF-8,否则可能导致解析错误。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!