——文件I/O
——Internal Storage:内部存储,主要是设备的内存
——External Storage:外部存储,主要是存储卡
——Network Connection:存储于网络上的某服务器上
——Shared Preferences:以xml形式存储
——SQLite Databases:以SQLite数据库形式存储
——ContentProvider:解决应用程序之间的数据通信、共享的问题
——File
1)Java提供了一套完整的IO流体系,包括FileInputStream,FileOutputStream等,Android同样支持以这种方式来访问手机存储器上的文件。
Context提供了如下两个方法来打开本应用程序的数据文件夹的IO流:
context.openFileInput(filename):打开应用程序的数据文件夹下的filename文件对应的输入流
context.openFileOutput(filename,mode):打开应用程序的数据文件夹下的filename文件对应的输出流
注意:该模式支持如下值
MODE_PRIVATE:该文件只能被当前程序读写
MODE_APPEND:以追加的方式打开该文件
MODE_WORLD_READABLE:该文件的内容可以被其他程序读取
MODE_WORLD_WRITEABLE:该文件的被人可由其他程序读写。
MODE_MULTI_PROCESS:设置多线程安全
此外Context提供了如下几个方法来访问应用程序的数据文件夹
getDir(String name,int mode):获取或创建name对应的子目录
File getFilesDir():获取该应用程序的数据文件夹的绝对路径
String[] fileList():返回该应用程序的数据文件夹的全部文件
deleteFile(String):删除该应用程序的数据文件夹下的指定文件
2)存放文件的路径:/data/data/package name/files/
3)读取SD卡上的文件
当程序通过openFileInput获取openFileOutput来打开文件输入流,输出流时。程序所打开的都是应用程序的数据文件夹里的文件,这样所存储的文件大小可能比较有限(毕竟手机内置的存储空间有限)。为了更好地存,取应用程序的大文件数据,应用程序需要读写SD卡上的文件。SD卡大大扩充手机的存储能力。
读写SD上的文件的步骤:
a)调用Environment的getExternalStorageState()方法判断手机是否插入SD卡。
并且应用程序具有读写SD卡的权限。如果如下代码返回true就满足条件
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
b)调用Environment的getExternalStorageDirectory()方法来获取外部存储器的目录
c)使用FileInputStream,FileOuputStream,FileReader,FileWriter读写SD卡里的文件。
注意:1)手机上应该已插入SD卡,对于模拟器,可通过mksdcard命令创建虚拟存储卡。
2)为了读写SD卡的数据,需要添加权限
MOUNT_UNMOUNT_FILESYSTEMS:创建和删除文件权限
WRITE_EXTERNAL_STORAGE:写入数据权限
package com.xspacing.filetest;
import java.io.BufferedInputStream;
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.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
/**
*
* @ClassName MainActivity.java
* @Description File读取文件
* @author smile
* @version v1.0
* @date 2016年10月17日
*/
public class MainActivity extends Activity {
private TextView mTvRead;
private EditText mEtWriteName;
private EditText mEtWriteContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
mTvRead = (TextView) findViewById(R.id.read_tv);
mEtWriteName = (EditText) findViewById(R.id.et_name);
mEtWriteContent = (EditText) findViewById(R.id.et_write);
}
/**
* 写入本地
*
* @param v
*/
public void write(View v) {
String name = mEtWriteName.getText().toString();
String content = mEtWriteContent.getText().toString();
FileOutputStream fio = null;
try {
fio = this.openFileOutput(MD5Encoder.encode(name), Context.MODE_PRIVATE);
fio.write(content.getBytes("utf-8"));
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fio.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 读取本地
*
* @param v
*/
public void read(View v) {
String name = mEtWriteName.getText().toString();
FileInputStream fis = null;
try {
fis = this.openFileInput(MD5Encoder.encode(name));
BufferedInputStream buffer = new BufferedInputStream(fis);
int len = 0;
byte[] b = new byte[1024];
StringBuffer stringBuffer = new StringBuffer();
while ((len = buffer.read(b)) != -1) {
stringBuffer.append(new String(b, 0, len));
}
mTvRead.setText(stringBuffer);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 写入sdcard
*
* @param v
*/
public void writeSd(View v) {
// sdcard是否挂载
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String name = mEtWriteName.getText().toString();
String content = mEtWriteContent.getText().toString();
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + name;
// 创建文件夹
File dir = new File(path);
// 如果dir不存在,或者不是文件夹
if (!dir.exists() || !dir.isDirectory()) {
dir.mkdir();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(dir, MD5Encoder.encode(name)));
fos.write(content.getBytes("utf-8"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} else {
return;
}
}
/**
* 读取sdcard
*
* @param v
*/
public void readSd(View v) {
// sdcard是否挂载
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String name = mEtWriteName.getText().toString();
// 本地路径
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + name;
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(path, MD5Encoder.encode(name)));
BufferedInputStream buffer = new BufferedInputStream(fis);
int len = 0;
byte[] b = new byte[1024];
StringBuffer stringBuffer = new StringBuffer();
while ((len = buffer.read(b)) != -1) {
stringBuffer.append(new String(b, 0, len));
}
mTvRead.setText(stringBuffer);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} else {
return;
}
}
}
<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="com.xspacing.filetest.MainActivity" >
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="文件名" />
<EditText
android:id="@+id/et_write"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="文件内容" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="write"
android:text="写入本地" />
<TextView
android:id="@+id/read_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="read"
android:text="读取本地" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="writeSd"
android:text="写入sdcard" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="readSd"
android:text="读取sdcard" />
LinearLayout>
AndroidManifest.xml
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />