1. 程式人生 > >【android 檔案的基本操作】

【android 檔案的基本操作】

在此總結一下檔案的基本操作。

先把一些常用的方法,封裝一下,我這些都放到 FileUtils.java 類中:

   /**
     * sd卡是否可用
     *
     * @return
     */
    public static boolean isSdCardAvailable() {
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    }


   /**
     * 建立根快取目錄
     *
     * @return
     */
public static String createRootPath() { if (isSdCardAvailable()) { // /sdcard/Android/data/<application package>/cache cacheRootPath = MyApplication.mContext.getExternalCacheDir().getPath(); } else { // /data/data/<application package>/cache cacheRootPath = MyApplication.mContext.getCacheDir().getPath(); } return
cacheRootPath; } /** * 建立資料夾 * * @param dirPath * @return 建立失敗返回"" */ public static String createDir(String dirPath) { try { File dir = new File(dirPath); if (!dir.exists()) { dir.mkdirs(); } return
dir.getAbsolutePath(); } catch (Exception e) { e.printStackTrace(); } return dirPath; } /** * 建立檔案 * 檔案路徑為根路徑:/storage/emulated/0/Android/data/<application package>/cache */ public static boolean createFile(Context context, String uniqueName) { File file = getDiskCacheDir(context, uniqueName); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); return false; } return true; } /** * 往檔案中儲存內容,根據檔案路徑,這個方法更嚴謹一些 * * @param content * @param filePath * @return */ public static boolean saveStringToFile(String content, String filePath) { if (content == null || TextUtils.isEmpty(filePath)) { return false; } else { File file = new File(filePath); PrintWriter pw = null; try { if (!file.exists()) { file.createNewFile(); } if (file.exists()) { pw = new PrintWriter(file); // pw = new PrintWriter(new BufferedWriter( // new FileWriter(file))); pw.write(content); return true; } else { return false; } } catch (Exception e) { return false; } finally { if (pw != null) { pw.close(); } } } } /** * 讀取檔案中的內容,根據檔案路徑 * * @param filePath * @return */ @SuppressWarnings("resource") public static String readStringFromFile(String filePath) { if (TextUtils.isEmpty(filePath)) { return null; } File file = new File(filePath); if (file.exists()) { try { StringBuffer strBuffer = new StringBuffer(); BufferedReader reader = new BufferedReader(new FileReader(file)); String strLine = ""; while ((strLine = reader.readLine()) != null) { strBuffer.append(strLine); } return strBuffer.toString(); } catch (Exception e) { return null; } } else { return null; } } /** * 根據傳進的 file 刪除檔案或者資料夾 * * @param file */ public static void deleteFileOrDirectory(File file) { try { if (file.isFile()) { file.delete(); return; } if (file.isDirectory()) { File[] childFiles = file.listFiles(); // 刪除空資料夾 if (childFiles == null || childFiles.length == 0) { file.delete(); return; } // 遞迴刪除資料夾下的子檔案 for (int i = 0; i < childFiles.length; i++) { deleteFileOrDirectory(childFiles[i]); } file.delete(); } } catch (Exception e) { e.printStackTrace(); } } /** * 根據傳進的 filePath 刪除檔案或者資料夾 * * @param filePath * @return boolean */ public static boolean deleteFileOrDirectory(String filePath) { if (TextUtils.isEmpty(filePath)) { return false; } else { try { File file = new File(filePath); if (file.isFile()) { file.delete(); return true; } if (file.isDirectory()) { File[] childFiles = file.listFiles(); // 刪除空資料夾 if (childFiles == null || childFiles.length == 0) { file.delete(); return true; } // 遞迴刪除資料夾下的子檔案 for (int i = 0; i < childFiles.length; i++) { deleteFileOrDirectory(childFiles[i]); } file.delete(); } } catch (Exception e) { e.printStackTrace(); } } return false; } /** * 將內容寫入檔案 * * @param filePath eg:/mnt/sdcard/demo.txt * @param content 內容 */ public static void writeFileSdcard(String filePath, String content, boolean isAppend) { try { FileOutputStream fout = new FileOutputStream(filePath, isAppend); byte[] bytes = content.getBytes(); fout.write(bytes); fout.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 根據傳入的檔名字,在根快取目錄下建立檔案,並返回該檔案物件 * * @param context * @param uniqueName * @return */ public static File getDiskCacheDir(Context context, String uniqueName) { final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ? getExternalCacheDir(context).getPath() : context.getCacheDir().getPath(); return new File(cachePath + File.separator + uniqueName); } public static File getExternalCacheDir(Context context) { final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/"; return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir); } /** * 獲取圖片快取目錄 * * @return 建立失敗, 返回"" */ public static String getImageCachePath() { String path = createDir(createRootPath() + File.separator + "img" + File.separator); return path; } /** * 獲取圖片裁剪快取目錄 * * @return 建立失敗, 返回"" */ public static String getImageCropCachePath() { String path = createDir(createRootPath() + File.separator + "imgCrop" + File.separator); return path; }

有個這個工具類,就可以對檔案做一些基本的操作了!
在應用根快取目錄下或者在某某目錄下實現如下操作:建立一個資料夾 ——>資料夾中建立一個檔案 ——> 往檔案中寫入內容 ——> 讀取內容 ——> 刪除該檔案 ——> 刪除該資料夾 。

(1)建立一個資料夾

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivityfile";

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


        /**
         * 建立 log 資料夾
         */
        String folderPath = FileUtils.createDir("data/data/" + getPackageName() + "/log");
        Log.i(TAG, "onCreate: folderPath=" + folderPath);


    }
}

adb檢視如下:
這裡寫圖片描述

(2)資料夾中建立一個檔案

       /**
         * 建立 info 檔案,在 log 資料夾中
         */
        File file = new File(folderPath, "/info");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

adb檢視如下:
這裡寫圖片描述

(3) 往檔案中寫入內容

       /**
         *   往檔案中寫入內容
         */
        boolean saveResult = FileUtils.saveStringToFile("我是來記錄info級別的日誌", folderPath + "/info");
        Log.i(TAG, "onCreate: saveResult=" + saveResult);

adb命令 pull 下來如下:
這裡寫圖片描述
這裡寫圖片描述

(4) 讀取檔案內容

       /**
         *  讀取內容
         */
        String fileContext = FileUtils.readStringFromFile(folderPath + "/info");
        Log.i(TAG, "onCreate: fileContext=" + fileContext);

日誌列印:
這裡寫圖片描述

(5)刪除該檔案

       /**
         *  刪除該檔案
         */
        //FileUtils.deleteFileOrDirectory(file);
        boolean deleteResult = FileUtils.deleteFileOrDirectory(folderPath + "/info");
        Log.i(TAG, "onCreate: deleteResult=" + deleteResult);

日誌列印:
這裡寫圖片描述

adb檢視發現:log 資料夾下已經沒有 info 檔案了:
這裡寫圖片描述

(6) 刪除該資料夾

       /**
         * 刪除該資料夾
         */
        boolean deleteDirectoryResult = FileUtils.deleteFileOrDirectory(folderPath);
        Log.i(TAG, "onCreate: deleteDirectoryResult=" + deleteDirectoryResult);

日誌列印:
這裡寫圖片描述

adb檢視,log 資料夾已經沒有了:
這裡寫圖片描述

總結:到這裡對檔案的基本操作,基本完成了。下面,希望我繼續擠出時間,去總結對 檔案 的上傳,下載的運用。

注意:原始碼中看app2這個module