zoukankan      html  css  js  c++  java
  • Android学习(十一) File文件操作

    File类

      1、获取当前应用程序的目录:  

      this.getFilesDir();                                             //获取当前应用程序的数据目录

      this.getCacheDir();                                          //获取当前应用程序的缓存目录,资源不够用时,可能会被清除。

      this.getDir("userdata", MODE_PRIVATE);    //获取当前用户程序下自定义目录。

      2、应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。
      如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?

      获取SDCard目录

      Environment.getExternalStorageDirectory();            //获取内存卡的目录,需要权限,如果放在此文件夹中,卸载时不会被清除。

      在AndroidManifest.xml中添加如下代码

    <!-- 在SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

      this.getExternalFilesDir("test_dir");                  //将数据保存到外部内存卡的应用程序数据目录。参数为files下的文件名称。

      通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据

          this.getExternalCacheDir();                             //将数据保存到外部存储卡的应用程序缓存目录中。可以被清除。 

      通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

      

      如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。

      而且上面二个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项 

      如果要保存下载的内容,就不要放在以上目录下

    测试代码:

    main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <Button android:id="@+id/btn1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="保存文件"/>
        
        <Button android:id="@+id/btn2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="读取文件"/>
    
    </LinearLayout>

    main.java

    package com.example.filedemo1;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Environment;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        Button btn1;
        Button btn2;
        File dir;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn1 = (Button) findViewById(R.id.btn1);
            btn2 = (Button) findViewById(R.id.btn2);
    
            // 获取当前应用程序的数据目录
            // dir = this.getFilesDir();
    
            // 获取当前应用程序的缓存目录,资源不够用时,可能会被清除。
            // dir = this.getCacheDir();
    
            // 获取当前用户程序下自定义目录。
            // dir = this.getDir("userdata", MODE_PRIVATE);
    
            // 获取当前SDCard目录
            dir = Environment.getExternalStorageDirectory();
    
            //Log.i("dir", dir.toString());
            
            //保存文件
            btn1.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    File newfile = new File(dir, "test.txt");
                    try {
                        FileOutputStream fos = new FileOutputStream(newfile);
                        String content = "Java中的文件写入,测试数据!";
                        fos.write(content.getBytes());
                        fos.close();
    
                        Toast.makeText(MainActivity.this, "写入成功", 1).show();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
            
            //读取文件
            btn2.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    File newfile = new File(dir, "test.txt");
                    try {
                        FileInputStream fis = new FileInputStream(newfile);
                        byte[] data = new byte[fis.available()];
                        fis.read(data);
                        String content = new String(data);
    
                        Toast.makeText(MainActivity.this, content, 1).show();
                        fis.close();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
    }
  • 相关阅读:
    洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]
    洛谷P1621 集合 [2017年6月计划 数论13]
    NOIP模拟 6.30
    洛谷P1390 公约数的和 [2017年6月计划 数论12]
    洛谷P1573 栈的操作 [2017年6月计划 数论11]
    洛谷P2429 制杖题 [2017年6月计划 数论10]
    Vijos1212 Way Selection [2017年6月计划 二分图03]
    NOIP模拟赛 6.29
    RQNOJ PID192 梦幻大PK [2017年6月计划 二分图02]
    RQNOJ PID141 / 寻找代表元 [2017年6月计划 二分图01]
  • 原文地址:https://www.cnblogs.com/zhengcheng/p/4380929.html
Copyright © 2011-2022 走看看