文件读写&访问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文件
<?xml version="1.0" encoding="utf-8"?>
<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>
<?xml version="1.0" encoding="utf-8"?>
<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>
<?xml version="1.0" encoding="utf-8"?>
<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>
package com.tjp;
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();
}
}
});
}
}
package com.tjp.service;
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);
}
}