>>分享Android开发相关的技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19522 个阅读者 刷新本主题
 * 贴子主题:  Android开发: 文件读写 回复文章 点赞(0)  收藏  
作者:Jacky    发表时间:2020-03-31 13:57:53     消息  查看  搜索  好友  邮件  复制  引用

     一、基本概念

          在Android应用中保存文件,保存的位置有两处

          ①手机自带的存储空间,较小(如200M),适合保存一些小文件,Android中保存位置在data/data/应用包名/files目录

          ②外存储设备如SD卡,较大,适合保存大文件如视频,Android中保存位置在mnt/sdcard目录,androd1.5,android1.6保存在sdcard目录

          保存的位置通过android的file explorer视图可以找到

     二、例子
  1.    package  cn.xy.service;  
  2.   import  java.io.ByteArrayOutputStream;  
  3.   import  java.io.File;  
  4.   import  java.io.FileInputStream;  
  5.   import  java.io.FileOutputStream;  
  6.   import  android.content.Context;  
  7.   import  android.os.Environment;  
  8.   /**  
  9.     * 文件操作类  
  10.     *  
  11.     * @author XY  
  12.     *  
  13.     */  
  14.   public   class  FileService  
  15.   {  
  16.        /**  
  17.         * 上下文对象  
  18.         */  
  19.        private  Context context;  
  20.        public  FileService(Context context)  
  21.       {  
  22.            super ();  
  23.            this .context = context;  
  24.       }  
  25.        /**  
  26.         * 保存文件(保存至手机自带的存储空间)  
  27.         *  
  28.         * @param filename 文件名  
  29.         * @param fileContent 文件内容  
  30.         */  
  31.        @SuppressWarnings ( "static-access" )  
  32.        public   void  save(String filename, String fileContent)  throws  Exception  
  33.       {  
  34.            // 私有操作模式:1.该文件只能被本应用访问。2.写入文件的内容会覆盖原有文件的内容  
  35.           FileOutputStream fos = context.openFileOutput(filename, context.MODE_PRIVATE);  // 默认保存在手机自带的存储空间  
  36.           fos.write(fileContent.getBytes( "UTF-8" ));  
  37.           fos.close();  
  38.       }  
  39.        /**  
  40.         * 保存文件之SD卡  
  41.         *  
  42.         * @param filename 文件名  
  43.         * @param fileContent 文件内容  
  44.         */  
  45.        public   void  saveInSDCard(String filename, String fileContent)  throws  Exception  
  46.       {  
  47.            // 若文件被保存在SDCard中,该文件不受读写控制  
  48.           File file =  new  File(Environment.getExternalStorageDirectory(), filename);  
  49.           FileOutputStream fos =  new  FileOutputStream(file);  
  50.           fos.write(fileContent.getBytes( "UTF-8" ));  
  51.           fos.close();  
  52.       }  
  53.        /**  
  54.         * 读取文件内容  
  55.         * 在创建ByteArrayOutputStream类实例时,内存中会创建一个byte数组类型的缓冲区,缓冲区会随着数据的不断写入而自动增长,可使用  
  56.         * toByteArray()和 toString()获取数据 关闭 ByteArrayOutputStream  
  57.         * 无效,此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException  
  58.         *  
  59.         * @param filename 文件名  
  60.         * @return  
  61.         */  
  62.        public  String read(String filename)  throws  Exception  
  63.       {  
  64.           FileInputStream fis = context.openFileInput(filename);  // 默认到手机自带的存储空间去找  
  65.           ByteArrayOutputStream outStream =  new  ByteArrayOutputStream();  
  66.            byte [] buffer =  new   byte [ 1024 ];  
  67.            int  len =  0 ;  
  68.            // 将内容读到buffer中,读到末尾为-1  
  69.            while  ((len = fis.read(buffer)) != - 1 )  
  70.           {  
  71.                // 本例子将每次读到字节数组(buffer变量)内容写到内存缓冲区中,起到保存每次内容的作用  
  72.               outStream.write(buffer,  0 , len);  
  73.           }  
  74.            // 取内存中保存的数据  
  75.            byte [] data = outStream.toByteArray();  
  76.           fis.close();  
  77.           String result =  new  String(data,  "UTF-8" );  
  78.            return  result;  
  79.       }  
  80.   }  

       MainActivity

  1.    try  
  2.   {  
  3.        // 存储在手机自带存储空间  
  4.       fs.save(filename, fileContent);  
  5.       Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_SHORT).show();  
  6.        // 存储在外部设备SD卡  
  7.        // 判断SDCARD是否存在和是否可读写  
  8.        if  (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  
  9.       {  
  10.           fs.saveInSDCard(filename, fileContent);  
  11.           Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_SHORT).show();  
  12.       }  
  13.        else  
  14.       {  
  15.           Toast.makeText(getApplicationContext(), R.string.failsdcard, Toast.LENGTH_SHORT).show();  
  16.       }  
  17.   }  
  18.   catch  (Exception e)  
  19.   {  
  20.       Toast.makeText(getApplicationContext(), R.string.fail, Toast.LENGTH_SHORT).show();  
  21.       Log.e(tag, e.getMessage());  
  22.   }

          文件名不带路径,直接输入如xy.txt

          对于SD卡的操作,需要在AndroidManifest.xml加入权限

  1.    <!-- 在SDCard中创建和删除文件的权限 -->  
  2.   < uses-permission   android:name = "android.permission.MOUNT_UNMOUNT_FILESYSTEMS"   />  
  3.   <!-- 往SDCard中写入数据的权限 -->  
  4.   < uses-permission   android:name = "android.permission.WRITE_EXTERNAL_STORAGE"   />  

           三、一些API

          ①Environment.getExternalStorageDirectory()获取的路径为mnt/sdcard目录,对于android1.5,1.6的路径是sdcard目录

          ②Activity中提供了两个API

          getCacheDir()获取的路径为data/data/应用包名/cache目录

          getFilesDir()获取的路径为data/data/应用包名/files目录



----------------------------
原文链接:https://blog.51cto.com/woshixy/1076826

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-04-18 19:15:38 重新编辑]
网站系统异常


系统异常信息
Request URL: http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=3136

java.lang.NullPointerException

如果你不知道错误发生的原因,请把上面完整的信息提交给本站管理人员