求助!!!写文件遇到的问题

西热力江 2013-08-08 10:03:02



private void saveSetResult(int pos){
String filename = "system/media/bootlogo/logo_pos_record";
Log.d("BootAnimation", "write:"+Integer.toString(pos+1));
try {
RandomAccessFile out = new RandomAccessFile(filename, "rw");
out.seek(0);
out.writeBytes(Integer.toString(pos+1));
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

写文件的各种方法都试了。。。。。

在该文件保存setting下的某些设置,当保存完后平台10s内强制断电,然后重启,发现上次数据并未保存,
10s后再断电会保存成功,个人认为失败情况是因为数据还在缓冲区,没有真正写到文件中去,也有可能和文件位置有关????求教各位此问题如何解??????
感谢就不说了,分数说明一切!!!


...全文
303 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
荒颜 2013-08-13
  • 打赏
  • 举报
回复
引用 17 楼 gq414047080 的回复:
[quote=引用 14 楼 tanwei4199 的回复:] [quote=引用 13 楼 woyaowenzi 的回复:] [quote=引用 11 楼 gq414047080 的回复:] [quote=引用 5 楼 woyaowenzi 的回复:] 试试下面的out.getFD().sync();,应该是可以的。

private void saveSetResult(int pos){
        String filename = "system/media/bootlogo/logo_pos_record";
        Log.d("BootAnimation", "write:"+Integer.toString(pos+1));
        try {
            RandomAccessFile out = new RandomAccessFile(filename, "rw");
            out.seek(0);
            out.writeBytes(Integer.toString(pos+1));
            out.getFD().sync();
            .........
验证后发现有点作用,大概在5s后就会保存,还是达不到要求啊。。。。。。[/quote] 说明你一次写入的内容太多了。你要循环着写。一次写入少一点,如1024*8个byte。 while(XXXX) { out.write(1024*8); out.getFD().sync(); }[/quote] 一个Integer能有多少.......估计还是考虑错方向了 问问懂底层驱动的 还有 只写这么点东西 不需要RandomAccessFile吧 简单的文件读写就够了 [/quote] 请问简单的文件操作是指什么方法?????[/quote] 就是普通的文件读写 new FileOutputStream 但是这个估计也不能解决你的问题 可能跟system分区有关系 其他的地方你写了不会需要重启的 是吧 这个分区比较特殊吧
woyaowenzi 2013-08-12
  • 打赏
  • 举报
回复
引用 11 楼 gq414047080 的回复:
[quote=引用 5 楼 woyaowenzi 的回复:] 试试下面的out.getFD().sync();,应该是可以的。

private void saveSetResult(int pos){
        String filename = "system/media/bootlogo/logo_pos_record";
        Log.d("BootAnimation", "write:"+Integer.toString(pos+1));
        try {
            RandomAccessFile out = new RandomAccessFile(filename, "rw");
            out.seek(0);
            out.writeBytes(Integer.toString(pos+1));
            out.getFD().sync();
            .........
验证后发现有点作用,大概在5s后就会保存,还是达不到要求啊。。。。。。[/quote] 说明你一次写入的内容太多了。你要循环着写。一次写入少一点,如1024*8个byte。 while(XXXX) { out.write(1024*8); out.getFD().sync(); }
西热力江 2013-08-12
  • 打赏
  • 举报
回复
引用 8 楼 l417584711 的回复:
flush and sync
flush用过,没效果啊。。。。。 请问sync如何用????
西热力江 2013-08-12
  • 打赏
  • 举报
回复
引用 5 楼 woyaowenzi 的回复:
试试下面的out.getFD().sync();,应该是可以的。

private void saveSetResult(int pos){
        String filename = "system/media/bootlogo/logo_pos_record";
        Log.d("BootAnimation", "write:"+Integer.toString(pos+1));
        try {
            RandomAccessFile out = new RandomAccessFile(filename, "rw");
            out.seek(0);
            out.writeBytes(Integer.toString(pos+1));
            out.getFD().sync();
            out.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         
    }
验证后发现有点作用,大概在5s后就会保存,还是达不到要求啊。。。。。。
西热力江 2013-08-12
  • 打赏
  • 举报
回复
引用 5 楼 woyaowenzi 的回复:
试试下面的out.getFD().sync();,应该是可以的。

private void saveSetResult(int pos){
        String filename = "system/media/bootlogo/logo_pos_record";
        Log.d("BootAnimation", "write:"+Integer.toString(pos+1));
        try {
            RandomAccessFile out = new RandomAccessFile(filename, "rw");
            out.seek(0);
            out.writeBytes(Integer.toString(pos+1));
            out.getFD().sync();
            out.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         
    }
权限问题不用考虑的。。。。。。 你说的方法肯定试过的。。。。。。
西热力江 2013-08-12
  • 打赏
  • 举报
回复
公司网络有限制,蛋疼,没法回复大家。。。。
西热力江 2013-08-12
  • 打赏
  • 举报
回复
引用 14 楼 tanwei4199 的回复:
[quote=引用 13 楼 woyaowenzi 的回复:] [quote=引用 11 楼 gq414047080 的回复:] [quote=引用 5 楼 woyaowenzi 的回复:] 试试下面的out.getFD().sync();,应该是可以的。

private void saveSetResult(int pos){
        String filename = "system/media/bootlogo/logo_pos_record";
        Log.d("BootAnimation", "write:"+Integer.toString(pos+1));
        try {
            RandomAccessFile out = new RandomAccessFile(filename, "rw");
            out.seek(0);
            out.writeBytes(Integer.toString(pos+1));
            out.getFD().sync();
            .........
验证后发现有点作用,大概在5s后就会保存,还是达不到要求啊。。。。。。[/quote] 说明你一次写入的内容太多了。你要循环着写。一次写入少一点,如1024*8个byte。 while(XXXX) { out.write(1024*8); out.getFD().sync(); }[/quote] 一个Integer能有多少.......估计还是考虑错方向了 问问懂底层驱动的 还有 只写这么点东西 不需要RandomAccessFile吧 简单的文件读写就够了 [/quote] 请问简单的文件操作是指什么方法?????
西热力江 2013-08-12
  • 打赏
  • 举报
回复
引用 15 楼 woyaowenzi 的回复:
[quote=引用 14 楼 tanwei4199 的回复:] [quote=引用 13 楼 woyaowenzi 的回复:] [quote=引用 11 楼 gq414047080 的回复:] [quote=引用 5 楼 woyaowenzi 的回复:] 试试下面的out.getFD().sync();,应该是可以的。

private void saveSetResult(int pos){
        String filename = "system/media/bootlogo/logo_pos_record";
        Log.d("BootAnimation", "write:"+Integer.toString(pos+1));
        try {
            RandomAccessFile out = new RandomAccessFile(filename, "rw");
            out.seek(0);
            out.writeBytes(Integer.toString(pos+1));
            out.getFD().sync();
            .........
验证后发现有点作用,大概在5s后就会保存,还是达不到要求啊。。。。。。[/quote] 说明你一次写入的内容太多了。你要循环着写。一次写入少一点,如1024*8个byte。 while(XXXX) { out.write(1024*8); out.getFD().sync(); }[/quote] 一个Integer能有多少.......估计还是考虑错方向了 问问懂底层驱动的 还有 只写这么点东西 不需要RandomAccessFile吧 简单的文件读写就够了 [/quote] 我也很奇怪,为何楼主不是直接写文件,用这种方式到底在写啥?[/quote] 公司网络受限,不能回复,不好意思啊。。。。 此api是只保存一个整数,不用cotentprovider或其他的原因是保存的数据是在开机时来读取,这时android的service都还没有起来,所有只能以文件方式来保存。java的几种文件操作都试过了。。。。。 另外,自己用C也谢了一个测试的程序,发现还没有这种方法的存储速度快。。。。。难道无解??????? 首先我说下数据是用户操作时上层保存的,是在java部分实现的,不知道二位说的更简单的方式是什么???
woyaowenzi 2013-08-12
  • 打赏
  • 举报
回复
引用 14 楼 tanwei4199 的回复:
[quote=引用 13 楼 woyaowenzi 的回复:] [quote=引用 11 楼 gq414047080 的回复:] [quote=引用 5 楼 woyaowenzi 的回复:] 试试下面的out.getFD().sync();,应该是可以的。

private void saveSetResult(int pos){
        String filename = "system/media/bootlogo/logo_pos_record";
        Log.d("BootAnimation", "write:"+Integer.toString(pos+1));
        try {
            RandomAccessFile out = new RandomAccessFile(filename, "rw");
            out.seek(0);
            out.writeBytes(Integer.toString(pos+1));
            out.getFD().sync();
            .........
验证后发现有点作用,大概在5s后就会保存,还是达不到要求啊。。。。。。[/quote] 说明你一次写入的内容太多了。你要循环着写。一次写入少一点,如1024*8个byte。 while(XXXX) { out.write(1024*8); out.getFD().sync(); }[/quote] 一个Integer能有多少.......估计还是考虑错方向了 问问懂底层驱动的 还有 只写这么点东西 不需要RandomAccessFile吧 简单的文件读写就够了 [/quote] 我也很奇怪,为何楼主不是直接写文件,用这种方式到底在写啥?
荒颜 2013-08-12
  • 打赏
  • 举报
回复
引用 13 楼 woyaowenzi 的回复:
[quote=引用 11 楼 gq414047080 的回复:] [quote=引用 5 楼 woyaowenzi 的回复:] 试试下面的out.getFD().sync();,应该是可以的。

private void saveSetResult(int pos){
        String filename = "system/media/bootlogo/logo_pos_record";
        Log.d("BootAnimation", "write:"+Integer.toString(pos+1));
        try {
            RandomAccessFile out = new RandomAccessFile(filename, "rw");
            out.seek(0);
            out.writeBytes(Integer.toString(pos+1));
            out.getFD().sync();
            .........
验证后发现有点作用,大概在5s后就会保存,还是达不到要求啊。。。。。。[/quote] 说明你一次写入的内容太多了。你要循环着写。一次写入少一点,如1024*8个byte。 while(XXXX) { out.write(1024*8); out.getFD().sync(); }[/quote] 一个Integer能有多少.......估计还是考虑错方向了 问问懂底层驱动的 还有 只写这么点东西 不需要RandomAccessFile吧 简单的文件读写就够了
西热力江 2013-08-09
  • 打赏
  • 举报
回复
顶!!!!!!!!!!!!!!!!!!!!!!1
西热力江 2013-08-09
  • 打赏
  • 举报
回复
顶起!!!!!!!!!!!!!!!!!!!!!!!!!!!1
螃蟹变异了 2013-08-09
  • 打赏
  • 举报
回复
没有读写那个目录的权限吧
aSysBang 2013-08-09
  • 打赏
  • 举报
回复
flush and sync
veardn 2013-08-09
  • 打赏
  • 举报
回复
linux下有方法直接写到外部存储,android里不清楚
乾坤幻影 2013-08-09
  • 打赏
  • 举报
回复
对文件目录 system/media/是否有读写权限? write之后不需要flush就直接close是否合理? 表示没有用过RandomAccessFile(),只用过FileOutputStream。
woyaowenzi 2013-08-09
  • 打赏
  • 举报
回复
试试下面的out.getFD().sync();,应该是可以的。

private void saveSetResult(int pos){
        String filename = "system/media/bootlogo/logo_pos_record";
        Log.d("BootAnimation", "write:"+Integer.toString(pos+1));
        try {
            RandomAccessFile out = new RandomAccessFile(filename, "rw");
            out.seek(0);
            out.writeBytes(Integer.toString(pos+1));
            out.getFD().sync();
            out.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         
    }
yuebanmumu 2013-08-08
  • 打赏
  • 举报
回复
RandomAccessFile读/写一个字节需对磁盘进行一次I/O操作 http://www.jspcn.net/htmlnews/11049335395151218.html这个不知道对你有帮助没

80,349

社区成员

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

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