应用名称:文件编辑器
应用说明:
此应用将在界面输入的内容保存至手机,并能够从手机中查出显示再界面
应用总结:
1.在Android中的文件操作同样使用J2SE中的IO流操作,只不过Android系统封装更为快速的获取文件流的方法;
2.所有应用的生成的文件都在对应的应用的 data | data | files 文件夹下;
3.在 android 的应用中异常的处理在Activity中,相当与J2SE的view 处理异常;
4.抛出异常可以抛出 throwable 接口 ,之前没有想过,强悍!
5.UT 中在每个测试方法中都要初始化要使用的对象;
6.当再创建String是默认的字符集编码为Android系统的字符集;
7.Activity 在Android 相当与Controller 去掉用 Service 的业务方法实现相应的功能;
8.Toast.LENGTH_SHORT 为整数(int)
9.context.getFilesDir();//获得当前应用目录下的files文件夹
context.getCacheDir();//获得当前应用目录下的cache文件夹
10.文件的操作权限有四种:
-rwxrwxrwx : - (表示是文件类型) rwx:本应用的有读写执行权限 rwx :表示组有读写执行权限 rwx :表示其他应用有读写执行权限
r : 4
w : 2
x : 1
chomd 777 :表示修改权限为所有用户都可读写执行
1.MODE_PRIVATE : 尽允许本应用操作该文件 & 覆盖式写入 other application have no permission
2.MDOE_APPEND :尽允许本应用操作该文件 & 追加式写入 other application have no permission
3.MODE_WORLD_READABLE :可以被其他文件读取的
4.MODE_WORLD_WRITEABLE :可以被其他文件读取 ,但是是不可以被其他应用写入的
注意:
1.设置某个文件的权限被释放给所有应用则使用 MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE //或者 3
2.设置某个文件释放权限的MODE_WORLD_WRITEABLE 模式的文件以追加的方式写入的话,
可以在输出流种添加一个true 参数 :fos = new FileOutputStream(file,true);
文件清单:
1.FileActivity
2.FileService
3.FileServiceTest
4.AndroidManifest.xml
5.main.xml
1.FileActivity
package com.hisoft.qyq;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.hisoft.qyq.R;
import com.hisoft.service.FileService;
public class FileActivity extends Activity {
private Button save;
private EditText fileName;
private EditText fileContent;
private FileService service;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init() {
fileName = (EditText) findViewById(R.id.filename);
fileContent = (EditText) findViewById(R.id.text);
save = (Button) findViewById(R.id.save);
save.setOnClickListener(new ButtonOnclickListener());
}
private final class ButtonOnclickListener implements View.OnClickListener{ //final 内部类不需要被继承
@Override
public void onClick(View v) {
String fileName_str = fileName.getText().toString();
String fileContent_str = fileContent.getText().toString();
service = new FileService(getApplicationContext());//必须先检查该终端是否存在SDCard & 与权限是否放开
if (Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageState())) {
try {
// service.save(fileName_str,fileContent_str);;//调用service中的保存文件至手机存储为相应的应用分配的空间
service.saveToSDCard(fileName_str, fileContent_str);//调用service中的保存文件至SDCard
} catch (Throwable e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), R.string.fail, 1);
}
Toast.makeText(getApplicationContext(), R.string.success, 1)
.show();
} else {
Toast.makeText(getApplicationContext(), R.string.SDCardError, 1)
.show();
}
}
}2.FileService
package com.hisoft.service;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import android.content.Context;
public class FileService {
private FileOutputStream fos;
ByteArrayOutputStream baos;
private Context context;
public FileService(Context context) {
this.context = context;
}
/**
* fileName_str 文件名称 fileContent_str 文件内容
*/
public void save(String fileName_str, String fileContent_str)
throws Throwable {
// exception 抛给Activity处理
fos = context.openFileOutput(fileName_str, Context.MODE_PRIVATE);//默认保存在手机自带存储中
fos.write(fileContent_str.getBytes());
fos.close();
/*
* name 只接受文件名称,不须写路径 mode 是定义文件的使用权限
* Context.MODE_PRIVATE:创建出来的文件只有本应用使用(覆盖式写入)
*/
}
public void saveToSDCard(String fileName_str, String fileContent_str) throws Throwable{
File file = new File(Environment.getExternalStorageDirectory(), fileName_str);//因为android 升级导致系统目录的变化所以尽量使用Environment.getExternalStorageDirectory()方法获得路径
fos = new FileOutputStream(file);
fos.write(fileContent_str.getBytes());
fos.close();
}
public String read(String fileName) throws Throwable {
FileInputStream fis = context.openFileInput(fileName);
byte[] data = null;
byte[] buffer = new byte[1024];// 设置一个字节缓冲区
// StringBuffer buffer = new StringBuffer();
baos = new ByteArrayOutputStream();//创建一个内存字节数组
int len = 0;
while ((len = fis.read(buffer, 0, buffer.length)) != -1) {
baos.write(buffer, 0, len);// 将每一条数据写入内存数组
// buffer = buffer.append(content);
data = baos.toByteArray();// 调出内存中的字节数组
}
fis.close();
// return buffer.toString();
return new String(data, "UTF-8");// 转为String类型时字符集定义为UTF-8
}
}
3.FileServiceTest
package com.hisoft.test;
import android.test.AndroidTestCase;
import com.hisoft.service.FileService;
public class FileServiceTest extends AndroidTestCase {
public void testSave() throws Throwable {
FileService service = new FileService(this.getContext());
service.save("fn.xml", "nothing");
}
public void testRead() throws Throwable {
FileService service = new FileService(this.getContext());
String result = service.read("file.xml");
assertEquals("这是我的文件!", result);
}
}
4.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hisoft.qyq"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.hisoft.qyq" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<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>
<uses-library android:name="android.test.runner" />
</application>
</manifest>
5.main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/filename" />
<EditText
android:id="@+id/filename"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/content" />
<EditText
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="355dp" />
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save" />
</LinearLayout>
6.String.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">file</string>
<string name="hello">Hello World, FileActivity!</string>
<string name="filename">文件名:</string>
<string name="content">内容</string>
<string name="save">保存</string>
<string name="success">保存成功!</string>
<string name="fail">保存失败!</string>
</resources>