首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存文件会使用无法解释的大量存储空间

保存文件会使用无法解释的大量存储空间
EN

Stack Overflow用户
提问于 2017-08-21 19:45:55
回答 2查看 45关注 0票数 0

在我的应用程序中,用户可以使用chooser Intent选择一个文件,然后出于安全原因,该文件将被“导入”到应用程序中并保存在内部存储中。这一切都运行得很好,在一些设备上仍然有效,但例如在Android 7.1.1上的Google Pixel上,它只对前4-6个文件正常工作,之后表现得非常奇怪。性能急剧下降,所以我检查了我的存储使用情况,发现它在持续增长,尽管我应该保存的文件不到1mb。导入文件将导致我的应用程序占用的存储量超过500mb或更高。我似乎找不到原因。

我用来保存文件的方法是在异步后台任务中调用的:

代码语言:javascript
复制
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
OutputStream fos = new FileOutputStream(file);
int size = 0;
InputStream fis = getContentResolver().openInputStream(uri);
try{
     bis = new BufferedInputStream(fis);
     bos = new BufferedOutputStream(fos);
     byte[] buf = new byte[1024];
     int len = 1024;
     while((len = bis.read(buf,0,len)) != -1){
         bos.write(buf,0,len);
         size = size+1024;
         Log.v("Bytes written",""+size);
     }
}catch (IOException e){
     e.printStackTrace();
}finally {
     try{
         if(bis != null) bis.close();
         if(bos != null) bos.close();
         if(fis != null) fis.close();
         if(fos != null) fos.close();
     }catch(IOException e){
          e.printStackTrace();
     }
}

return Uri.fromFile(file);

然后将此函数返回的Uri保存在SQLite数据库中,供以后使用。

我很欣赏各种关于内存使用情况的提示。

顺便说一句,这并不是因为手机更新了,也不是因为我的代码有任何变化,因为我上次测试它的时候它是工作的,从那以后我就没有改变过任何东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-21 21:10:45

我有一个额外的方法,可以将索引附加到多次添加的文件中,例如。"file.pdf“"file1.pdf”"file2.pdf“。这种方法不正确,导致创建新文件和附加索引的无限循环。我通过更改此方法来避免循环,从而设法解决了这个问题。

回想起来,我应该在我的问题中包括这一点。

票数 0
EN

Stack Overflow用户

发布于 2017-08-21 20:09:33

我看到了几个需要纠正的地方:

1) write方法的签名似乎不正确,如果从缓冲区写入,则应使用write(buff, offset, length)

2)你只读入缓冲区一次,所以写出缓冲区一次就足够了。

3)如果需要多次读取缓冲区,并多次写出值,请使用while,而不是do while。您不能保证读取操作成功。

Ref to write method in Android Developer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45796317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档