当前位置: 代码迷 >> Android >> Android数据储存之文件存储
  详细解决方案

Android数据储存之文件存储

热度:16   发布时间:2016-05-01 13:05:10.0
Android数据存储之文件存储

关于文件存储,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);

  相关解决方案