2014年3月27日

【Android】寫入與讀取SD卡上的*.txt文件檔

各位Android安卓開發者大家好 ^^

小黑人今天要與大家分享的是針對SD上進行文字儲存檔案讀取,簡單的來說就是將文字字串存入SD-Card裡的txt文件檔,其中包含建立路徑文字寫入;而讀取的部分就是取得SD-Card上的txt文件檔內容,其中也包含檔案位置判斷與資料取出;看是一個很實用卻又好像不常使用到的範例小黑人就與大家一同分享,讓我們共同看下去吧。

 1. 首先我們要先在AndroidManifest.xml加入SD卡的使用權限,讓我們可以寫入資料與讀取資料。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2.
再來我們建立一個簡單的Layout就好,因為重點是在*.java檔中進行。

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dip"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="儲存文字 : "
    />
    <EditText
    android:id="@+id/edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="請輸入儲存文字"
    />
    <Button
    android:id="@+id/setBtn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="文字儲存至SD"
    />
    <TextView
    android:layout_width="match_parent"
    android:layout_height="1dip"
    android:background="#000000"
    android:layout_marginTop="40dip"
    android:layout_marginBottom="40dip"
    />
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="讀取文字 : "
    />
    <TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
    <Button
    android:id="@+id/getBtn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="讀取SD卡文字"
    />
</LinearLayout>


3. 最後在*.java檔進行存入讀取解析的動作就完成囉。
public class MainActivity extends Activity
{
        //寫入按鈕與讀取按鈕
        private Button mSetBtn, mGetBtn;
        //輸入儲存文字的EditText
        private EditText mEdit;
        //顯示讀取文字的TextView
        private TextView mText;

        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                mSetBtn = (Button) findViewById(R.id.setBtn);
                mEdit = (EditText) findViewById(R.id.edit);
                mGetBtn = (Button) findViewById(R.id.getBtn);
                mText = (TextView) findViewById(R.id.text);

                mSetBtn.setOnClickListener(new OnClickListener()
                {
                        @Override
                        public void onClick(View v)
                        {
                                try
                                {
                                   File mSDFile = null;
                                       
                             //檢查有沒有SD卡裝置
                             if(Environment.getExternalStorageState().equals( Environment.MEDIA_REMOVED))
                             {
                               Toast.makeText(MainActivity.this , "沒有SD!!!" , Toast.LENGTH_SHORT ).show();
                               return ;
                             }
                             else 
                             {
                               //取得SD卡儲存路徑
                               mSDFile = Environment.getExternalStorageDirectory();
                               }

                             //建立文件檔儲存路徑
                             File mFile = new File(mSDFile.getParent() + "/" + mSDFile.getName() + "/MyAndroid");

                             //若沒有檔案儲存路徑時則建立此檔案路徑
                             if(!mFile.exists())
                             {
                                 mFile.mkdirs();
                             }

                             //取得mEdit文字並儲存寫入至SD卡文件裡
                             FileWriter mFileWriter = new FileWriter( mSDFile.getParent() + "/" + mSDFile.getName() + "/MyAndroid/Pubby.txt" );

                             mFileWriter.write(mEdit.getText().toString());
                             mFileWriter.close();
                             Toast.makeText(MainActivity.this, "已儲存文字", Toast.LENGTH_SHORT).show();
                                }
                                catch (Exception e)
                                {
                                }
                        }
                });

                mGetBtn.setOnClickListener(new OnClickListener()
                {
                        @Override
                        public void onClick(View v)
                        {
                                try
                                {
                                   //取得SD卡儲存路徑
                                   File mSDFile = Environment.getExternalStorageDirectory();
                                   //讀取文件檔路徑
                                   FileReader mFileReader = new FileReader(mSDFile.getParent() + "/" + mSDFile.getName() + "/MyAndroid/Pubby.txt");

                                   BufferedReader mBufferedReader = new BufferedReader(mFileReader);
                                   String mReadText = "";
                                   String mTextLine = mBufferedReader.readLine();

                                   //一行一行取出文字字串裝入String裡,直到沒有下一行文字停止跳出
                                   while (mTextLine!=null)
                                   {
                                           mReadText += mTextLine+"\n";
                                           mTextLine = mBufferedReader.readLine();
                                   }
                                   //文字放入mText裡,並清空mEdit
                                  mText.setText(mReadText);
                                  Toast.makeText(MainActivity.this, "已讀取文字", Toast.LENGTH_SHORT).show();
                                  mEdit.setText("");
                                }
                                catch(Exception e)
                                {
                                }
                        }
                });
        }
}

畫面預覽 :







以上就是建立文字檔案路徑並寫入文字字串與讀取文件應用的範例,大家可以試試看!
如有任何問題都可以和小黑人一起交流討論喔~謝謝大家~


☆小黑人☆


 
 

13 則留言:

  1. 可不可以直接在程式中直接定義txt的名稱?
    這樣只能從程式碼中定義儲存的txt名稱
    我想在使用app的過程中,自己直接打txt的檔案名

    回覆刪除
    回覆
    1. 您好,針對您的提問小黑人向您解釋,
      答案是可以的,如果需要自定義文字檔名的話,
      加入一個EditText元件就可以自行輸入文字,
      原範例步驟為:程式端直接指定Pubby.txt
      新加入EditText步驟為:讀取EditText元件文字後進行判斷檔案是否存在再進行寫入與讀取動作.
      感謝您的提問 ^^

      刪除
    2. 所以要先判斷這個路徑裡面是否有相同的檔案,這個地方我可以

      但是這行

      FileWriter mFileWriter = new FileWriter( mSDFile.getParent() + "/" + mSDFile.getName() + "/MyAndroid/Pubby.txt" );

      這個Pubby.txt我無法設定為自定義


      比如說我這樣寫

      Pubby.txt改成editText2.getText().toString().txt

      文件檔名就變成editText2.getText().toString().txt
      可是我希望editText2裡的文字變為檔名
      我理解力有點不行,希望老師可以說的更詳細
      謝謝~~~

      刪除
    3. 您好,很抱歉現在才回覆您的問題,
      根據您的疑問小黑人與您解釋,
      Pubby.txt不能直接這樣替換的檔名的,
      小黑人舉例給您看,原本程式碼是 :
      FileWriter mFileWriter = new FileWriter( mSDFile.getParent() + "/" + mSDFile.getName() + "/MyAndroid/Pubby.txt" );
      應更改成 :
      FileWriter mFileWriter = new FileWriter( mSDFile.getParent() + "/" + mSDFile.getName() + "/MyAndroid/" + editText2.getText().toString() +".txt" );
      這樣檔名才會是EditText所輸入的內容喔!

      很高興您的提問,如還有不懂的地方歡迎在跟小黑人討論,謝謝 ^^

      刪除
    4. 原來可以這樣寫?!
      謝謝老師的解答,我馬上試試看

      刪除
  2. 大大 我的小米三 可以用APP寫入和讀取 但是我用電腦去抓取手機內的東西 卻抓不到
    用小米的程式去找卻找的到 我想 可能是他的外部SD卡 我不能讀取
    請問大大有沒有內部的路徑寫法 就是手機本身的記憶體空間的路徑寫法

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      小米的SD卡空間使用權限應該是開放的,小黑人覺得應該不至於會鎖住找不到檔案,
      但不正常的是您說手機找的到而電腦卻找不到,您試試看把路徑更改成指定資料夾,
      看換個SD卡指定共用路徑是否會成功讀取,
      如果將路徑更改成手機記憶體空間路徑的話,電腦更不可能會讀取的到,所以可能還要再試試SD卡路徑的方法。

      感謝您的提問!

      刪除
    2. 大大 APP有沒有辦法 讓他一次把所有的文字都收進來阿
      我現在想要讀取文字檔 可是他字很多 換行也很多 就會讀得很慢
      能不能 弄成像一些閱讀小說的APP那樣 就是一打開 就都在裡面那樣

      刪除
    3. 至於SD卡的問題 那確實是小米三的問題 電腦沒辦法讀取SD卡

      刪除
  3. 不好意思 我想請問一下,如果要讀取資料夾內所有的.txt檔
    FileWriter mFileWriter = new FileWriter( mSDFile.getParent() + "/" + mSDFile.getName() + "/MyAndroid/Pubby.txt" );
    這部分要怎麼改寫呢

    回覆刪除
  4. 老師您好
    程式碼都正常但不知為什麼運行時打開文字檔時
    會沒辦法顯示內容@@ 可否求解?

    回覆刪除
  5. 老師你好

    請問有沒有辦法 讀寫 一個 電腦能 COPY 出來的檔案

    謝謝

    回覆刪除
  6. 您好,我想請問一下,如果這個程式碼要能順利執行,是不是SD卡上要先存在某個.txt文件才行?因為我直接照打的結果,第一部分寫入的程式跳進catch裡面了

    回覆刪除

謝謝大家支持,有任何問題都可以和小黑人一起討論!