You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法读取Assets文件夹文件?Web3j WalletUtils加载失败求助

Android中使用Web3j WalletUtils加载Assets目录下钱包文件失败的解决方案

我刚碰到过完全一样的问题!你遇到的核心问题是Android Assets目录下的文件并不存在于设备的常规文件系统路径中,而WalletUtils.loadCredentials()方法的字符串路径/File参数是针对设备本地文件系统的,所以不管你传字符串路径还是File对象,都会找不到APK包内的Assets文件。

问题重现

你调用的代码:

currentWallet = WalletUtils.loadCredentials(password , "/some.json");

抛出的关键错误:

E/Main Activity: onCreate: java.io.FileNotFoundException: keystore.json (No such file or directory)

正确的解决方案

我们需要先通过Android的AssetManager获取Assets文件的输入流,再手动解析为WalletFile对象,最后生成Credentials。具体步骤如下:

  1. 获取AssetManager实例(在Activity或Fragment中):
AssetManager assetManager = getAssets();
  1. 打开Assets中钱包文件的输入流:
InputStream inputStream = assetManager.open("keystore.json"); // 这里填Assets里的文件名,不需要前置斜杠
  1. 用Jackson的ObjectMapper将输入流解析为WalletFile对象:
ObjectMapper objectMapper = new ObjectMapper();
WalletFile walletFile = objectMapper.readValue(inputStream, WalletFile.class);
  1. 解密钱包文件生成Credentials:
Credentials credentials = Credentials.create(Wallet.decrypt(password, walletFile));

完整代码示例

try {
    AssetManager assetManager = getAssets();
    InputStream inputStream = assetManager.open("keystore.json");
    ObjectMapper objectMapper = new ObjectMapper();
    WalletFile walletFile = objectMapper.readValue(inputStream, WalletFile.class);
    Credentials currentWallet = Credentials.create(Wallet.decrypt(password, walletFile));
    // 这里可以使用currentWallet进行后续链上操作
} catch (IOException | CipherException e) {
    e.printStackTrace();
    // 处理异常,比如密码错误、文件读取失败等
}

为什么之前的方法不行?

  • 直接传字符串路径"/some.json":这个路径指向的是设备根目录,而非Assets目录,自然找不到目标文件。
  • 传File对象:Assets文件是打包在APK内部的资源,没有对应的本地文件系统File对象可以直接引用,必须通过AssetManager访问其输入流。

内容的提问来源于stack exchange,提问作者swatarianess

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:28:17