【Android数据存储】- File
时间:2014-05-11 18:34:50
收藏:0
阅读:480
个人学习整理,如有不足之处,请不吝指教。转载请注明:@CSU-Max
读写本应用程序数据文件夹中的文件
此种方法读写的文件在/data/data/<应用程序包名>中
android
中提供了 openFileInput(String fileName) 和 openFileOutput(String
fileName, int mode) 两个方法来读取本应用程序数据文件夹中的文件和向其写入。
openFileInput(String fileName)
打开文件输入流
openFileOutput(String fileName, int mode) 打开文件输出流
注:openFileOutput(String fileName, int mode)
中的参数 mode 指定文件打开的形式:
MODE_PRIVATE :该文件只能被当前程序读写
MODE_APPEND :以追加的模式打开文件,应用程序可以向文件中追加内容
MODE_WORLD_READABLE
:该文件的内容可以被其他应用程序读取
MODE_WORLD_WRITEABLE
: 该文件的内容可以被其他应用程序读和写
实例:
本实例程序界面上文件输入部分有一个输入框和一个按钮,点击按钮可以将输入框中输入的信息写入到指定的文件中去;读取部分有一个文本框和一个按钮,点击按钮文本框会显示指定文件中的内容。
读取: 写入:
验证写入:
实例代码:
package com.example.filedemo;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
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;
/**
*
* @author CSUMax
* @version 1.0 2014-4-24
*/
public class MainActivity extends Activity {
private Button bt_main_in; // 写入文件按钮
private Button bt_main_out; // 读取文件按钮
private EditText et_main_in;// 输入文本框
private TextView tv_main_out;// 显示文件内容
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt_main_in = (Button) this.findViewById(R.id.bt_main_in);
bt_main_out = (Button) this.findViewById(R.id.bt_main_out);
et_main_in = (EditText) this.findViewById(R.id.et_main_in);
tv_main_out = (TextView) this.findViewById(R.id.tv_main_out);
// 点击按钮将输入框中的内容写到文件中
bt_main_in.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String fileName = "demo.txt";
String text = et_main_in.getText().toString();
writeToFile(text, fileName);
et_main_in.setText("");
}
});
// 点击按钮将文件中内容读取出来显示在文本框中
bt_main_out.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String fileName = "demo.txt";
tv_main_out.setText(readFromFile(fileName));
}
});
}
/**
* 读取文件
*
* @param fileName
* @return
*/
public String readFromFile(String fileName) {
try {
FileInputStream fis = openFileInput(fileName);
byte[] bytes = new byte[1024];
StringBuffer sb = new StringBuffer();
int i = 0;
i = fis.read(bytes);
if (i > 0) {
sb.append(new String(bytes, 0, i));
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 写入文件
*
* @param text
* 写入的内容
* @param fileName
* 目标文件的文件名
*/
public void writeToFile(String text, String fileName) {
try {
// MODE_APPEND模式写入,即追加模式
FileOutputStream fos = openFileOutput(fileName, MODE_APPEND);
PrintStream ps = new PrintStream(fos);
ps.println(text);
ps.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
程序中的 demo.txt 文件可以通过 File Explorer 中 /data/data/<应用程序包名>/files/demo.txt
看到,如下图所示(由于无关文件较多,故分开截成两幅图了):
读取资源文件中的文件
此处以读取 resource 的 raw 中文件为例,在 res 文件夹下新建一个 raw 文件夹,将之前的 demo.txt 文件复制进去。
主要代码:
public class ReadFileUtil {
public static String readFromRaw(Context context, int id) {
String str = "";
try {
// 得到输入流
InputStream is = context.getResources().openRawResource(id);
int length = is.available();
byte[] bytes = new byte[length];
int i = 0;
i = is.read(bytes);
if (i > 0) {
// 设置编码
str = EncodingUtils.getString(bytes, "UTF-8");
}
is.close();
return str;
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
}
测试代码:
public class ReaderTest extends AndroidTestCase {
private static final String TAG = "ReaderTest";
public void testReadFromRaw() {
Log.i(TAG, "---------------");
String str = "Failed";
str = ReadFileUtil.readFromRaw(getContext(), R.raw.demo);
Log.i(TAG, "========>" + str + "<========");
}
}
注:资源文件下的文件通过 R 文件中确定的 id 来访问,如此处 R.raw.demo
。
读写 SD 卡上的文件
有时候我们会把一些数据存储在SD卡上,现在我们来模拟一下,在 File
Explorer 视图中向/mnt/sdcard/目录下添加之前的 demo.txt 文件,现在试着读取该文件中信息并向其中写入信息。
主要代码:
public class ReadFileUtil {
public static String readFromSdcard(String fileName) {
String str = "";
try {
FileInputStream fis = new FileInputStream(fileName);
int length = fis.available();
byte[] bytes = new byte[length];
int i = 0;
i = fis.read(bytes);
if (i > 0) {
// 设置编码
str = EncodingUtils.getString(bytes, "UTF-8");
}
fis.close();
return str;
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
/**
* --注意向SD卡中的文件写入信息时,要在AndroidManifest.xml文件中加入相应的权限--
*/
public static void writeToSdcard(String text, String fileName){
try {
//构造方法的第二个参数表示追加模式
FileOutputStream fos = new FileOutputStream(fileName, true);
byte[] bytes = text.getBytes();
fos.write(bytes);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试代码:
public class ReaderTest extends AndroidTestCase {
private static final String TAG = "ReaderTest";
public void testReadFromSdcard() {
Log.i(TAG, "---------------");
String str = "Failed";
str = ReadFileUtil.readFromSdcard("/mnt/sdcard/demo.txt");
Log.i(TAG, "========>" + str + "<========");
}
public void testWriteToSdcard() {
Log.i(TAG, "---------------");
String text = " Max ";
ReadFileUtil.writeToSdcard(text, "/mnt/sdcard/demo.txt");
}
}
注:
一般读写本应用程序中的文件要使用 openFileInput 和 openFileOutput
;而读写 SD 卡中的文件需要使用 FileInputStrea 和 FileOutputStream 。
默认对SD卡中文件只有可读权限,所以向SD卡中写入数据时需要加入相应的权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
***************************************************************************
* 转载请注明出处: @CSU-Max http://blog.csdn.net/csu_max *
***************************************************************************
评论(0)