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(); } } }); } }