外部存储空间

1. 存储在外部 私有 存储空间

/storage/emulated/0/Android/data/com.tiger.chapter06/files/Download/1709636015824.txt 

package com.tiger.chapter06;import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import com.tiger.chapter06.R;
import com.tiger.chapter06.utils.FileUtil;
import com.tiger.chapter06.utils.ToastUtlis;import java.io.File;public class  FileWriteActivity extends AppCompatActivity implements View.OnClickListener {private EditText et_name;private EditText et_age;private EditText et_height;private EditText et_weight;private CheckBox ck_married;private String path;private TextView tv_txt;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_file_write);et_name = findViewById(R.id.et_name);et_age = findViewById(R.id.et_age);et_height = findViewById(R.id.et_height);et_weight = findViewById(R.id.et_weight);ck_married = findViewById(R.id.ck_married);tv_txt = findViewById(R.id.tv_txt);findViewById(R.id.btn_save).setOnClickListener(this);findViewById(R.id.btn_read).setOnClickListener(this);}@Overridepublic void onClick(View v) {if (v.getId()==R.id.btn_save) {String name = et_name.getText().toString();String age = et_age.getText().toString();String height = et_height.getText().toString();String weight = et_weight.getText().toString();StringBuilder sb = new StringBuilder();sb.append("姓名:").append(name);sb.append("\n年龄:").append(age);sb.append("\n身高:").append(height);sb.append("\n体重:").append(weight);sb.append("\n婚否:").append(ck_married.isChecked() ? "是" : "否");String fileName = System.currentTimeMillis() + ".txt";String directory = null;// 外部存储的私有空间directory = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString();// 外部存储的公共空间//directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();// 内部存储私有空间
//           directory = getFilesDir().toString();path = directory + File.separatorChar + fileName;Log.d("ning", path);FileUtil.saveText(path, sb.toString());ToastUtlis.show(this, "保存成功");}else {tv_txt.setText(FileUtil.openText(path));}}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="5dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="姓名:"android:textColor="@color/black"android:textSize="17sp" /><EditTextandroid:id="@+id/et_name"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginTop="3dp"android:layout_marginBottom="3dp"android:layout_weight="1"android:background="@drawable/edit_select"android:hint="请输入姓名"android:inputType="text"android:maxLength="12"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_age"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="年龄:"android:textColor="@color/black"android:textSize="17sp" /><EditTextandroid:id="@+id/et_age"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginTop="3dp"android:layout_marginBottom="3dp"android:layout_weight="1"android:background="@drawable/edit_select"android:hint="请输入年龄"android:inputType="number"android:maxLength="2"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_height"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="身高:"android:textColor="@color/black"android:textSize="17sp" /><EditTextandroid:id="@+id/et_height"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginTop="3dp"android:layout_marginBottom="3dp"android:layout_weight="1"android:background="@drawable/edit_select"android:hint="请输入身高"android:inputType="number"android:maxLength="3"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_weight"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="体重:"android:textColor="@color/black"android:textSize="17sp" /><EditTextandroid:id="@+id/et_weight"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginTop="3dp"android:layout_marginBottom="3dp"android:layout_weight="1"android:background="@drawable/edit_select"android:hint="请输入体重"android:inputType="numberDecimal"android:maxLength="5"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><CheckBoxandroid:id="@+id/ck_married"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="false"android:gravity="center"android:text="已婚"android:textColor="@color/black"android:textSize="17sp" /><Buttonandroid:id="@+id/btn_save"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="保存"android:textColor="@color/black"android:textSize="17sp" /><Buttonandroid:id="@+id/btn_read"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="读取"android:textColor="@color/black"android:textSize="17sp" /><TextViewandroid:id="@+id/tv_txt"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout>

2.外部存储公共空间

需要在清单文件加权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"><!--添加外部存储权限--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:requestLegacyExternalStorage="true"android:theme="@style/Theme.MyApplication"><activityandroid:name=".FileWriteActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

 /storage/emulated/0/Download/1709636288561.txt

还需要手动开启 访问媒体权限 在手机上

下一章将会讲动态获取权限

3.内部存储私有空间

 /data/user/0/com.tiger.chapter06/files/1709636611007.txt

4.文件工具类

package com.tiger.chapter06.utils;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class FileUtil {// 把字符串保存到指定路径的文本文件public static void saveText(String path, String txt) {BufferedWriter os = null;try {os = new BufferedWriter(new FileWriter(path));os.write(txt);} catch (Exception e) {e.printStackTrace();} finally {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}// 从指定路径的文本文件中读取内容字符串public static String openText(String path) {BufferedReader is = null;StringBuilder sb = new StringBuilder();try {is = new BufferedReader(new FileReader(path));String line = null;while ((line = is.readLine()) != null) {sb.append(line);}} catch (Exception e) {e.printStackTrace();} finally {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}return sb.toString();}// 把位图数据保存到指定路径的图片文件public static void saveImage(String path, Bitmap bitmap) {FileOutputStream fos = null;try {fos = new FileOutputStream(path);// 把位图数据压缩到文件输出流中bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);} catch (Exception e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}// 从指定路径的图片文件中读取位图数据public static Bitmap openImage(String path) {Bitmap bitmap = null;FileInputStream fis = null;try {fis = new FileInputStream(path);bitmap = BitmapFactory.decodeStream(fis);} catch (Exception e) {e.printStackTrace();} finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}return bitmap;}
}

5.存储卡上读写图片

package com.tiger.chapter06;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.EditText;
import android.widget.ImageView;import com.tiger.chapter06.utils.FileUtil;
import com.tiger.chapter06.utils.ToastUtlis;import java.io.File;public class ImageWriteActivity extends AppCompatActivity implements View.OnClickListener {private ImageView iv_content;private String path;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_image_write);iv_content = findViewById(R.id.iv_content);findViewById(R.id.btn_save).setOnClickListener(this);findViewById(R.id.btn_read).setOnClickListener(this);}@Overridepublic void onClick(View v) {if (v.getId() == R.id.btn_save) {String fileName = System.currentTimeMillis() + ".png";//获取当前App的外部存储私有下载目录path = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() + "/" + fileName;Log.d("ning",path);//从指定的资源文件中获取位图对象Bitmap b1 = BitmapFactory.decodeResource(getResources(), R.drawable.apple);//把位图对象保存为图片文件FileUtil.saveImage(path,b1);ToastUtlis.show(this,"保存成功");} else {//            Bitmap b2 = FileUtil.openImage(path);//            Bitmap b2 = BitmapFactory.decodeFile(path);iv_content.setImageURI(Uri.parse(path));
//            iv_content.setImageBitmap(b2);}}
}

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

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

相关文章

linux kernel物理内存概述(六)

目录 伙伴系统 1、什么是伙伴&#xff1f; 2、伙伴系统的分配原理 3、伙伴系统回收 伙伴系统 1、什么是伙伴&#xff1f; 伙伴必须是大小相同并且在物理上连续的两个或者多个页。 2、伙伴系统的分配原理 首先根据内存分配接口函数gfp_t gfp_mask&#xff0c;找到内存分…

分布式事务Seata

分布式事务与Seata落地 一、事务基础 1.1 本地事务 事务指的就是一个操作单元&#xff0c;在这个操作单元中的所有操作最终要保持一致的行为&#xff0c;要么所有操作都成功&#xff0c;要么所有的操作都被撤销。 1.2 本地事务特性 本地事务四大特性: ACID A&#xff1a;原…

SuperPoint和SuperGlue 的算法介绍及学习应用经验分享

SuperPoint和SuperGlue 的算法介绍及学习应用经验分享 2024年01月03日 10:38186浏览 3喜欢 0评论 视频地址&#xff1a; SuperPoint和SuperGlue 的算法介绍及学习应用经验分享 好想 特征点匹配&#xff0c;为了计算位姿 特征点&#xff1a;关键点描述子&#xff08…

第五十回 插翅虎枷打白秀英 美髯公误失小衙内-mayfly-go:web 版 linux、数据库等管理平台

晁盖宋江和吴用到山下迎接雷横上山&#xff0c;宋江邀请雷横入伙&#xff0c;雷横以母亲年事已高为由拒绝了。 雷横回到郓城&#xff0c;听李小二说从东京新来了个表演的叫白秀英&#xff0c;吹拉弹唱跳&#xff0c;样样精通&#xff0c;于是雷横和李小二一起到戏院去看演出。…

Python爬虫实战第三例【三】(下)

零.前情提要&#xff1a; 没有看上一章的小伙伴&#xff0c;建议先去看上一章&#xff0c;避免有些知识点不连贯 地址&#xff1a;Python爬虫实战第三例【三】【上】-CSDN博客 在上一章&#xff0c;我们经过分析.m3u8文件和.ts文件后&#xff0c;成功爬取到了所有.ts文件的文…

冒泡经典题

&#x1f4d1;前言 本文主要是【】——简单使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#xff1a;狠…

RN开发搬砖经验之-Android平台下处理后退按钮事件

基本接口 利用RN 针对Android平台提供的接口 BackHandler BackHandler需要区分类组件跟函数组件的场景&#xff0c;主要是两个组件一个基于组件生命周期的&#xff0c;一个是基于hook的&#xff0c;即注册BackHandler的事件监听与移除时机写法不同。 类组件 示例代码 impor…

使用J-Link | OPENSDA 调试S32K144开发板

一、S32DS下载 使用的开发软件为S32DS&#xff0c;可以到NXP官网下载&#xff1a;链接&#xff0c;也可以通过网盘&#xff1a;链接 二、对S32K144开发板进行调试 调试方法一&#xff1a; S32K144开发板自带一个OPENSDA MCU&#xff0c;我们可以通过一根Mircro USB线连接到电…

计算机网络-第3章 数据链路层

主要内容&#xff1a;两个信道及对应的协议&#xff1a;点对点信道和广播信道&#xff0c;扩展以太网和高速以太网 本章的分组转发为局域网内的转发&#xff0c;不经过路由&#xff0c;网络层分组转为为网络与网络之间的转发&#xff0c;经过路由。局域网属于网络链路层的范围…

springboot3.x 以上,官方不建议使用spring.factories

springboot2.7.x 以上,官方不建议使用spring.factories 最近公司项目升级.需要将springcloud/springboot版本升级到2.7.x以上,再升级的过程中遇到了太多的问题.总结在了如下文章中: springboot艰难版本升级之路!! springboot 2.3.x版本升级到2.7.x版本 这篇文章就重点是梳理一…

LeetCode 热题 100 (尽量ACM模式刷) 持续更新!!!

LeetCode 热题 100 哈希hash 1 两数之和 /** 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target的那两个整数&#xff0c;并返回它们的数组下标。* 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案…

品优购首页制作

一&#xff0c;常用模块类名命名 二&#xff0c;快捷导航shortcut制作 三&#xff0c;header制作 3.1LOGO SEO优化 3.2 搜索模块定位 四&#xff0c; nav导航制作 五&#xff0c;footer底部制作 六&#xff0c;main主体模块制作 以前书写是模块化中的公共部分 main主体模块是…

MyBatis介绍

MyBatis是一个优秀的持久层框架&#xff08;就是将某些数据持久化到硬盘或其他存储器中的框架&#xff09;&#xff0c;它把jdbc对数据库的操作进行了封装&#xff0c;使用户只需关注sql本身&#xff0c;不需要去执行jdbc的那一套复杂的操作。 MyBatis通过配置xml文件或注解的方…

Linux安全加固功能

提示:工具下载链接在文章最后 目录 一.加固功能介绍二.配置加固功能1.配置安全加固功能1.1 开放目前设备监听的所有端口1.2 只开放80、443、20、21、22端口1.3 防火墙配置工具1.3.1 开放允许访问的端口1.3.2 删除允许访问的端口1.3.3 添加IP地址允许访问规则1.3.4 添加IP地址禁…

漫画手绘视频教程分享

下载地址&#xff1a; 漫画手绘教程: https://url83.ctfile.com/d/45573183-60305653-039aed?p7526 (访问密码: 7526)

JavaScript基础3之面向对象关于面向过程、函数式编程、对比、构造函数、原型

JavaScript基础 面向对象面向过程函数式编程命令式编程函数式编程特性副作用透明引用不可变变量函数是一等公民 常见的函数式编程模型 面向对象为什么要使用面向对象封装继承多态 对比面向过程函数式编程面向对象 构造函数原型constructor使用场景 对象原型 面向对象 面向过程…

chrome自动更新后,手动恢复书签和历史记录

本文是针对google没有登录账号信息&#xff0c;浏览器更新后&#xff0c;如何恢复本地书签可历史记录。 为了解决“已被CORS策略阻止&#xff1a;请求的资源上没有’Access-Control-Allow-Origin’标头&#xff08;跨域请求失败”这个问题&#xff0c;修改了Google属性&#x…

android开发教程视频,android组件化和插件化

第一阶段&#xff1a;Android 基础知识回顾&#xff1a; 回顾Android 开发编程&#xff0c;深入理解Android系统原理和层次结构&#xff0c;深入分析Handler源码和原理&#xff1b;回顾Java&#xff0c;C/C&#xff0c;Kotlin、dart 在Android开发中必用的语言&#xff0c;熟悉…

算法学习03:前缀和与差分(互逆)

算法学习03&#xff1a;前缀和与差分&#xff08;互逆&#xff09; 文章目录 算法学习03&#xff1a;前缀和与差分&#xff08;互逆&#xff09;前言一、前缀和1.一维2.二维 二、差分1.一维在这里插入图片描述2.二维在这里插入图片描述 ![在这里插入图片描述](https://img-blog…

LeetCode 2368.受限条件下可到达节点的数目:搜索 + 哈希表

【LetMeFly】2368.受限条件下可到达节点的数目&#xff1a;搜索 哈希表 力扣题目链接&#xff1a;https://leetcode.cn/problems/reachable-nodes-with-restrictions/ 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - 1 条边。 给…