File储存有两种,一种是处理应用程序的数据文件夹的文件,另一种是处理SD卡上的文件。
一、处理应用程序的数据文件夹文件
FileOutputStream openFileOutput(String name):打开应用程序的数据文件夹下的name文件对应的输出流
FileInputStream openFileIntput(String name,int mode):打开应用程序的数据文件夹下的name文件对应的输入流
注意:
1.方法的第一参数用于指定文件名称,不能包含路径分隔符“/”
2.如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录
public static final int MODE_APPEND = 32768; 以追加方式打开该文件,应用程序可以向该文件中追加内容
public static final int MODE_PRIVATE = 0; 该文件只能被当前程序读写
public static final int MODE_WORLD_READABLE = 1; 给文件内容可以被其他程序读取
public static final int MODE_WORLD_WRITEABLE = 2; 给文件内容可以被其他程序读写
3.context下的几个访问应用程序的数据文件夹方法
处理应用程序的数据文件夹的文件:
写入文件方法
/**
* 写入文件
* 文件存储在应用程序的数据文件夹下
* @param content
*/
private void write(String content) {
FileOutputStream fos = null;
try {
//以context的openFileOutput和追加的模式打开文件输出流
fos = openFileOutput("haha.txt", MODE_APPEND);
//输出流,写入文件
fos.write(content.getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close();
fos=null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
读取文件方法
/**
* 读取文件
* 文件存储在应用程序的数据文件夹下
*/
private String read() {
FileInputStream fis = null;
try {
//使用context的openFileInput方法打开输入流
fis = openFileInput("haha.txt");
byte b[] = new byte[1024];
int hasRead = 0;
//记录读出内容
StringBuilder sb = new StringBuilder("");
//读取文件内容,hasRead表示已经读取的
while ((hasRead = fis.read(b)) > 0) {
sb.append(new String(b, 0, hasRead));
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
fis=null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
结果:
/**
* 检查SD卡是否存在且能否读写
* @return True if external storage is writable. False otherwise.
*/
public static boolean isExternalStorageMounted() {
return Environment.MEDIA_MOUNTED.equals(
Environment.getExternalStorageState());
}
/**
* 检查用户是否有读/写SD卡权限
* @param context The Context to check the permissions for.
* @return True if granted the permissions. False otherwise.
*/
public static boolean hasWritePermissionToExternalStorage(Context context) {
return ContextCompat.checkSelfPermission(context,
Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
PackageManager.PERMISSION_GRANTED;
}
/**
* 请求读写权限
* @param activity
*/
public static void requestPermission(Activity activity){
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
File sdCardDir = Environment.getExternalStorageDirectory();
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
/**
* 写入SD卡下的文件
* @param content
*/
private void writeSD(String content) {
//如果sd卡存在
if (Util.isExternalStorageMounted()){
//如果没有权限读写操作,则申请
if (!Util.hasWritePermissionToExternalStorage(this)){
Util.requestPermission(this);
}else{
FileOutputStream fos=null;
try {
//获取SDCard目录
File sdCardDir = Environment.getExternalStorageDirectory();
//生成一个文件
File textFile = new File(sdCardDir,"HEIHEI.txt");
fos = new FileOutputStream(textFile);
fos.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fos!=null){
fos.close();
fos = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
读取文件方法:
/**
* 读取sd卡下的文件
* @return
*/
private String readSD() {
FileInputStream fis = null;
try {
//输入流,名字由路径+文件名组成
fis = new FileInputStream(Environment.getExternalStorageDirectory()+"/HEIHEI.txt");
byte b[] = new byte[1024];
int hasRead = 0;
//记录读出内容
StringBuilder sb = new StringBuilder("");
//读取文件内容,hasRead表示已经读取的
while ((hasRead = fis.read(b)) > 0) {
sb.append(new String(b, 0, hasRead));
}
return sb.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fis!=null){
fis.close();
fis = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
结果:
package tplusr.storagetest.file;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import tplusr.storagetest.R;
import tplusr.storagetest.Util;
public class FileActivity extends AppCompatActivity implements View.OnClickListener{
private TextView t;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file);
setContentView(R.layout.activity_main);
Button b1 = (Button) findViewById(R.id.b1);
Button b2 = (Button) findViewById(R.id.b2);
Button b3 = (Button) findViewById(R.id.b3);
Button b4 = (Button) findViewById(R.id.b4);
t = (TextView) findViewById(R.id.result);
b1.setOnClickListener(this);
b2.setOnClickListener(this);
b3.setOnClickListener(this);
b4.setOnClickListener(this);
//获取应用程序的数据文件夹的绝对路径
Log.d("File", "绝对路径"+getFilesDir().toString());
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.b1:
write("YSJHDASKDHAKSHDAKSDHKHWUIFGEWK我我我我我我我我我我放假放到沙发上看3847829#$%……(*&%");
Log.d("File", "----------------创建文件---------------");
//获取应用程序的数据文件夹下的所有文件
Log.d("File", "文件数量"+fileList().length + "");
for (int i=0;i<fileList().length;i++){
Log.d("File", "文件:"+fileList()[i]+"");
}
break;
case R.id.b2:
Log.d("File", "----------------读取文件---------------");
t.setText(read());
Log.d("File", "文件内容:" + read());
Log.d("File", "----------------删除文件---------------");
//删除应用程序的数据文件夹下的绝对路径
deleteFile("haha.txt");
Log.d("File", fileList().length + "");
break;
case R.id.b3:
writeSD("DHADHIUFHEUWI右边还是福 is 返回非大煞风景#$……*(*)&");
break;
case R.id.b4:
Log.d("File", "----------------SD卡读取文件结果---------------");
t.setText(readSD());
Log.d("File", readSD());
break;
}
}
/**
* 写入文件
* 文件存储在应用程序的数据文件夹下
* @param content
*/
private void write(String content) {
FileOutputStream fos = null;
try {
//以context的openFileOutput和追加的模式打开文件输出流
fos = openFileOutput("haha.txt", MODE_APPEND);
//输出流,写入文件
fos.write(content.getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close();
fos=null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 读取文件
* 文件存储在应用程序的数据文件夹下
*/
private String read() {
FileInputStream fis = null;
try {
//使用context的openFileInput方法打开输入流
fis = openFileInput("haha.txt");
byte b[] = new byte[1024];
int hasRead = 0;
//记录读出内容
StringBuilder sb = new StringBuilder("");
//读取文件内容,hasRead表示已经读取的
while ((hasRead = fis.read(b)) > 0) {
sb.append(new String(b, 0, hasRead));
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
fis=null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 写入SD卡下的文件
* @param content
*/
private void writeSD(String content) {
//如果sd卡存在
if (Util.isExternalStorageMounted()){
//如果没有权限读写操作,则申请
if (!Util.hasWritePermissionToExternalStorage(this)){
Util.requestPermission(this);
}else{
FileOutputStream fos=null;
try {
//获取SDCard目录
File sdCardDir = Environment.getExternalStorageDirectory();
//生成一个文件
File textFile = new File(sdCardDir,"HEIHEI.txt");
fos = new FileOutputStream(textFile);
fos.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fos!=null){
fos.close();
fos = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 读取sd卡下的文件
* @return
*/
private String readSD() {
FileInputStream fis = null;
try {
//输入流,名字由路径+文件名组成
fis = new FileInputStream(Environment.getExternalStorageDirectory()+"/HEIHEI.txt");
byte b[] = new byte[1024];
int hasRead = 0;
//记录读出内容
StringBuilder sb = new StringBuilder("");
//读取文件内容,hasRead表示已经读取的
while ((hasRead = fis.read(b)) > 0) {
sb.append(new String(b, 0, hasRead));
}
return sb.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fis!=null){
fis.close();
fis = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
Util.Java
package tplusr.storagetest.sharedpreferences;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
/**
* Created by tangjiarao on 16/9/6.
*/
public class Util {
/**
* 检查SD卡是否存在且能否读写
* @return True if external storage is writable. False otherwise.
*/
public static boolean isExternalStorageMounted() {
return Environment.MEDIA_MOUNTED.equals(
Environment.getExternalStorageState());
}
/**
* 检查用户是否有读/写SD卡权限
* @param context The Context to check the permissions for.
* @return True if granted the permissions. False otherwise.
*/
public static boolean hasWritePermissionToExternalStorage(Context context) {
return ContextCompat.checkSelfPermission(context,
Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
PackageManager.PERMISSION_GRANTED;
}
/**
* 请求读写权限
* @param activity
*/
public static void requestPermission(Activity activity){
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}