Android App将数据写入内部存储和外部存储的示例

作者:chenlijian 时间:2021-05-27 07:45:59 

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;
 }
}
标签:Android,存储
0
投稿

猜你喜欢

  • Android EditText自定义样式的方法

    2021-10-06 22:37:37
  • 简述Java图像倾斜方法及实例 <font color=red>原创</font>

    2023-08-16 09:38:47
  • Springboot一个注解搞定返回参数key转换功能

    2022-06-21 00:11:24
  • Java爬虫范例之使用Htmlunit爬取学校教务网课程表信息

    2021-07-17 00:52:51
  • Spring Cloud 请求重试机制核心代码分析

    2023-04-11 04:00:23
  • 详解Spring Bean 之间的特殊关系

    2022-10-25 21:12:17
  • Spring事务传播中嵌套调用实现方法详细介绍

    2021-08-31 22:34:24
  • java实现MD5加密算法的实例代码

    2021-10-01 16:49:14
  • C#中三种Timer计时器的详细用法

    2022-12-14 13:52:34
  • java基本教程之synchronized关键字 java多线程教程

    2023-02-20 04:11:17
  • 配置Android SDK

    2023-12-05 09:57:29
  • Unity3D实现飞机大战游戏(2)

    2021-11-16 10:41:38
  • 深入理解java动态代理的两种实现方式(JDK/Cglib)

    2023-11-26 13:29:52
  • mybatis查询返回Map<String,Object>类型的讲解

    2022-12-25 02:07:38
  • 基于spring data jpa @query返回map的踩坑记录

    2023-11-27 22:51:00
  • 如何把本地jar包导入maven并pom添加依赖

    2021-12-31 04:11:28
  • Android语音识别技术详解及实例代码

    2022-09-23 03:46:33
  • 老生常谈 Java中的继承(必看)

    2023-06-21 11:59:51
  • SpringBoot 项目的创建与启动步骤详解

    2022-01-23 16:51:17
  • Java与Kotlin互调原理讲解

    2023-08-19 00:07:41
  • asp之家 软件编程 m.aspxhome.com