二、文件内部file存储
联想:sp 永久存储、适合存简单类型的数据,以键值对形式
特征:
1、存储的类型是任意格式,可以是文档、图片、音频
2、存储位置:/data/data/应用的包名/files/ 下面
3、应用卸载时,数据删除
4、适合于数据私有时,使用此种存储形式
保存步骤:
1、获取保存内容
2、获取文件输出流 FileOutputStream
方式一:
FileOutputStream fos =new FileOutputStream(getFilesDir(),文件名);
方式二:
FileOutputStream fos=openFileOuput(文件名,mode);
3、写入流的具体语句
读取步骤:
1、获取读取的文件名
2、获取文件输入流 FileInputStream
方式一:
FileInputStream fis =new FileInputStream(getFilesDir(),文件名);
方式二:
FileInputStream fis=openFileInput(文件名,mode);
3、读取流的具体语句(一般封装成utils工具类的方法)
.xml
<EditText
android:id="@+id/et_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入文件名" />
<EditText
android:id="@+id/et_details"
android:layout_below="@id/et_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入文件内容" />
<Button
android:id="@+id/save2"
android:onClick="save2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/save1"
android:layout_alignParentBottom="true"
android:layout_marginBottom="152dp"
android:text="保存2" />
<Button
android:id="@+id/save1"
android:onClick="save1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/save2"
android:layout_alignParentLeft="true"
android:layout_marginBottom="40dp"
android:layout_marginLeft="20dp"
android:text="保存1" />
<Button
android:id="@+id/read1"
android:onClick="read1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/save1"
android:layout_alignBottom="@+id/save1"
android:layout_marginLeft="55dp"
android:layout_toRightOf="@+id/save1"
android:text="读取1" />
<Button
android:id="@+id/read2"
android:onClick="read1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/save2"
android:layout_alignBottom="@+id/save2"
android:layout_alignLeft="@+id/read1"
android:text="读取2" />
.java
public class MainActivity extends ActionBarActivity {
private EditText et_name;
private EditText et_details;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = (EditText) findViewById(R.id.et_name);//得到文件名
et_details = (EditText) findViewById(R.id.et_details);//得到文件内容
}
/**
* 方式一储存
* @param view
*/
public void save1(View view){
String name = et_name.getText().toString();//文件名的名字
String details = et_details.getText().toString();//文件的内容
//文件的写入步骤 得到文件的地址
File path=getFilesDir();
//创建的FileOutputStream对象
FileOutputStream fos=null;
try {
//创建流,并同时制定写入文件
fos = new FileOutputStream(path+"/"+name);
//写入内容
fos.write(details.getBytes());
Toast.makeText(MainActivity.this, "save1储存成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}finally{
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//清空
et_name.setText("");
et_details.setText("");
}
/**
* 读取指定文件
* @throws FileNotFoundException
*/
public void read1(View view) throws FileNotFoundException{
String filename = et_name.getText().toString();//文件名
File file=new File(getFilesDir(),filename);
if("".equals(filename)){
Toast.makeText(MainActivity.this, "没有指定问件名", 0).show();
return;
}
if(!file.exists()){
Toast.makeText(MainActivity.this, "文件不存在", 0).show();
et_name.setText(null);
et_name.requestFocus();//获取光标
return;
}
//文件读取流的步骤
FileInputStream fis=new FileInputStream(file);
//调用工具类的方法
et_details.setText(StreamUtils.streamToString(fis));
}
/**
* 方式二 储存
* @param view
* @throws FileNotFoundException
*/
public void save2(View view) throws FileNotFoundException{
String filename = et_name.getText().toString();//文件名的名字
String details = et_details.getText().toString();//文件的内容
FileOutputStream fos=null;
//写入对象 同时指定写入文件
fos=openFileOutput(filename, Context.MODE_PRIVATE);
try {
fos.write(details.getBytes());
Toast.makeText(MainActivity.this, "save2存储成功", 0).show();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//清空
et_name.setText("");
et_details.setText("");
}
/**
* 方式二 读取
* @param view
* @throws FileNotFoundException
*/
public void read2(View view) throws FileNotFoundException{
String filename = et_name.getText().toString();
File file = new File(getCacheDir(),filename);
if("".equals(filename)){
Toast.makeText(MainActivity.this, "没有指定问件名", 0).show();
return;
}
if(!file.exists()){
Toast.makeText(MainActivity.this, "文件不存在", 0).show();
et_name.setText(null);
et_name.requestFocus();//获取光标
return;
}
//文件读取流的步骤
FileInputStream fis=openFileInput(filename);
//调用工具类的方法
et_details.setText(StreamUtils.streamToString(fis));
}
}
工具类StreamUtils的代码
public class StreamUtils {
/*
* 实现将输入流转换成字符串
*/
public static String streamToString(InputStream is){
byte[] b=new byte[100];
int len = -1;
StringBuffer buffer=new StringBuffer();
try {
while((len=is.read(b))!=-1){
buffer.append(new String(b,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if (is!=null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return buffer.toString();
}
}