您的位置:首页 > 移动开发 > Android开发

Android学习(十一) File文件操作

2015-03-31 14:54 423 查看
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();
}
}
});
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: