博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Day02-文件操作-登陆示例
阅读量:6281 次
发布时间:2019-06-22

本文共 3122 字,大约阅读时间需要 10 分钟。

需求:登陆

第1步:搭建UI

    采用混合布局,布局搭建好之后如下所示:

    

第2步:准备工作

    根据javaWeb中的mvc+dao的开发模式,创建好包名和类。

    

第3步:业务逻辑

    就是一个存值和取值的过程,也可以说是读写文件的过程。

    注意在获取路径的时候,不要使用硬性编码(hardcode)。

关键知识点梳理:

    

    ▇获取应用程序的files私有目录:"/data/data/应用程序包名/files"

         方式1:得路径,再得到流。

            File context.getFilesDir()

     <--  补充一下 File context.getCacheDir()    表示得到缓存目录/caches-->

        方式2:直接得到流

           文件读取流:InputStream in = context.openFileInput("文件名(带后缀)");        

           文件写入流:OutputStream out  = context.openFileOutput("user.txt",                                    Context.MODE_PRIVATE);//有2个参数,第2个参数

                        表示文件的权限。

        

            

    ▇获取设备的SD卡目录:

        →1.注意要配置sd的访问权限。

            

        →2.判断sd卡的状态。    

            

1
2
3
4
5
6
7
String storageState = Environment.getExternalStorageState();
if
(!storageState.equals(Environment.MEDIA_MOUNTED))
{
    
//如果挂起,提示用户sd卡不存在。
    
Toast.makeText(mainContext, 
"sd卡不存在"
, Toast.LENGTH_SHORT).show();
    
return
;
}

        →3.判断sd卡空间容量信息。

        

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//假如SD卡小于200M就提示内存不足
//首先获取外部存储的目录 File对象
    
File file_storage = Environment.getExternalStorageDirectory();
//通过File对象来获得外部存储的可用空间
    
Long useable_storage = file_storage.getUsableSpace();
    
//将字节转换成易于阅读的M表示方法
        
String useable_storage_mstr = Formatter.formatFileSize(mainContext,useable_storage);
                         
//得到外部存储的总空间
    
Long total_storage = file_storage.getTotalSpace();
    
String total_storage_mstr = Formatter.formatFileSize(mainContext, total_storage);
        
if
(useable_storage < 
1024
*
1024
*
200
)
    
{
        
Toast.makeText(mainContext, 
"外部存储空间不足,剩余可用空间为:"
                    
+ useable_storage_mstr +
"M"  
                    
",总空间为:" 
+ total_storage_mstr + 
"M"
                    
, Toast.LENGTH_LONG).show();
        
return
;
    
}

        通过linux命令df /sdcard来获得外部设备外部存储的信息:

        

     ▇获取资产文件夹Asset目录下的文件输入流:

        

1
2
3
4
5
6
//获取上下文的所有资源对象
Resources res = context.getResources();
//从资源对象中获取资产目录Asset的管理器AssetManager
AssetManager manager = res.getAssets();
//利用管理器的open方法获取它的目录下指定文件的读取流
InputStream in = manager.open(
"user.txt"
);

     ▇Preferences:"/data/data/应用程序包名/shared_prefs"

       用于存放一些简单的标记信息、设置信息。通过xml文件在实现保存和取出。

         

       Preferences存储文件流程

1
2
3
4
5
6
7
8
9
//第1步:通过上下文对象得到SharedPreferences对象
        
SharedPreferences user_pref =  context.getSharedPreferences(
"user.txt"
, Context.MODE_PRIVATE);
//第2步:得到SharedPreferences的Editor对象
    
Editor user_editor = user_pref.edit();
//第3步:通过Editor向SharedPreferences对象里面设置值,类似map中的键和值 。
    
user_editor.putString(
"username"
, user.getUsername()); 
    
user_editor.putString(
"password"
, user.getPassword());
//第4步:提交Editor
    
return 
user_editor.commit();

      Preferences读取文件内容

1
2
3
4
5
6
//第1步:通过上下文对象得到SharedPreferences对象
        
SharedPreferences user_share = context.getSharedPreferences(
"user.txt"
, Context.MODE_PRIVATE);
//第2步:得到share对象的数据
    
String username = user_share.getString(
"username"
"用户名找不到"
);
    
String password = user_share.getString(
"password"
"密码找不到"
); 
    
//上面getString方法的第二个参数为找不到指定键名的时候返回的缺省值。

    

    通过总结可以发现,上面的这些文件读取流,都只能读取当前应用程序的私有目录下的文件流,有局限性。如果要想跨应用读取数据,还是得结合一般IO流。

    今天还讲了XML的解析和序列化,和javaWeb中的xml的解析及序列化十分的相似,只是获取解析器和序列器的方式稍有不同,是通过Xml这个类直接获取的。

Android 开发时如何正确获取使用扩展存储路径

    

    

    作为一个程序员,想必你也很讨厌App在SD卡根目录乱建目录吧,那就从我做起,来遵守Google的这一规定吧。

    通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/{package_name}/files/ ,储存一些长时间保存的数据;

    通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/{package_name}/cache/,储存临时缓存数据;

    这两个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项。

      本文转自屠夫章哥  51CTO博客,原文链接:http://blog.51cto.com/4259297/1674699,如需转载请自行联系原作者

你可能感兴趣的文章
10年重新出发
查看>>
2019年-年终总结
查看>>
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>