HarmonyOS 鸿蒙Next中读文件时用ArrayBuffer接收数据,转换string后JSON使用问题
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)}`)
})
最后一条打印如下:

怀疑是ArrayBuffer中未使用的空间被JSON一起识别了,请教一下这如何解决
更多关于HarmonyOS 鸿蒙Next中读文件时用ArrayBuffer接收数据,转换string后JSON使用问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
您好!
目前系统没开放可变长的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中的字段,然后使用JSON把object转换成字符串。, 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,否则可能导致解析错误。