下文转自;
http://www.cnblogs.com/tjpfly/archive/2011/05/20/android_sdcard_file_save_read.html
---------------------------------------------------------------------------------------------
文件读写&访问sdcard&文件操作模式
文件操作模式
MODE_APPEND 只能被创建的应用使用 ,如果有就追加,没有就创建
MODE_PRIVATE 只能被创建应用使用,写入文件的时候会覆盖
MODE_WORLD_READABLE 其他应用程序可以读取
MODE_WORLD_WRITEABLE 其他应用程序可以写 覆盖原有程序
需要什么模式就让这些操作模式相加
访问sdcard
1、在程序中要访问sd卡就要申请sd卡的访问权限
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2、sd卡路径
2.2前 /sdcard
2.2后 /mnt/sdcard 最好获得路径方法:Environment.getExternalStorageDirectory()
3、将文件写入sdcard的时候要判断用户时候插入sdcard并且可以读写
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
文件读写
1、当用上下文保存的时候
路径在 data/data/包名/files下面
另外访问方式:/data/data/包/files/文件名 e:/data/data/com.tjp/files/tjpable
2、查看是在 file exploer
3、导出文件
4、当使用上下文保存的时候
FileOutputStream outputStream= context.openFileOutput(fileName, Context.MODE_PRIVATE);//保存
FileInputStream inputStream=context.openFileInput(fileName);//读取
5、在activity中获得路径
File file= this.getFilesDir();//快速得到文件夹
this.getCacheDir();//获得缓存文件夹
demo文件
< manifest xmlns:android ="http://schemas.android.com/apk/res/android"
package ="com.tjp"
android:versionCode ="1"
android:versionName ="1.0" >
< uses-sdk android:minSdkVersion ="7" />
< application android:icon ="@drawable/icon" android:label ="@string/app_name" >
< uses-library android:name ="android.test.runner" />
< activity android:name =".FileActivity"
android:label ="@string/app_name" >
< intent-filter >
< action android:name ="android.intent.action.MAIN" />
< category android:name ="android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >
</ application >
< instrumentation android:name ="android.test.InstrumentationTestRunner"
android:targetPackage ="com.tjp" android:label ="test my activity" />
<!-- 在SDCard中创建与删除文件权限 -->
< uses-permission android:name ="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
< uses-permission android:name ="android.permission.WRITE_EXTERNAL_STORAGE" />
</ manifest >
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
>
< TextView
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:text ="@string/fileName"
/>
< EditText
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:id ="@+id/fileName"
/>
< TextView
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:text ="@string/content"
/>
< EditText
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:minLines ="3"
android:id ="@+id/content"
/>
< Button
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:text ="@string/save"
android:id ="@+id/btnsave"
/>
</ LinearLayout >
< resources >
< string name ="hello" > Hello World, FileActivity! </ string >
< string name ="app_name" > 文件读取 </ string >
< string name ="fileName" > 文件名称 </ string >
< string name ="content" > 文件内容 </ string >
< string name ="save" > 保存 </ string >
< string name ="success" > 文件保存成功 </ string >
< string name ="error" > 文件保存失败 </ string >
< string name ="sdcarderror" > sdCard不存在或写保护 </ string >
</ resources >
import java.io.File;
import com.tjp.service.FileService;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class FileActivity extends Activity {
/** Called when the activity is first created. */
private static final String TAG = " FileActivity " ;
private FileService fileService;
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.btnsave);
fileService = new FileService( this );
File file = this .getFilesDir(); // 快速得到文件夹
this .getCacheDir(); // 获得缓存文件夹
button.setOnClickListener( new View.OnClickListener(){
@Override
public void onClick(View v) {
EditText fileNameText = (EditText)findViewById(R.id.fileName);
EditText contenText = (EditText)findViewById(R.id.content);
String fileName = fileNameText.getText().toString();
String content = contenText.getText().toString();
try {
// 判断sd卡是否存在手机上并且可以进行读写
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
fileService.save2sdCard(fileName, content);
Toast.makeText(FileActivity. this , R.string.success, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(FileActivity. this , R.string.sdcarderror, Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Log.e(TAG, e.toString());
Toast.makeText(FileActivity. this , R.string.error, Toast.LENGTH_SHORT).show();
}
}
});
}
}
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import android.content.Context;
import android.os.Environment;
public class FileService {
private Context context;
public FileService(Context context) {
this .context = context;
}
/**
* 保存内容到sd卡中(以私有文件形式保存)
* @param filename 文件名称
* @param content 文件内容
* @throws Exception
*/
public void save2sdCard(String fileName,String content) throws Exception{
File file = new File(Environment.getExternalStorageDirectory(),fileName);
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(content.getBytes());
outputStream.close();
}
/**
* 保存内容(以私有文件形式保存)
* @param filename 文件名称
* @param content 文件内容
* @throws Exception
*/
public void save(String fileName,String content) throws Exception{
FileOutputStream outputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE);
outputStream.write(content.getBytes());
outputStream.close();
}
/**
* 保存内容(以私有文件形式保存+追加)
* @param filename 文件名称
* @param content 文件内容
* @throws Exception
*/
public void saveAppend(String fileName,String content) throws Exception{ // ctrl+shift+y 变小写 ctrl+shift+x 变大写
FileOutputStream outputStream = context.openFileOutput(fileName, Context.MODE_APPEND);
outputStream.write(content.getBytes());
outputStream.close();
}
/**
* 保存内容(允许其他应用读取)
* @param filename 文件名称
* @param content 文件内容
* @throws Exception
*/
public void saveReadAble(String fileName,String content) throws Exception{
FileOutputStream outputStream = context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
outputStream.write(content.getBytes());
outputStream.close();
}
/**
* 文件读取
* @param fileName
* @return
* @throws Exception
*/
public String read(String fileName) throws Exception{
FileInputStream inputStream = context.openFileInput(fileName);
byte [] buffer = new byte [ 1024 ];
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int len =- 1 ;
while ((len = inputStream.read(buffer)) !=- 1 ){ // 读取文件到缓冲区
byteArrayOutputStream.write(buffer, 0 , len); // 写入到内存
}
byte [] data = byteArrayOutputStream.toByteArray(); // 将内存中的二进制数据转为数组
byteArrayOutputStream.close();
inputStream.close();
return new String(data);
}
}