1***@163.com
1***@163.com
  • 发布:2026-06-09 11:19
  • 更新:2026-06-09 11:20
  • 阅读:31

数据流转换问题

分类:uni-app

try {
const bytes = [];
let intValue = 0;
let byteCount = 0;
console.log('正在读取字节...');
while (true) {
intValue = plus.android.invoke(inputStream, 'read');
if (intValue === -1) {
console.log('到达文件结尾');
break;
}
bytes.push(intValue & 0xFF);
byteCount++;
if (byteCount % 1000 === 0) {
console.log(已读取 ${byteCount} 字节);
}
}

问题:plus.android.invoke(inputStream, 'read'); 只有一次读取一个字节才勉强使用,如何一次读取1024个字节或者更多。试过好多写法都不能正常运行。

2026-06-09 11:19 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

针对你使用 plus.android.invoke(inputStream, 'read') 只能逐字节读取的问题,核心原因在于 plus.android.invoke 在处理 byte[] 参数时存在兼容性限制,无法正确传递字节数组参数。这是 Native.js 调用 Java 方法的一个已知限制。

解决方案

方案一:使用 Uint8Array 配合 ArrayBuffer 接收批量数据

尝试通过 plus.android.invoke 调用 read(byte[] b, int off, int len) 方法,但需要正确创建 Java 的 byte[] 对象:

// 创建 Java byte[] 对象  
const ByteArray = plus.android.importClass('java.io.ByteArray');  
// 或者  
const ByteArray = plus.android.getAttribute(plus.android.runtimeMainActivity(), 'byte[]');  

// 创建指定大小的字节数组  
const bufferSize = 1024;  
const buffer = plus.android.newObject('byte[]', bufferSize);  

// 调用 read(byte[] b) 方法  
const bytesRead = plus.android.invoke(inputStream, 'read', buffer);  

if (bytesRead > 0) {  
    // 将 Java byte[] 转换为 JavaScript ArrayBuffer  
    const jsArray = [];  
    for (let i = 0; i < bytesRead; i++) {  
        jsArray.push(plus.android.invoke(buffer, 'get', i));  
    }  
    // 使用 jsArray 进行处理  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

方案二:使用 UTS 原生插件(推荐)

由于 Native.js 的限制,建议使用 UTS 插件进行原生开发,性能更好且没有参数传递问题:

// UTS 插件中可以直接操作字节数组  
import { FileInputStream, ByteArrayOutputStream } from 'java.io';  

export function readFileInChunks(filePath: string, chunkSize: number = 1024): Array<number> {  
    const fis = new FileInputStream(filePath);  
    const baos = new ByteArrayOutputStream();  
    const buffer = new ByteArray(chunkSize);  

    let bytesRead: number;  
    while ((bytesRead = fis.read(buffer)) !== -1) {  
        baos.write(buffer, 0, bytesRead);  
    }  

    fis.close();  
    const result = baos.toByteArray();  
    baos.close();  

    // 转换为 JavaScript 数组返回  
    const jsArray: Array<number> = [];  
    for (let i = 0; i < result.length; i++) {  
        jsArray.push(result[i]);  
    }  
    return jsArray;  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

方案三:使用 ByteArrayOutputStream 批量缓冲

如果必须使用 Native.js,可以尝试以下变通方法:

const FileInputStream = plus.android.importClass('java.io.FileInputStream');  
const ByteArrayOutputStream = plus.android.importClass('java.io.ByteArrayOutputStream');  

const fis = new FileInputStream(fileDescriptor);  
const baos = new ByteArrayOutputStream();  
const buffer = plus.android.newObject('byte[]', 1024);  

let bytesRead;  
while ((bytesRead = plus.android.invoke(fis, 'read', buffer)) !== -1) {  
    plus.android.invoke(baos, 'write', buffer, 0, bytesRead);  
}  

// 获取所有数据  
const allBytes = plus.android.invoke(baos, 'toByteArray');

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

相关插件推荐

如果需要进行复杂的字节处理,可以考虑以下插件市场资源:

注意事项

  1. 性能考虑:逐字节读取在文件较大时性能很差,强烈建议使用批量读取方案
  2. 内存管理:注意及时关闭流对象,避免内存泄漏
  3. UTS 插件优势:对于需要高效字节操作的场景,UTS 插件是最佳选择,可以直接使用 Kotlin/Java 原生语法,没有参数传递限制
内容为 AI 生成,仅供参考

要回复问题请先登录注册