关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
文件可用来存放大量数据,如文本、图片、音频等。
默认位置:存放在/data/data/<package name>/files下。
下面根据个小例子来更好的理解文件存储:
阶段一:进行界面布局(如下图)
具体代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dp" android:text="@string/title" /> <EditText android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="3dp" android:text="@string/content" /> <EditText android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:scrollbars="vertical" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/save" /> </LinearLayout> </LinearLayout>
阶段二:业务层FileService
package com.lks.service; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import android.content.Context; public class FileService { private Context context; public FileService(Context context) { super(); this.context = context; } //存储数据到文件 public void save(String title, String content) throws Exception { FileOutputStream fos; fos = context.openFileOutput(title, Context.MODE_PRIVATE); fos.write(content.getBytes()); fos.close(); } //存储数据到SDCard public void saveTosdcard(String title,String filecontent) throws IOException{ //第1个参数指明sdcard的绝对路径 File file=new File("/mnt/sdcard", title); FileOutputStream fos=new FileOutputStream(file); //创建文件输出流 fos.write(filecontent.getBytes()); fos.close(); } public String readFile(String title) throws IOException { FileInputStream fis = context.openFileInput(title); int len = 0; byte[] buffer = new byte[1024]; ByteArrayOutputStream baos = new ByteArrayOutputStream();// 往内存中输出数据的 while ((len = fis.read(buffer)) != -1)// 如果数据量很大,第2次读取的数据有可能会把第1次读取的数据给覆盖掉 { baos.write(buffer, 0, len); } byte[] data = baos.toByteArray();// 得到内存中的数据 以二进制存放的 baos.close(); fis.close(); return new String(data);// 根据二进制数据转换成所对应的字符串 } }
阶段三:编写MainActivity,保存数据到手机。具体代码如下:
package com.lks.openfile; import java.io.IOException; import com.lks.service.FileService; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText titleText; private EditText contentText; private Button save; private FileService fileService; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); titleText = (EditText) this.findViewById(R.id.title); contentText = (EditText) this.findViewById(R.id.content); save = (Button) this.findViewById(R.id.save); fileService = new FileService(MainActivity.this); save.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { fileService.save(titleText.getText().toString(), contentText.getText().toString()); Toast.makeText(MainActivity.this, R.string.save_success, Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(MainActivity.this, R.string.save_fail, Toast.LENGTH_LONG).show(); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
如果是保存数据到SD卡,则MainActivity中对save组件进行处理应改为:
save.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { try { fileService.saveTosdcard( titleText.getText().toString(), contentText .getText().toString()); Toast.makeText(MainActivity.this, R.string.save_success, Toast.LENGTH_LONG) .show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, R.string.save_fail, Toast.LENGTH_LONG).show(); } } else { Toast.makeText(MainActivity.this, R.string.save_fail, Toast.LENGTH_LONG).show(); } } });
注:1.在程序中访问SDCard,你需要申请访问SDCard的权限。
在AndroidManifest.xml中<manifest>标签之后加入访问SDCard的权限如下:
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.改进
为了让程序更加通用,尽量不用绝对路径。
File file=new File(Environment.getExternalStorageDirectory(),filename);