最近在学习Android中的数据存储以及IO部分。下面写了两个关于文件存储的Demo
第一个是读写内存中的文件。
主要步骤:
1、如果是读取文件,调用的是Android的ApI中的openFileInput(String name),返回FileInputStream()对象;
其余操作步骤跟javaSE中文件的读取方法一致。
2、如果是写入文件,调用Andoroid的API中的openFIleOutput(String name,int MODE),后面的参数是设置文件写入权限。然后和javaSE中的写入方法一致
下面值实例(布局就是两个button和editText,TextView):
activity_main.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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/writeText" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写入文件"
android:id="@+id/write"
android:layout_below="@+id/writeText"
android:layout_alignStart="@+id/read" />
<TextView
android:id="@+id/readText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/write"
android:layout_alignParentStart="true"
android:layout_marginTop="76dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取文件"
android:id="@+id/read"
android:layout_centerVertical="true"
android:layout_alignParentStart="true"
android:layout_marginStart="85dp" />
<Button
android:id="@+id/nextActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="操作sd卡"
android:layout_alignParentBottom="true"
android:layout_alignStart="@+id/read"
android:layout_marginBottom="56dp" />
</RelativeLayout>
MainActivity.java
package lzl.edu.com.filedemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
public class MainActivity extends Activity implements View.OnClickListener{
private Button mRead,mWrite,mnextActivity;
private EditText mWriteText;
private TextView mReadText;
private final String FILE_NAME="lzl.xy";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRead = (Button)findViewById(R.id.read);
mWrite = (Button)findViewById(R.id.write);
mReadText=(TextView)findViewById(R.id.readText);
mWriteText=(EditText)findViewById(R.id.writeText);
mnextActivity=(Button)findViewById(R.id.nextActivity);
mnextActivity.setOnClickListener(this);
mRead.setOnClickListener(this);
mWrite.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.read:
//找到该文件,获取内容。
FileInputStream fis=null;
StringBuffer sb = null;
try{
fis = openFileInput(FILE_NAME);
byte[] by = new byte[1024];
int line = 0;
sb = new StringBuffer();
while((line = fis.read(by))!=-1){
sb.append(new String(by,0,line));
}
Toast.makeText(this,"写入成功",Toast.LENGTH_LONG).show();
mReadText.setText(sb.toString());
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if (fis != null)
fis.close();
}catch (IOException e){
e.printStackTrace();
}
}
break;
case R.id.write:
FileOutputStream fos=null;
try {
String content = mWriteText.getText().toString();//从编辑框 中获取内容写到文件中
Log.i("content---",content);
fos = openFileOutput(FILE_NAME, MODE_APPEND);
PrintStream ps = new PrintStream(fos);
ps.println(content);
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if (fos != null)
fos.close();
}catch (IOException e){
e.printStackTrace();
}
}
break;
case R.id.nextActivity:
Intent intent = new Intent(MainActivity.this,ReadSDCard.class);
startActivity(intent);
break;
}
}
}
下面是操作SD卡的文件读写
首先注意的是:sd要在AndroidManifest.xml文件中设置读写、创建的权限
<!--在sd卡中,添加创建于删除文件的权限-->
<uses-permission android:name="ANDROID.PERMISSION.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--在sd卡中,写入文件的权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
activity_read_sdcard.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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="lzl.edu.com.filedemo.ReadSDCard">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/writeText_sd" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写入sd卡文件"
android:id="@+id/write_sd"
android:layout_below="@+id/writeText_sd"
android:layout_alignStart="@+id/read_sd" />
<TextView
android:id="@+id/readText_sd"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/write_sd"
android:layout_alignParentStart="true"
android:layout_marginTop="76dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取sd卡文件"
android:id="@+id/read_sd"
android:layout_centerVertical="true"
android:layout_alignParentStart="true"
android:layout_marginStart="85dp" />
</RelativeLayout>
ReadSDCard.java
package lzl.edu.com.filedemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
public class ReadSDCard extends Activity implements View.OnClickListener{
private Button mReadSD,mWriteSD;
private EditText mWriteSDText;
private TextView mReadSDText;
private final String FILE_NAME = "/lzl.xy";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read_sdcard);
mReadSD = (Button)findViewById(R.id.read_sd);
mWriteSD = (Button)findViewById(R.id.write_sd);
mReadSDText = (TextView)findViewById(R.id.readText_sd);
mWriteSDText = (EditText)findViewById(R.id.writeText_sd);
mReadSD.setOnClickListener(this);
mWriteSD.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.write_sd:
String content = mWriteSDText.getText().toString();
Log.i("contentioioioio",content);
wirte(content);
break;
case R.id.read_sd:
boolean flag = read();
if(flag){
Toast.makeText(ReadSDCard.this,"读取成功",Toast.LENGTH_LONG).show();
}
break;
}
}
//定义读取数据的方法
public boolean read(){
boolean flag = false;
//1.判断手机是否插入SD卡,若插有,则向里面进行制定文件的操作
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//2.获取sd卡的路径
File sdcardPath = Environment.getExternalStorageDirectory();
//3.创建FileInputStream 读取指定文件
FileInputStream fis = null;
try {
fis = new FileInputStream(sdcardPath.getCanonicalPath() + FILE_NAME);
//将文件内容与缓冲区建立联系
BufferedReader bufr = new BufferedReader(new InputStreamReader(fis));
String line = null;
StringBuffer sb = new StringBuffer();
while((line = bufr.readLine())!=null){
sb.append(new String(line));
Log.i("content------------",sb.toString());
}
mReadSDText.setText(sb.toString());
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if(fis!=null)
fis.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return flag;
}
//定义写入数据的方法
public void wirte(String content){
//1.判断手机是否插入SD卡,若插有,则向里面进行制定文件的操作
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//2.获取sd卡的路径
File sdcardPath = Environment.getExternalStorageDirectory();
//3.创建文件类
File myFile = null;
//使用Android特有的方法,对文件进行写操作
RandomAccessFile raf = null;
try {
myFile= new File(sdcardPath.getCanonicalPath() + FILE_NAME);
raf = new RandomAccessFile(myFile, "rw");
//4.将文件记录指针移向最后。
raf.seek(myFile.length());
raf.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
raf.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}