Android App将数据写入内部存储和外部存储的示例
作者:chenlijian 发布时间:2021-05-27 07:45:59
标签:Android,存储
File存储(内部存储)
一旦程序在设备安装后,data/data/包名/ 即为内部存储空间,对外保密。
Context提供了2个方法来打开输入、输出流
FileInputStream openFileInput(String name)
FileOutputStream openFileOutput(String name, int mode)
public class MainActivity extends Activity {
private TextView show;
private EditText et;
private String filename = "test";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = (TextView) findViewById(R.id.show);
et = (EditText) findViewById(R.id.et);
findViewById(R.id.write).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
//FileOutputStream是字节流,如果是写文本的话,需要进一步把FileOutputStream包装 UTF-8是编码
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
//写
osw.write(et.getText().toString());
osw.flush();
fos.flush();
osw.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
findViewById(R.id.read).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
FileInputStream fis = openFileInput(filename);
//当输入输出都指定字符集编码的时候,就不会出现乱码的情况
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
//获取文件的可用长度,构建一个字符数组
char[] input = new char[fis.available()];
isr.read(input);
isr.close();
fis.close();
String readed = new String(input);
show.setText(readed);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
data/data/packagename/files/test就是我们写入的文件。
SD存储(外部存储)
mnt/sdcard 目录就是SD卡的挂载点(只是一个指向)。
storage/sdcard: 真正的SD卡操作目录。
一、文件下载
Android开发中,有时需要从网上下载一些资源以供用户使用,Android API中已经提供了很多直接可以用的类供大家使用,一般文件下载需要通过三个步骤:
1.创建一个HttpURLConnection对象
// 创建一个URL对象,该对象包含一个IP地址,urlStr指的是网络IP地址
url = new URL(urlStr);
// 通过URL对象,来创建一个HttpURLConnection对象
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
2.获得一个InputStream对象
InputStream input = urlConn.getInputStream();
3.设置访问网络的权限
//在AndroidManifest.xml配置文件中加入权限信息
<uses-permission android:name="android.permission.INTERNET"/>
二、访问并写入SD卡
1.判断手机上是否插入SD卡,且应用程序具有读写权限
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
2.得到当前SD卡的目录
Environment.getExternalStorageDirectory();
3.在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
以下是一个对SD操作经常用到的封装类,以后如果需要对SD卡操作,直接可以拿过来用
public class FileUtils {
private String SDPATH;
public String getSDPATH(){
return SDPATH;
}
//构造函数,得到SD卡的目录,这行函数得到的目录名其实是叫"/SDCARD"
public FileUtils() {
SDPATH = Environment.getExternalStorageDirectory() +"/";
}
//在SD卡上创建文件
public File createSDFile(String fileName) throws IOException{
File file = new File(SDPATH + fileName);
file.createNewFile();
return file;
}
//在SD卡上创建目录
public File createSDDir(String dirName){
File dir = new File(SDPATH + dirName);
dir.mkdir();
return dir;
}
//判断SD卡上的文件夹是否存在
public boolean isFileExist(String fileName){
File file = new File(SDPATH + fileName);
return file.exists();
}
//将一个InputStream里面的数据写入到SD卡中
//将input写到path这个目录中的fileName文件上
public File write2SDFromInput(String path, String fileName, InputStream input){
File file = null;
OutputStream output = null;
try{
createSDDir(path);
file = createSDFile(path + fileName);
//FileInputStream是读取数据,FileOutputStream是写入数据,写入到file这个文件上去
output = new FileOutputStream(file);
byte buffer [] = new byte[4 * 1024];
while((input.read(buffer)) != -1){
output.write(buffer);
}
output.flush();
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
output.close();
}
catch(Exception e){
e.printStackTrace();
}
}
return file;
}
}


猜你喜欢
- postman测试传入List<String>参数第一步:设置headersContent-type 的值为applicatio
- 今天使用jenkins构建时,报以下错误[ERROR] Failed to execute goal on project saas20:
- 引言相信大家在生活中,特别是最近的双十一活动期间,会收到很多短信,而那些短信都有两个特征,第一个是几乎都是垃圾短信,这个特点此处可以忽略不计
- 本文实例为大家分享了java查找图中两点之间所有路径的具体代码,基于邻接表,供大家参考,具体内容如下图类:package graph1;im
- javax.el.ELException的解决方式failed to parse the expression [${xxx}]Tomcat
- 1.异步委托开启线程public class Program { public static void
- 前言之前有人提到过取绝对值时 直接写三目运算符比用Mathf.Abs()效率高 没觉得能高太多今天测了一下 真是不测不知道 一测吓一跳 直接
- 在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。然而在Java中除了提供LockAPI外还在语
- 项目场景: 新搭了一个springboot 2.3.7.RELASE的框架,在集成mysql,tkMapper,mybatis的过
- C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢?从最简单的示例开始:static
- 今天弄了一个多小时,写了一个GPS获取地理位置代码的小例子,包括参考了网上的一些代码,并且对代码进行了一些修改,希望对大家的帮助。具体代码如
- 本文介绍了Android 实现截屏方式整理,分享给大家。希望对大家有帮助可能的需求:截自己的屏截所有的屏带导航栏截屏不带导航栏截屏截屏并编
- 本文实例讲述了Android获取手机系统版本等信息的方法。分享给大家供大家参考。具体如下:String phoneInfo = "
- 本文实例讲述了C#实现顺序表(线性表)的方法。分享给大家供大家参考,具体如下:基本思想是使用数组作为盛放元素的容器,数组一开始的大小要实现确
- Spring整合mybatis注解扫描是否成功IDEA spring整合mybatis会使用注解扫描的配置<context:compo
- 前言如今多线程编程已成为了现代软件开发中的重要部分,而并发编程中的线程同步问题更是一道难以逾越的坎。在Java语言中,synchronize
- 本文实例讲述了C#监控文件夹变化的方法。分享给大家供大家参考。具体实现方法如下:当需要监控某一文件,FileSystemWatcher类提供
- 本文实例为大家分享了C#遍历文件夹获取指定后缀名文件的具体代码,供大家参考,具体内容如下问题描述:项目需要,要进行某文件夹下所有shp数据的
- 自定义工具类PropertyUtil,并在该类的static静态代码块中读取properties文件内容保存在static属性中以供别的程序
- 其实这个http下载器的功能已经相当完善了,支持:限速、post投递和上传、自定义http header、设置user agent、设置ra