但使书种多,会有岁稔时。这篇文章主要讲述Android数据存储- File相关的知识,希望能为你提供帮助。
个人学习整理。如有不足之处,请不吝不吝赐教。
转载请注明:@CSU-Max
【Android数据存储- File】
读写本应用程序数据目录中的文件
此种方法读写的文件在/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
:
该文件的内容能够被其它应用程序读和写
实例:
本实例程序界面上文件输入部分有一个输入框和一个button。点击button能够将输入框中输入的信息写入到指定的文件里去;读取部分有一个文本框和一个button,点击button文本框会显示指定文件里的内容。
读取:
写入:
文章图片
文章图片
文章图片
实例代码:
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; // 写入文件button private Button bt_main_out; // 读取文件button 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); // 点击button将输入框中的内容写到文件里 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(""); } }); // 点击button将文件里内容读取出来显示在文本框中 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 *
***************************************************************************
推荐阅读
- Android加入新的视频格式--媒体库扫描
- Android和MVC
- Android6.0运行时权限(基于RxPermission开源库)
- Android实践--监測网络状态
- Android之——经常使用手机号码功能
- Android权限大全(链接地址整理)
- Android之Intent和Activity
- android一步一步实现视频clientapp
- “小懒虫”安卓手机控制电脑关机