android開發之路10(檔案的讀寫),android之路
1.安卓中檔案的資料存放區執行個體(將檔案儲存到手機內建儲存空間中):
①MainActivity.java
public class MainActivity extends Activity implements OnClickListener{
private Button mButton;
private EditText etFilename;
private EditText etFileContent;
/**
* 檔案的儲存:
* 第一步:建立布局檔案(包括檔案名稱的填寫,內容的填寫);
* 第二步:在我們的主Activity中擷取控制項的對象,並給按鈕設定監聽器,用來完成擷取填寫內容,和儲存檔案的操作
* 第三步:通常我們都會將項目中的業務類放到service層中,因此我們需要建立業務類,並完成檔案的寫入功能
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton=(Button) findViewById(R.id.button);
mButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
etFilename=(EditText) findViewById(R.id.filename);
etFileContent=(EditText) findViewById(R.id.filecontent);
String filename=etFilename.getText().toString();
String filecontent=etFileContent.getText().toString();
FileService service=new FileService(getApplicationContext());
try {
service.save(filename,filecontent);
Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), R.string.fail, Toast.LENGTH_LONG);
e.printStackTrace();
}
}
}
②FileService .java
public class FileService {
private Context context;
public FileService(Context context) {
this.context = context;
}
//儲存檔案到手機內部儲存
public void save(String filename,String filecontent) throws Exception{
/**
* FileOutputStream:檔案輸出資料流
* openFileOutput()方法中:
* 參數1.要儲存的檔案名稱;參數2.儲存檔案的操作模式
* 這裡我們使用私人操作模式,即建立出來的檔案只能被本應用訪問,其他應用無法訪問該檔案,
* 另外採用私人操作模式建立的檔案,寫入檔案中的內容會覆蓋源檔案的內容
*/
FileOutputStream outputStream=context.openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(filecontent.getBytes());
outputStream.close();
}
//讀取檔案從手機內部儲存
public String read(String filename) throws Exception{
//FileInputStream:檔案輸入資料流
FileInputStream inputStream=context.openFileInput(filename);
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=0;
while((len=inputStream.read(buffer)) != -1){
outputStream.write(buffer, 0, len);
}
byte[] data=outputStream.toByteArray();
return new String(data);
}
}
③單元測試類:FileServiceTest .java
public class FileServiceTest extends AndroidTestCase{
private static final String TAG="FileServiceTest";
//單元測試方法testSave()方法用來測試我們的save(String filename,String filecontent)方法是否有錯
public void testSave() throws Throwable{
FileService service=new FileService(this.getContext());
service.save("456.txt", "sdfdgsdfasd");
Log.i(TAG, "成功");
}
//單元測試testRead()方法用來測試我們的read(String filename)方法是否有錯
public void testRead() throws Throwable{
FileService service=new FileService(this.getContext());
String result=service.read("123.txt");
Log.i(TAG, result);
}
}
④資訊清單檔AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rookie.test1"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="10" />
<!--指定單元測試的唯一標識 -->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.rookie.test1"
android:label="testapp"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!--添加單元測試環境 -->
<uses-library android:name="android.test.runner"/>
<activity
android:name=".MainActivity"
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>
</manifest>
⑤布局檔案activity_main.xml(省略)
2.安卓中檔案的資料存放區執行個體(將資料儲存到手機的SD卡中)
要想將資料儲存到sd卡中,我們首先要在資訊清單檔中設定相關的使用許可權,
如:
<!--在sd卡中建立檔案與刪除檔案的許可權 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--往sd卡中寫入資料的許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
然後我們需要在上面的那個執行個體中的FileService.java添加一個方法,
用來儲存檔案到手機sdcard
public void saveToSDCard(String filename,String filecontent) throws Exception{
File file=new File(Environment.getExternalStorageDirectory(), filename);
FileOutputStream outputStream=new FileOutputStream(file);
outputStream.write(filecontent.getBytes());
outputStream.close();
}
然後我們需要在MainActivity.java檔案中將之前重寫的onClick()方法改寫成:
@Override
public void onClick(View v) {
etFilename=(EditText) findViewById(R.id.filename);
etFileContent=(EditText) findViewById(R.id.filecontent);
String filename=etFilename.getText().toString();
String filecontent=etFileContent.getText().toString();
FileService service=new FileService(getApplicationContext());
try {
//判斷sd卡是否存在,並可以讀寫
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
service.saveToSDCard(filename, filecontent);
Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(), R.string.sd_error, Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), R.string.fail, Toast.LENGTH_LONG);
e.printStackTrace();
}
}
至此,我們已經完成了檔案寫入sd卡的功能代碼,那麼運行一下試試看吧!