skylankong
skylankong
  • 发布:2026-03-01 01:27
  • 更新:2026-03-01 01:28
  • 阅读:10

如何不按字节读取二进制文件

分类:uni-app
                // 使用FileDescriptor创建FileInputStream  
                const FileInputStream = plus.android.importClass('java.io.FileInputStream');  
                const fis = new FileInputStream(fileDescriptor);  
                console.log('FileInputStream created:', fis);  

                // 读取数据到ByteArrayOutputStream  
                const baos = new ByteArrayOutputStream();  

                // 使用单个字节读取方式(唯一可靠的方法)  
                let byteValue;  
                let totalBytes = 0;  
                let loopCount = 0;  

                console.log('Starting to read file byte by byte...');  
                while (true) {  
                    loopCount++;  

                    // 使用invoke调用read()方法读取单个字节  
                    byteValue = plus.android.invoke(fis, 'read');  

以上代码是片段,就是目前测试,能逐字节读取二进制文件,但是太慢,有没有办法可以快读读取二进制文件?
目前使用的结果是 uni-app 的 plus.android.invoke 无法正确处理带有 byte[] 参数的 Java 方法。

2026-03-01 01:27 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

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

在 uni-app 的 App(Android)端,如果 plus.android.invoke 无法正确传递 byte[] 参数,导致只能逐字节读取文件,性能极低,可以改用以下两种方式实现快速读取二进制文件


✅ 推荐方案:使用 plus.io + FileReader(不依赖 invoke

// 获取文件对象  
plus.io.resolveLocalFileSystemURL(filePath, (entry) => {  
  entry.file((file) => {  
    const reader = new plus.io.FileReader();  
    reader.onloadend = (e) => {  
      const arrayBuffer = e.target.result; // 直接拿到 ArrayBuffer  
      console.log('读取成功,字节长度:', arrayBuffer.byteLength);  
    };  
    reader.readAsArrayBuffer(file); // 一次性读取为 ArrayBuffer  
  });  
});
  • ✅ 不依赖 plus.android.invoke,避免 byte[] 参数传递问题
  • ✅ 支持一次性读取整个文件为 ArrayBuffer,性能远高于逐字节读取
  • ✅ 适用于 Android App 平台(非鸿蒙)

⚠️ 替代方案:使用 uni.getFileSystemManager().readFile

const fs = uni.getFileSystemManager();  
fs.readFile({  
  filePath: filePath,  
  success: (res) => {  
    const arrayBuffer = res.data; // ArrayBuffer  
    console.log('读取成功,字节长度:', arrayBuffer.byteLength);  
  },  
  fail: (err) => {  
    console.error('读取失败:', err);  
  }  
});
  • ⚠️ 注意:该方法在 鸿蒙平台 不支持(知识库中明确标注为 -),仅限 Android/iOS App 使用
  • ✅ 无需 plus.android.invoke,兼容性好

❌ 不推荐:继续使用 plus.android.invoke + FileInputStream.read(byte[])

你当前的方式:

plus.android.invoke(fis, 'read', byteArray);

由于 plus.android.invoke 无法正确识别 byte[] 类型参数,会导致调用失败或行为异常,不建议继续使用


✅ 总结建议

方案 是否推荐 是否支持 Android App 是否支持鸿蒙
plus.io.FileReader.readAsArrayBuffer ✅ 推荐 ✅ 支持 ❌ 不支持
uni.getFileSystemManager().readFile ✅ 推荐 ✅ 支持 ❌ 不支持
plus.android.invoke + read(byte[]) ❌ 不推荐 ❌ 有兼容性问题 ❌ 不支持

如需在鸿蒙平台读取二进制文件,请使用 uts 插件鸿蒙原生 API,当前知识库中暂无相关示例。

内容为 AI 生成,仅供参考

要回复问题请先登录注册