一、Android数据存储方式
•1.文件
•2.SQLite数据库
•3.SharedPreferences(参数)
•4.内容提供者(Content Providers)
•5.网络
二、文件操作模式
•1.Context.MODE_PRIVATE-私有模式:写入的内容会覆盖原文件的内容,且其它应用无法访问该文件
直接new FileOutputStream时第二个参数设置为true,也是追加模式
•2.Context.MODE_APPEND-追加模式:把内容追加到文件末尾,不会覆盖原文件的内容,且其它应用无法访问该文件
•3.Context.MODE_WORLD_READABLE:表示当前文件可以被其它应用读取
•4.Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其它应用写入
如果希望文件被其它应用读和写,可以写成:
openFileOutput(filename,Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);
三、getCacheDir()和getFilesDir()方法
1)getCacheDir():获取"/data/data/<package_name>/cache"目录
2)getFilesDir():获取"/data/data/<package_name>/files"目录
四、两个方法
—1.openFileOutput (String name, int mode)
name:文件的名称,不能包含分隔符"/",如果文件不存在,Android会自动创建它。创建的文件保存在/data/data/<package_name>/files目录下。
mode:操作模式
—2.openFileInput (String name)
五、文件事例
FileStream_MainAct.java
/**
*
<activity
android:name="com.test.FileStream.FileStream_MainAct"
android:label="@string/app_name">
<intent-filter >
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
*/
import java.io.IOException;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class FileStream_MainAct extends Activity {
private OnClickListener listener = null;
public TextView filenameTV;
public EditText filenameET;
public TextView filecontentTV;
public EditText filecontentET;
private Button savebtn=null;
private Button readbtn=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filestream_mainact);
filenameTV = (TextView) findViewById(R.id.filenameTV);
filenameET = (EditText) findViewById(R.id.filenameET);
filecontentTV = (TextView) findViewById(R.id.filecontentTV);
filecontentET = (EditText)findViewById(R.id.filecontentET);
savebtn = (Button)findViewById(R.id.savebtn);
readbtn = (Button)findViewById(R.id.readbtn);
listener = new OnClickListener(){
public void onClick(View v){
switch(v.getId()){
case R.id.savebtn:
//save
try {
String filename = filenameET.getText().toString();
String content = filecontentET.getText().toString();
FileStreamService fileSave = new FileStreamService(getApplicationContext());
fileSave.save(filename, content);
Toast.makeText(FileStream_MainAct.this, filename+"保存成功", Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.readbtn:
//read
try {
String filename = filenameET.getText().toString();
FileStreamService fileSave = new FileStreamService(getApplicationContext());
String str = fileSave.read(filename);
Toast.makeText(FileStream_MainAct.this, str, Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
};
savebtn.setOnClickListener(listener);
readbtn.setOnClickListener(listener);
}
}
FileStreamService.java
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import android.content.Context;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
public class FileStreamService {
private Context context;
public FileStreamService(Context context) {
this.context = context;
}
/**
* 保存文件在本应用目录下
* @param filename
* @param content
*/
public void save(String filename, String content) throws IOException{
/**
* context.openFileOutput方法得到FileOutputStream创建的文件保存在"data/data/<package_name>/files"目录下
* 文件操作模式:
context.openFileOutput方法得到FileOutputStream时的第二个参数
1)Context.MODE_PRIVATE-私有操作模式:写入文件中的内容会覆盖原文件的内容,且其它应用无法访问该文件
2)Context.MODE_APPEND-追加模式:把内容追加到文件末尾,不会覆盖原文件的内容,且其它应用无法访问该文件
3)Context.MODE_WORLD_READABLE:表示当前文件可以被其它应用读取
4)Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其它应用写入
如果希望文件被其它应用读和写,可以写成:
openFileOutput(filename, Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);
*
* 直接new FileOutputStream可以把第二个参数设置为true,即为追加模式
*
*/
FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_PRIVATE);
outStream.write(content.getBytes());
outStream.close();
}
/**
* 读取文件内容
* @param filename
* @return
* @throws IOException
*/
public String read(String filename) throws IOException{
FileInputStream inStream = context.openFileInput(filename);
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
while((len = inStream.read(buffer)) != -1){
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
inStream.close();
outStream.close();
return new String(data);
}
/**
* 保存文件到sd卡中
* @param filename
* @param content
* @throws IOException
*
* 操作SD卡需要申请权限:
<!-- 在SD卡中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- SD卡写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
*/
public void saveToSDCard(String filename, String content) throws IOException{
//需要先获取sd卡的状态,避免sd卡已满或者写保护
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//Environment.getExternalStorageDirectory():获取系统SD卡路径
File file = new File(Environment.getExternalStorageDirectory(), filename);
FileOutputStream outStream = new FileOutputStream(file);
outStream.write(content.getBytes());
outStream.close();
}else{
//sd卡不存在或者写保护
}
}
}
filestream_mainact.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".s_demo_MainActivity" >
<TextView
android:id="@+id/filenameTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="文件名:" />
<EditText
android:id="@+id/filenameET"
android:layout_width="200dp"
android:layout_height="20dp"
android:background="#ee0000"
android:layout_toRightOf="@id/filenameTV"
/>
<TextView
android:id="@+id/filecontentTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="内容:"
android:layout_below="@id/filenameET"
/>
<EditText
android:id="@+id/filecontentET"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#ee0000"
android:layout_below="@id/filenameET"
android:layout_toRightOf="@id/filecontentTV"
/>
<Button
android:id="@+id/savebtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/filecontentET"
android:text="save"/>
<Button
android:id="@+id/readbtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/filecontentET"
android:layout_toRightOf="@id/savebtn"
android:text="read"/>
</RelativeLayout>
4、getCacheDir()和getFilesDir()方法
1)getCacheDir():获取"/data/data/<package_name>/cache"目录
2)getFilesDir():获取"/data/data/<package_name>/files"目录
1)getCacheDir():获取"/data/data/<package_name>/cache"目录
2)getFilesDir():获取"/data/data/<package_name>/files"目录
保存图片
public void saveBitmap(Bitmap bitmap)
{
Log.e(TAG, "保存图片");
File f = new File("/data/data/com.ui/pic/", "111.jpg");
if (f.exists())
{
f.delete();
}
try
{
FileOutputStream out = new FileOutputStream(f);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
Log.i(TAG, "已经保存");
}
catch (Exception e)
{
e.printStackTrace();
}
}