报错IOException: Read-only file system问题解决方法

问题描述

###原始代码

//初始化这个钱包实例
val kit = new WalletAppKit(params,new File("."),filePrefix);

报错提示

12-04 14:47:45.816 8978-9037/space.edge.d.wallet E/@|amework.CrashHandler: 拦截异常:java.lang.RuntimeException,线程:WalletAppKit STARTING
java.lang.RuntimeException: java.io.IOException: Read-only file system
at com.google.common.base.Throwables.propagate(Throwables.java:160)
at com.google.common.util.concurrent.AbstractIdleService$2$1.run(AbstractIdleService.java:58)
at com.google.common.util.concurrent.Callables$3.run(Callables.java:95)
at java.lang.Thread.run(Thread.java:776)
Caused by: java.io.IOException: Read-only file system
at java.io.UnixFileSystem.createFileExclusively0(Native Method)
at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:280)
at java.io.File.createNewFile(File.java:948)
at java.io.File.createTempFile(File.java:1862)
at org.bitcoinj.wallet.Wallet.saveToFile(Wallet.java:1337)
at org.bitcoinj.kits.WalletAppKit.createOrLoadWallet(WalletAppKit.java:375)
at org.bitcoinj.kits.WalletAppKit.startUp(WalletAppKit.java:273)
at com.google.common.util.concurrent.AbstractIdleService$2$1.run(AbstractIdleService.java:54)
at com.google.common.util.concurrent.Callables$3.run(Callables.java:95)
at java.lang.Thread.run(Thread.java:776)

解决思路

增加文件读写权限的申请

在项目文件​​AndroidManifest.xml​​中增加

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

再次编译后还是不行。

修改创建文件位置

将​​.​​​改成​​context.getFilesDir().getPath().toString()​

再次编译,运行成功。

进阶改良

为了方便删除原来的文件

在开发过程中,我们要经常去删除应用数据,那么为了方便,我们可以先把对应文件夹里的数据删掉,再运行我们的代码生成新的数据。

这样可以增加开发效率。

下面是增加的删除代码

def delete(dir:File):Unit = {
if(dir.exists()){
dir.listFiles().foreach { f =>
if (f.isFile) f.delete()
else delete(f)
}
}
}
delete(directory)

简化目标文件夹的写法

引用scala的库,使文件夹更具有可读性

import sbt.Path.richFile
val directory = context.getFilesDir / "wallet"

注意的是​​/​​是​方法​。