• 【Android数据存储】- File



    个人学习整理。如有不足之处,请不吝不吝赐教。

    转载请注明:@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 : 该文件的内容能够被其它应用程序读和写
    实例:
           本实例程序界面上文件输入部分有一个输入框和一个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      *

                                                        ***************************************************************************



  • 相关阅读:
    Educational Codeforces Round 19 题解【ABCDE】
    喵哈哈村的魔法考试 Round #14 (Div.2) 题解
    Codeforces Round #408 (Div. 2) 题解【ABCDE】
    喵哈哈村的魔法考试 Round #13 (Div.2) 题解
    喵哈哈村的魔法考试 Round #12 (Div.2) 题解
    April Fools Contest 2017 题解
    Kaggle Titanic solution 纯规则学习
    喵哈哈村的魔法考试 Round #11 (Div.2) 题解
    Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路
    Codeforces Round #407 div2 题解【ABCDE】
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6820176.html
Copyright © 2020-2023  润新知