这几天关于文件读写的bug弄得头疼,,,,,,,,明明写的东西在eclipse上面运行的好好的,开始使用Android Studio写,同样的格式就出现了bug!!!!!
private CityDB openCityDB(){
//文件路径
String path = "/data"
+ Environment.getDataDirectory().getAbsolutePath()
+ File.separator + "com.kai.temperature" + File.separator
+ CityDB.CITY_DB_NAME;
File db = new File(path);
if (!db.exists()||getSharePreferenceUtil().getVersion() < 0) {
L.i("db is not exists");
try {
//获取Assets文件
InputStream is = getAssets().open(CityDB.CITY_DB_NAME);
FileOutputStream fos = new FileOutputStream(db);
int len = -1;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
fos.flush();
}
fos.close();
is.close();
getSharePreferenceUtil().setVersion(1);// 用于管理数据库版本,如果数据库有重大更新时使用
} catch (IOException e) {
e.printStackTrace();
T.showLong(mApplication, e.getMessage());
L.e("kai", e.getMessage());
System.exit(0);
}
}
return new CityDB(this, path);
}
上面这段代码就是获取assets文件下的city.db然后通过文件FileOutputStream写入文件。
在eclipse可以正常运行,但是在Android Studio下面,就会报出
/data/data/com.kai.temperature/city.db: open failed: ENOENT (No such file or directory)
纳尼,找不到文件!!!!
而且有时候还是 06-02 11:27:46.170 3637-3637/? I/kai: /data/data/com.kai.temperature/city.db: open failed: EACCES (Permission denied)
What the fuck !!! 权限这种东西我当然早就加了,那为什么会找不到文件?或者是权限没有加呢?
我们先说说这里的读写权限:
那么肯定是我们的写法有问题啊。
我觉得这可能Android Studio太严格了,这种写法会出bug,比如Android Studio下关于.9.png严格的审查机制。
在翻阅了大量博客,还有StackOverFlow网站,我看出来了。
我觉得这里可能的问题就是:
1.文件权限没有加(可是我是真的真的加了)
2.文件路径不对,文件路径越级添加,比如:你想直接在A文件目录下添加B文件,可是A文件是不存在的,所以你得一级一级来添加。
3.不知道了。
按照这个想法,我重新改了一下代码。果然问题就解决了,可是又出现了新的bug, Oh my god ........
这是我改后的代码,后面的bug下次在总结吧。
private CityDB openCityDB(){
//创建一级文件目录
String cachePath="/data" + Environment.getDataDirectory().getAbsolutePath()
+ File.separator+"com.kai.temperature";
File cacheFile=new File(cachePath);//创建文件路径
cacheFile.mkdir();
//创建复制数据库的目录
File db=new File(cacheFile,CityDB.CITY_DB_NAME);
String path=cachePath+File.separator + CityDB.CITY_DB_NAME;
if(!db.exists() || getSharePreferenceUtil().getVersion()<0){
L.i("db is not exists!!!!");
try {
InputStream is = getAssets().open(CityDB.CITY_DB_NAME);
FileOutputStream fos=new FileOutputStream(db);
int len=-1;
byte[] buffer=new byte[1024];
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
fos.flush();
}
fos.close();
is.close();
getSharePreferenceUtil().setVersion(1);
}catch (IOException e){
L.e("kai",e.getMessage());
e.printStackTrace();
System.exit(0);
}
}
return new CityDB(this,path);
}
以后得牢记呀,目录最好一级一级添加,步子得一步一步迈,否则扯着蛋啊!!!!!!