Android开发 外部存储空间

news2024/11/30 8:30:54

一、存储空间

对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 {

    @Override
    protected 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;

    @Override
    protected 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);


    }

    @Override
    public 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 3
                iv.setImageURI(Uri.parse(path));
                break;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超详细的wireshark抓包使用教程

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

sql函数练习题

1. 计算用户8月每天的练题数量 题目:现在运营想要计算出2021年8月每天用户练习题目的数量,请取出相应数据。 示例:question_practice_detail iddevice_idquestion_idresultdate12138111wrong2021-05-0323214112wrong2021-05-0933214113wro…

2019上半年上午题

2019上半年上午题 a c c c d b b 应用代理网关防火墙 c a 使用数字证书对用户的身份进行认证 d 发送方的私钥签名,发送方公钥确认 d b 职务作品:归公司所有 a b b 从抽象到具体 d 等差数列求和: d 构建节点之间的关系图 然后…

4.Ansible Inventory介绍及实战 - A list or group of lists nodes

什么是inventory? 官方解释:Ansible automates tasks on managed nodes or “hosts” in your infrastructure, using a list or group of lists known as inventory. Ansible可以同时与您基础设施中的一个或多个系统协同工作。为了与多台服务…

音视频学习:同步原理及实现

1.音视频同步简单介绍 对于一个播放器,一般来说,其基本构成均可划分为以下几部分: 数据接收(网络/本地)->解复用->音视频解码->音视频同步->音视频输出。 基本框架如下图所示: 为什么需要音视…

Python学习之批量word文档转pdf并统计其页码

pypdf2是一个Python模块,可以用来读取、写入和操作PDF文件。要安装pypdf2模块,请按照以下步骤操作: 确保你已经安装了Python。你可以在终端或命令提示符中输入python --version来检查Python是否已安装。 pypdf2模块的安装: Modu…

【2023年电工杯数学建模竞赛B题人工智能对大学生学习影响的评价】完整思路分析+完整代码

1.问题背景与描述 这道题整体还是相对简单的,比较适合新手,选的人多对应获奖数量也会多,所以不要纠结于选题,就选你看上去能做的就好 2.问题分析 2.1 问题一的分析 对附件2中所给数据进行分析和数值化处理,并给出处…

GitHub标星11.9k兼职项目!基于SpringBoot + VUE电商-分销商城系统(附源码)

商城介绍 商城系统支持商家入驻,后端基于SpringBoot 研发,前端使用 Vue、uniapp开发, 系统全端全部代码开源 前后端分离,支持分布式部署,支持Docker,各个API独立,并且有独立的消费者。 商城 …

【VR】手柄定位技术

1. 关于Quest Pro头显、控制器的规格分析(终篇)及Quest 3分辨率 (2022年07月29日)被认为是“Quest Pro”的高端一体机Project Cambria将于今年秋季正式发布。对于一直关注和分享所述设备情报的YouTuber布拉德利林奇(B…

python知识点总结(1)

声明:python不同于其他语言的最厉害之处就在于其他的第三方库可以实现不同的功能,但是在学习其他第三方库之前,我们还需要学习完python语言的基础。基础我们都学过,但是总有一些知识点平时很少使用,再碰到很陌生。这里…

云原生之深入解析Docker容器退出码的含义和产生原因

一、前言 为什么我的容器没有运行?回答这个问题之前,需要知道 Docker 容器为什么退出?退出码会提示容器停止运行的情况?本文列出最常见的退出码,来回答两个重要问题:这些退出码是什么意思?导致该退出码的动作是什么?exit code:代表一个进程的返回码,通过系统调用 exi…

URLConnection(三)

文章目录 1. 配置连接2. protected URL url3. protected boolean connected4. protected boolean allowUserInteraction5. protected boolean doInput5. protected boolean doOutput6. protected boolean isModifiedSince7. protected boolean useCaches8. 超时 1. 配置连接 U…

基于Springboot + vue的云盘系统

目录 一. 🦁 前言二. 🦁 主要技术栈三. 🦁 架构搭建1. 项目搭建效果2. 各部分作用 四. 🦁 主要功能1.功能图2. 主要功能2.1 分片上传文件2.2 存储分享记录 五. 🦁 效果显示 一. 🦁 前言 本项目是在B站学习的…

SSM 如何使用 RabbitMQ 实现消息队列

SSM 如何使用 RabbitMQ 实现消息队列 简介 在分布式系统中,消息队列是一种常见的通信方式,可以实现不同服务之间的异步通信和解耦。RabbitMQ 是一个开源的消息队列软件,本文将介绍如何在 SSM 框架中使用 RabbitMQ 实现消息队列。 本文将使…

python 自动化学习(三) 句柄获取、模拟按键、opencv安装

一、什么是句柄 句柄是在操作系统中的一种标识符,相当于我们每个人的身份证一样,句柄在电脑中也是有唯一性的,我们启动的每一个程序都有自己的句柄号,表示自己的身份 为什么要说句柄,我们如果想做自动化操作时&#xf…

【数据库复习】第六章 关系数据理论 2

若R∈BCNF 所有非主属性对每一个码都是完全函数依赖 所有的主属性对每一个不包含它的码,也是完全函数依赖 没有任何属性完全函数依赖于非码的任何一组属性 多值依赖 Teaching具有唯一候选码(C,T,B), 即全码, ∈3NF …

JAVA商城源码-B2B2C商城系统-独立部署,一套源码终身可用

在现在电商迅速占领市场的时代里,选择开发商城系统已经成为了一种趋势,现在开发搭建商城系统有很多编程语言可以选择,目前在电商里市面上受到很多商家企业的喜爱的便是Java商城系统,那为什么要选择Java电商系统呢? 1、…

linuxOPS基础_服务器构成

服务器的重要结构组成 家用电脑组成: CPU、主板、内存条、显卡、硬盘、电源、风扇、网卡、显示器、机箱、键盘鼠标等等。 CPU CPU是电脑的大脑, CPU发展史: 32 位CPU:最大的内存寻址地址2^32,大约4G的大小。 CP…

js 常用函数 push()、pop()、shift()、unshift()、slice()、splice() 等

文章目录 1. join() 函数2.push() 函数3. pop() 函数4.shift() 函数5.unshift() 函数6.sort() 函数7. reverse() 函数8. concat() 函数9.slice() 函数10. splice() 函数11. indexOf() & lastIndexOf() 函数 最近对前端一些函数的用法还不是很熟悉,有一些函数容易…

手持式网络性能测试仪应用于哪些领域及可以完成什么工作?

首先明辰智航国产网络一点通有千兆和万兆以手持式网络性能测试仪,两款仪器可以应用于以下领域: 电信运营商:用于测试网络质量、信号强度、带宽、时延、丢包率等参数,以便优化网络性能和提高用户满意度。 企业网络管理&#xff1a…