1. 程式人生 > >android 以追加形式寫檔案並把檔案儲存到SD卡中

android 以追加形式寫檔案並把檔案儲存到SD卡中

android手機記憶體本來就不大,要是老把資料放在手機裡,很明顯會讓手機的使用者體驗到什麼是“卡”,所以,我們把資料要放到SD卡中,以減少手機記憶體的使用,本文僅寫入檔案,不對讀檔案進行說明。好,go!

第一步:新建android專案,命名為Test

next -> next ..一切預設

第二步:在AndroidManifest.xml中新增許可權

往往是用到什麼再最後加許可權,既然現在的目的很明確,就直接將檔案建立刪除許可權以及SD卡的讀寫許可權一併新增上了

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

別忘了,這些許可權是加在<application>標籤對的外面

第三步:建立介面,預設已經生成了layout檔案 activity_main.xml 

現在要實現的功能只是以追加形式寫檔案並把檔案儲存到SD卡中,對介面沒什麼需求,介面不改了,預設顯示出hello world 吧

第四步:完善程式碼

核心功能來了,直接附上程式碼吧

MainActivity.JAVA

package com.example.test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.RandomAccessFile;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;

public class MainActivity extends Activity {
    FileOutputStream fos;
    FileInputStream fis;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String fileName = getSDPath() + "/" + "testYL.txt";
        method1(fileName, "I am the new content\n");
        method2(fileName, "I am the new content\n");
        method3(fileName, "I am the new content\n");
    }

    /**
     * 追加檔案:使用FileOutputStream,在構造FileOutputStream時,把第二個引數設為true
     * 
     * @param fileName
     * @param content
     */
    public static void method1(String file, String conent) {
        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(file, true)));
            out.write(conent);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 追加檔案:使用FileWriter
     * 
     * @param fileName
     * @param content
     */
    public static void method2(String fileName, String content) {
        try {
            // 開啟一個寫檔案器,建構函式中的第二個引數true表示以追加形式寫檔案
            FileWriter writer = new FileWriter(fileName, true);
            writer.write(content);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 追加檔案:使用RandomAccessFile
     * 
     * @param fileName
     *            檔名
     * @param content
     *            追加的內容
     */
    public static void method3(String fileName, String content) {
        try {
            // 開啟一個隨機訪問檔案流,按讀寫方式
            RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
            // 檔案長度,位元組數
            long fileLength = randomFile.length();
            // 將寫檔案指標移到檔案尾。
            randomFile.seek(fileLength);
            randomFile.writeBytes(content);
            randomFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String getSDPath() {
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED); // 判斷sd卡是否存在
        if (sdCardExist) {
            sdDir = Environment.getExternalStorageDirectory();// 獲取跟目錄
        }
        return sdDir.toString();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

經本人聯想630真機測試,完全通過。

至此,要對以上程式碼做一些說明

  1.RandomAccessFile是用來訪問那些儲存資料記錄的檔案的,這樣你就可以用seek( )方法來訪問記錄,並進行讀寫了。這些記錄的大小不必相同;但是其大小和位置必須是可知的。

  2.細心的朋友會發現,中文存入之後會出現亂碼,亂碼的問題就不在這進行解決了,先寫到這吧