关于APP写入文件内容为空的问题

加盾男爵 2018-12-25 03:11:58
现在APP有个功能,需要向./Android/obb/xxx.txt文件写入数据,其中xxx.txt文件名为系统当前时间
写入的内容包含在一个list<string>,其中每个String大约为100字节

try {
FileOutputStream out = new FileOutputStream(fnm);
String txt = "";
for(String A : deviceNameList) {
txt += A;
txt += "\r\n";
}
byte[] message = txt.getBytes();
out.write(message);
out.close();
Toast.makeText(ExportDataActivity.this,"导出数据完成",Toast.LENGTH_SHORT).show();
}
catch(Exception e) {
Log.e("e", e.getMessage());
}

当数据源list比较少的时候,10-30个测试结果正常,瞬间能完成

然后把数据List<String>的个数提高到2000个(实际运行最大值可能会打到3000以上),然后再用以上代码写入文件时,耗时大约8-10秒(测试手机为小米8),然后通过电脑查看./Android/obb/目录下的文件(app生产的文件为txt格式),发现写入文件大小为0kb,打开文件内容为空。

开始以为一次写入的内容过多,所以想分次写入,一次写100条

try {
FileOutputStream out = new FileOutputStream(fnm);
String txt = "";
int cs = 0;
int bufferSize = 100 ; //每次写入100条数据
for(String A : deviceNameList) {
txt += A;
txt += "\r\n";

++cs;
if(cs == bufferSize) //每100条写入
{
byte[] message = txt.getBytes();
out.write(message);
cs = 0;
txt = "";
}
}
byte[] message = txt.getBytes();
out.write(message);
out.close();
Toast.makeText(ExportDataActivity.this,"导出数据完成",Toast.LENGTH_SHORT).show();
}
catch(Exception e) {
Log.e("e", e.getMessage());
}


然后再次运行,写入时间在1秒内完成,但发现文件只能写入400条左右,每次略有不同
然后我又把每次写入的条目增加到500,既上面的bufferSize = 500;然后运行,写入时间大约2-3秒,但打开文件,内容为空

我想问下这个问题该怎么解决?
...全文
534 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
王能 2018-12-26
  • 打赏
  • 举报
回复
还有一个:没有测试如果没权限会出现什么情况,你可以试试
王能 2018-12-26
  • 打赏
  • 举报
回复
我把你的代码在电脑上运行了一遍,完全没有问题 你再确认一下以下几点: 1.你的deviceNameList有没有数据 2.你的输出路径对不对 不需要瞎猜说肯定,用log或者断点说话
加盾男爵 2018-12-26
  • 打赏
  • 举报
回复
引用 6 楼 王能 的回复:
2000条的时候数据导入完成这句话打印出来了?
是滴,而且打印我也没有放到子线程里,所以不写完肯定不会执行下面的Toast的
王能 2018-12-26
  • 打赏
  • 举报
回复
2000条的时候数据导入完成这句话打印出来了?
加盾男爵 2018-12-26
  • 打赏
  • 举报
回复
引用 4 楼 王能 的回复:
文件为空,肯定走异常了,你看看日志就知道了,以后记住第一条是看日志
每异常。。。这段代码本身就写在try块里,没捕捉到异常,AndroidStudio也没有异常日志
王能 2018-12-25
  • 打赏
  • 举报
回复
文件为空,肯定走异常了,你看看日志就知道了,以后记住第一条是看日志
加盾男爵 2018-12-25
  • 打赏
  • 举报
回复
引用 2 楼 jklwan 的回复:
list放3000条数据……如果每一条数据都很大的话,大概率会崩溃
每个String大约100字节,3000个总计才300kb,这个对于list来说小意思吧
jklwan 2018-12-25
  • 打赏
  • 举报
回复
list放3000条数据……如果每一条数据都很大的话,大概率会崩溃
jklwan 2018-12-25
  • 打赏
  • 举报
回复
一条一条写就行了,而且如果每条太长也可以分开写,byte不能放太长的数据。

                FileOutputStream out = new FileOutputStream(fie);
                for (String A : deviceNameList) {
                    String txt = A + "\r\n";
                    byte[] message = txt.getBytes(); // 可以分开写入:使用txt.length判断长度,使用subString来分段写入。
                    out.write(message);
                }
                out.close();

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧