Android开发 外部存储空间

news/2024/11/19 1:24:40/

一、存储空间

对Andriod来说,存储空间分为内部存储空间和外部存储空间。

外部存储空间也就是常说的SD卡,可以分为私有存储空间和公共存储空间。

内部存储空间和外部存储空间的私有存储空间,都是每个APP独有的,不允许其他APP访问。

公共存储空间则是所有APP都可以访问,空间也更大,可以用于存储一些大的音频文件。

那么很自然地可以得出,当APP卸载后,内部存储空间和外部存储空间的私有存储空间的文件都被清空了,但公共存储空间的文件不会被删除。

二、在Andriod中存储文本文件

在这三个空间存储,需要获得不同的路径:

//外部存储私有空间
dir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString();
//外部存储公共空间
dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();
//内部存储空间
dir = getFilesDir().toString();

其中读写外部存储公共空间时,需要修改APP权限:

 

完整代码:

package com.example.study06;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.Environment;
import android.util.Log;import com.example.study06.util.FileUtil;import java.io.File;
import java.io.IOException;public class FileWriteActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_file_write);writeFile();//readFile();}protected void writeFile(){String text = "text for inner";String path = null;String fileName = System.currentTimeMillis() + ".txt";String dir = null;//外部存储私有空间dir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString();//外部存储公共空间dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();//内部存储空间dir = getFilesDir().toString();path = dir + File.separator + fileName;FileUtil.saveText(path,text);Log.d("test", path);}private void readFile() {String path = "/storage/emulated/0/Android/data/com.example.study06/files/Download/1685064570930.txt";String text = null;try {text = FileUtil.readText(path);} catch (IOException e) {throw new RuntimeException(e);}Log.d("output ", text);}}

读写工具类:

package com.example.study06.util;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class FileUtil {public static void saveText(String path, String text){BufferedWriter writer = null;try {writer = new BufferedWriter(new FileWriter(path));writer.write(text);} catch (IOException e) {throw new RuntimeException(e);}finally {if(writer!=null){try {writer.close();} catch (IOException e) {e.printStackTrace();}}}}public static String readText(String path) throws IOException {BufferedReader reader = null;StringBuilder text = new StringBuilder();try {reader = new BufferedReader(new FileReader(path));String line = null;while((line=reader.readLine())!=null){text.append(line);}} catch (FileNotFoundException e) {throw new RuntimeException(e);}finally {if(reader!=null){try{reader.close();}catch (IOException e){e.printStackTrace();}}}return text.toString();}}

结果:在对应路径可以看到文件

 

三、外部存储空间储存图片

和之前读写文本一样,在工具类中用文件的输入输出Stream流来编写读写函数:

public static void saveImage(String path, Bitmap bm){FileOutputStream out = null;try {out = new FileOutputStream(path);bm.compress(Bitmap.CompressFormat.PNG, 90,  out);} catch (FileNotFoundException e) {throw new RuntimeException(e);}finally {if(out!=null){try {out.close();} catch (IOException e) {throw new RuntimeException(e);}}}}public static Bitmap readImage(String path){FileInputStream in = null;Bitmap bt = null;try {in = new FileInputStream(path);bt = BitmapFactory.decodeStream(in);} catch (FileNotFoundException e) {throw new RuntimeException(e);}finally {if(in!=null){try {in.close();} catch (IOException e) {throw new RuntimeException(e);}}}return bt;}

 然后使用:

package com.example.study06;import static android.util.Log.d;
import static android.webkit.ConsoleMessage.MessageLevel.LOG;import androidx.appcompat.app.AppCompatActivity;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;import com.example.study06.util.FileUtil;import java.io.File;public class ImageWriteActivity extends AppCompatActivity implements View.OnClickListener {private Button btn_save;private Button btn_read;private ImageView iv;private  String path;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_image_write);btn_save = findViewById(R.id.btn_save);btn_read = findViewById(R.id.btn_read);iv = findViewById(R.id.iv);btn_save.setOnClickListener(this);btn_read.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch(view.getId()){case R.id.btn_save:String fileName = System.currentTimeMillis() + ".png";path = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() + File.separator + fileName;Bitmap bt = BitmapFactory.decodeResource(getResources(), R.drawable.img);FileUtil.saveImage(path, bt);Log.d("test ", path);break;case R.id.btn_read://method 1//Bitmap bt_r = FileUtil.readImage(path);//iv.setImageBitmap(bt_r);//method 2//Bitmap bt_r = BitmapFactory.decodeFile(path);//iv.setImageBitmap(bt_r);//method 3iv.setImageURI(Uri.parse(path));break;}}
}


http://www.ppmy.cn/news/89230.html

相关文章

央国企数字化转型难在哪?为什么要数字化转型?

随着新一轮科技革命和产业变革深入发展,数字化成为央国有企业的必答题。 但就目前情况来看,央国有企业数字化转型还面临着许多挑战,必然是一个长期的过程。 01 央国企数字化转型难在哪? 根据调研数据,中央企业数字化…

超详细的wireshark抓包使用教程

前言 Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括: 1、Wireshark软件下载和安装以及Wireshark主界面介绍。 2、WireShark简单抓包示例。通过该…

小航编程题库2022年NOC决赛图形化(小高组)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSDN博客 单选题3.0分 删除编辑 答案:A 第1题运行下面的程序,最终“我的变量”的值是多少? A、5B、10C、25D、30 答案…

GitHub Copilot 键盘快捷( 试用 )

使用 根据注释生成代码根据上下文自动填充代码代码翻译算法生成测试用例结果输出代码优化可以使用 q: 向Copilot提问,就像使用ChatGPT一样,可以帮助我们阅读代码 快捷 Visual Studio Code macOS 键盘快捷方式 操作快捷键命令名称接受内联建议选项卡…

dubbo 连接注册中心和直连的区别

dubbo 连接注册中心和直连的区别 在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连, 点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表&#xff0…

Linux配置DNS解析域名

在很多时候,我们会需用使用域名去访问(特别在集群环境中,经常用到),这个时候我们一般就需要配置DNS去解析。当然在没有DNS服务器的情况,也可以手动维护服务器本身的hosts文件实现。本文阐述2种配置DNS解析的…

值得尝试的Voyager Linux,没有Snap,出色的定制

一直以来我都不喜欢 Ubuntu GNOME 的默认外观,而且对Ubuntu强制使用Snap应用不是很喜欢,之前我用的是Ubuntu MATE这个发行版,直到我听说了Voyager Linux。今天特意安装试用了一下Voyager Linux 23.04,有几点功能我很喜欢&#xff…

物联协议整理——蓝牙BLE

最近公司很多物联设备都使用BLE蓝牙和ZigBee通信,中间对设备功耗要求很高,补充下相关知识。 蓝牙协议栈 PHY层(Physical layer物理层)。PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。PHY层做得好不好&#…