Android官方Api:每个兼容 Android 的设备都支持可用于保存文件的共享“外部存储”。 该存储可能是可移除的存储介质(例如 SD 卡)或内部(不可移除)存储。 保存到外部存储的文件是全局可读取文件,而且,在计算机上启用 USB 大容量存储以传输文件后,可由用户修改这些文件。
详解: 外部存储中的文件可以被用户或者其他应用程序读写的,其中有两种类型的文件。
(1).公共文件public fies这类文件可被自由访问,当应用被卸载之后,文件仍然保留。比如相机类应用被卸载后,照片仍然存在。公共文件有9大类,均为系统创建的文件夹,详细如下:

文件夹类型包括:

  • DCIM : 数字相机拍摄的照片
  • Music:用户音乐
  • Podcasts:音频/视频的剪辑片段
  • Ringtones:铃声
  • Alarms:闹钟的声音
  • Notification:通知
  • Pictures:所有的图片(不包括那些用照相机拍摄的照片)
  • Movies:所有的电影(不包括那些用摄像机拍摄的视频)和Download/其他下载的内容。

使用外部存储数据需要在应用程序中设置访问SD卡的权限,在AndroidManifest.xml中添加权限

<!-- 在sd卡中创建和删除文件权限-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往sd卡写入数据权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 从sd卡读取数据权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

首先判断是否存在可用的SD卡,Environment.getExternalStorageState()方法获取当前设备的状
态,判断是否为Environment.MEDIA_MOUNTED状态。

  //判断SD卡是否存在if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//记得最后要调用保存文件的方法实现保存Toast.makeText(getApplicationContext(),"sd卡存在",Toast.LENGTH_LONG).show();}else{Toast.makeText(getApplicationContext(), "sd卡不存在", Toast.LENGTH_LONG).show();}

存储的文件路径使用Environment.getExternalStorageDirectory()方法获取当SD卡的根目录,进而访问相应的文件。创建公有文件的方法 :
File file=new File(Environment.getExternalStorageDirectory(),“boreseven”);
第二个参数为自己设置的名字

(2).私有文件Private files在应用被卸载后,私有文件也会被删除,类似与内部储存。获得外部储存私有文件路径的方法Context.getExternalFilesDir(),如:
如:File file = new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES), “boreseven”);

下面小提一下两个方法:
1.保存文件到SD卡:

//保存文件到SD卡public  void saveToSDCard(String filename,String content){File file=new File(Environment.getExternalStorageDirectory(),filename);try {FileOutputStream outputStream=new FileOutputStream(file);outputStream.write(content.getBytes());outputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

2.读取SD卡文件:

 //读取SD卡文件public String readFileSdcard(String filename){String res="";try {FileInputStream myfin=new FileInputStream(filename);int length=myfin.available();byte [] buff=new byte[length];myfin.read(buff);res= new String(buff, "UTF-8");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return  res;}

拓展:点击按钮下载图片,可在系统相册中显示。
记得要添加权限,代码如下:

xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ImageViewandroid:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"/><Buttonandroid:id="@+id/mybutton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:text="保存" /></RelativeLayout>

java文件:

public class MainActivity extends Activity {private ImageView imageView;private Button mybutton;private Handler handler;private String URL="https://www.baidu.com/img/bd_logo1.png";//百度首页图片地址@Overrideprotected void onCreate(final Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();handler=new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {switch (msg.what){case 1://成功byte[]result= (byte[]) msg.obj;final Bitmap bitmap=BitmapFactory.decodeByteArray(result,0,result.length);//利用BitmapFactory将数据转换成bitmap类型imageView.setImageBitmap(bitmap);//加载图片imageView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {saveImageToGallery(MainActivity.this,bitmap);return false;}});}return false;}});OkHttpClient client=new OkHttpClient();//实例化final Request request = new Request.Builder().url(URL).build(); //传入图片网址,,URL为自己定义好的网址。client.newCall(request).enqueue(new Callback() {//实例化一个call的对象@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {Message message=handler.obtainMessage();//声明一个传递信息的Messageif (response.isSuccessful()){//成功Log.e("YF", "onResponse: "+"YES" );//一个log,可以不写message.what=1;  //设置成功的指令为1message.obj=response.body().bytes();//带入图片的数据handler.sendMessage(message);//将指令和数据传出去}else{//失败Log.e("YF", "onResponse: "+"NO" );//一个log,可以不写handler.sendEmptyMessage(0);//设置其他指令为零,然后进入handler}}});}private void saveImageToGallery(Context context, Bitmap bmp) {// 首先保存图片File appDir = new File(Environment.getExternalStorageDirectory(),"desheng");if (!appDir.exists()) {appDir.mkdir();}String fileName = System.currentTimeMillis() + ".jpg";File file = new File(appDir, fileName);try {FileOutputStream fos = new FileOutputStream(file);bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);fos.flush();fos.close();} catch (FileNotFoundException e) {Toast.makeText(context, "保存失败", Toast.LENGTH_SHORT).show();e.printStackTrace();} catch (IOException e) {Toast.makeText(context, "保存失败", Toast.LENGTH_SHORT).show();e.printStackTrace();}// 其次把文件插入到系统图库try {MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(), fileName, null);Toast.makeText(context, "保存成功", Toast.LENGTH_SHORT).show();} catch (FileNotFoundException e) {Toast.makeText(context, "保存失败", Toast.LENGTH_SHORT).show();e.printStackTrace();}// 最后通知图库更新context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.fromFile(new File(file.getPath()))));}private void initView() {imageView = (ImageView) findViewById(R.id.imageView);mybutton = (Button) findViewById(R.id.mybutton);}}

记得加网络权限,图片是加载的百度首页图片!!!

文件数据储存之外部储存相关推荐

  1. python读取dat文件写入表格_Pandas:外部文件数据导入/ 读取 (如 :csv、txt、tsv、dat、excel文件)、文件存储(to_csv、to_excel)...

    一.文本文件读取 文本文件是一种由若干行字符构成的计算机文件,它是一种典型的顺序文件. csv是一种逗号分隔的文件格式,因为其分隔符不一定是逗号,又被称为字符分隔文件,文件以纯文本形式存储表格数据(数 ...

  2. Clickhouse外部储存表引擎(HDFS、MySQL、JDBC、Kafka、File)

    目录 1. HDFS表引擎 1.1 准备工作 1.2 HDFS表负责读写 1.3 HDFS表负责读, 不负责写 2. MySQL表引擎 2.1 表引擎的基本操作 2.2 表引擎配合物化视图 3. JD ...

  3. 软件开发之数据的新建、储存、读取、删除

    1.使用SharedPreferences处理数据的新建.储存.读取.删除 SharedPreferences保存后生成的是XML文件,内容是以节点的形势保存在文件中,SharedPreference ...

  4. redis储存方式以及储存数据

    redis储存方式以及储存数据介绍 Redis数据基础类型有哪些? string 普通key:value储存set name xiaoliget name--->xiaoli list 有序可以 ...

  5. 一个不错的SQL储存过程分页,储存过程+Repeater,如果只是浏览数据的话,快就一个字...

    一个不错的SQL储存过程分页,储存过程+Repeater,如果只是浏览数据的话,快就一个字 CREATE PROCEDURE SelectPagedSQL (  @SQL nvarchar(512), ...

  6. [Redux/Mobx] redux的数据存储和本地储存有什么区别?

    [Redux/Mobx] redux的数据存储和本地储存有什么区别? Redux存储的数据本质上都是JS变量,都是在内存中的,页面刷新就会消失 本质存储是像localStorage Cookie In ...

  7. Android开发--文件系统中的内部存储和外部存储最全解析 附文件数据保存操作封装

    文件存储 前言 文件存储 内存 内部存储 外部存储 内部存储操作 API 读写操作 外部存储操作 公共目录 私有目录 私有文件 私有缓存 文件各种操作封装 前言 众所周知,数据存储在每个应用中都会用到 ...

  8. PS3文件的打开新建及储存,PS4移动工具图层感念,PS5矩形选框工具组选区感念,

    PS3文件的打开新建及储存 PS4移动工具图层感念 PS5矩形选框工具组选区感念

  9. vue xlsx 导入导出_只需三步vue实现excel文件数据提取并存为json数据

    前言: 以前将excel数据导入到数据库是通过前端,将excel文件上传到后端,通过后端语言进行相应的加工将excel文件中的数据取出并存入数据库:从而实现数据库的存入流程.但是这也带来了一些问题,首 ...

最新文章

  1. 利用shell脚本结合hive语句进行数据加载时的优化
  2. 防火墙双机热备三大协议(VRRP-VGMP-HRP)原理
  3. 2021-05-10 矩阵AB和矩阵BA有什么联系?
  4. spring boot基础配置
  5. Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
  6. B端可视化:图表设计
  7. QML笔记-使用connect界面数据交互(qml中Designer使用)
  8. 秦始皇:请叫我数据治理专家
  9. 拿网站服务器的作用,谈在线网站服务器监控(二)之使用的基本功能要求
  10. 小米高管爆料:小米MIX 4相机传感器比三星GW1更好
  11. 数据库语句数据库学习(3)——数据库的创建与删除
  12. 深入解读Linux内存管理系列(5)——lowmem和highmem
  13. UDP SOCKET 两台电脑通信
  14. ETL转换工具 kettle——spoon 安装 使用
  15. 2021教资高中信息技术笔记知识点48页pdf
  16. java 根据银行卡号来获取银行名称
  17. OpenKG开源系列|开源知识图谱融合工具OpenEA (南京大学)
  18. soul显示服务器异常,soul账号状态异常是什么意思?soul账号异常操作多久解封
  19. 计算机中容量单位B、KB、MB、GB和TB的关系
  20. ABAP- INCLUDE Zxxx IF FOUND.

热门文章

  1. css中的各种选择器
  2. Ubuntu 安装 uWSGI
  3. CocosCreator之KUOKUO趣味文章:小怪要绕墙 3
  4. python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】
  5. html显示隐藏表格内外边框
  6. Redis键-值数据库 nosql 数据建模(3)------ 如何存储主从表数据 一对多关系
  7. 本地如何内网穿透映射外网
  8. 软件工程毕业,在北京工作两年后再来理解《人月神话》
  9. 在达沃斯使用约会软件是怎样一番体验
  10. 微信小程序分析送积分功能如何实现_微信积分小程序特色功能——积分营销