Java 基礎(十一)File 操做及自定義MySharedPreferences

File 概述

咱們先來看看 File 類的定義android

File :文件和目錄路徑名的抽象表示形式。算法

嗯~ File 能夠用來表示一個文件及其路徑等相關信息。
文件夾是一個特殊的文件。編程

好吧,不瞎扯了,你們都知道 File 是用來表示文件就好了,咱們來看看 API數組

方法名 方法描述
canExecute() 測試應用程序是否可執行此抽象路徑名錶示的文件
canRead() 測試應用程序是否可讀取此抽象路徑名錶示的文件
canWrite() 測試應用程序是否可修改此抽象路徑名錶示的文件
createNewFile() 當且僅當該文件不存在時,建立一個新的空文件
delete() 刪除此抽象路徑名錶示的文件或目錄
deleteOnExit() 在虛擬機終止時,請求刪除此抽象路徑名錶示的文件或目錄
exists() 測試此抽象路徑名錶示的文件或目錄是否存在
getAbsoluteFile() 返回此抽象路徑名的絕對路徑名形式
getAbsolutePath() 返回此抽象路徑名的絕對路徑名字符串
getCanonicalFile() 返回此抽象路徑名的規範形式
getCanonicalPath() 返回此抽象路徑名的規範路徑名字符串
getFreeSpace() 返回此抽象路徑名指定的分區中未分配的字節數
getName() 返回由此抽象路徑名錶示的文件或目錄的名稱
getParent() 返回此抽象路徑名父目錄的路徑名字符串;若是此路徑名沒有指定父目錄,則返回 null
getParentFile() 返回此抽象路徑名父目錄的抽象路徑名;若是此路徑名沒有指定父目錄,則返回 null
getPath() 將此抽象路徑名轉換爲一個路徑名字符串
getTotalSpace() 返回此抽象路徑名指定的分區大小
getUsableSpace() 返回此抽象路徑名指定的分區上可用於此虛擬機的字節數
isAbsolute() 測試此抽象路徑名是否爲絕對路徑名
isDirectory() 測試此抽象路徑名錶示的文件是不是一個目錄
isFile() 測試此抽象路徑名錶示的文件是不是一個標準文件
isHidden() 測試此抽象路徑名指定的文件是不是一個隱藏文件
lastModified() 返回此抽象路徑名錶示的文件最後一次被修改的時間
length() 返回由此抽象路徑名錶示的文件的長度
list() 返回一個字符串數組,這些字符串指定此抽象路徑名錶示的目錄中的文件和目錄
list(FilenameFilter filter) 返回一個字符串數組,這些字符串指定此抽象路徑名錶示的目錄中知足指定過濾器的文件和目錄
listFiles() 返回一個抽象路徑名數組,這些路徑名錶示此抽象路徑名錶示的目錄中的文件
listFiles(FilenameFilter filter) 返回抽象路徑名數組,這些路徑名錶示此抽象路徑名錶示的目錄中知足指定過濾器的文件和目錄
listRoots() 列出可用的文件系統根
mkdir() 建立此抽象路徑名指定的目錄
mkdirs() 建立此抽象路徑名指定的目錄,包括全部必需但不存在的父目錄
renameTo() 從新命名此抽象路徑名錶示的文件
setExecutable(boolean executable) 設置此抽象路徑名全部者執行權限的一個便捷方法
setLastModified(long time) 設置此抽象路徑名指定的文件或目錄的最後一次修改時間
setReadable(boolean readable) 設置此抽象路徑名全部者讀權限的一個便捷方法
setReadOnly() 標記此抽象路徑名指定的文件或目錄,從而只能對其進行讀操做
setWritable(boolean writable) 設置此抽象路徑名全部者寫權限的一個便捷方法
toURI() 構造一個表示此抽象路徑名的 file: URI
toURL() 過期方法,建議使用 file.toURI().toRUL()

File 練習:列出一個文件夾下全部文件名

需求,打印文件裏面的全部文件名
思考:文件夾裏面全部文件,判斷若是是文件就執行打印,若是是文件夾重複上面操做bash

剛剛咱們思考的這種解決問題思路能夠用「遞歸算法」來實現,咱們來簡單瞭解一下上面叫遞歸算法吧。併發

遞歸

程序調用自身的編程技巧稱爲遞歸( recursion)。遞歸作爲一種算法在程序設計語言中普遍應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它一般把一個大型複雜的問題層層轉化爲一個與原問題類似的規模較小的問題來求解,遞歸策略只需少許的程序就可描述出解題過程所須要的屢次重複計算,大大地減小了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。通常來講,遞歸須要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不知足時,遞歸前進;當邊界條件知足時,遞歸返回。函數

定義性能

遞歸,就是在運行的過程當中調用本身學習

構成遞歸需具有的條件測試

  • 子問題必須與原始問題爲一樣的事,且更爲簡單;
  • 不能無限制地調用自己,必須有個出口

遞歸算法通常用於解決如下三類問題:

  • 數據的定義是按遞歸定義的
  • 問題解法按遞歸算法實現
  • 數據的結構形式是按遞歸定義的(如鏈表、二叉樹、廣義表等)

遞歸的缺點:

遞歸算法解題相對經常使用的算法如普通循環等,運行效率較低。所以,應儘可能避免使用遞歸,除非沒有更好的算法或某種特定狀況,遞歸更爲合適的時候。在遞歸調用的過程中系統爲每一層的返回點、局部量等開闢了棧來存儲,遞歸次數過多容易形成棧溢出等。

遞歸的代碼實現

private static void showDir(File dir) {
    System.out.println("目錄:" + dir);
    File[] files = dir.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            showDir(file);
        } else {
            // 列出根目錄
            System.out.println("files" + file);
        }
    }
}複製代碼

Properties

額,這是一個我以前沒有接觸過的類,繼承自 HashTable,也就是說它具備 map 集合的特色,並且鍵值對都是字符串。

它有什麼特色?爲何忽然在這裏又講集合。。。。

咱們來看看 JDK 的描述~

Properties 類表示了一個持久的屬性集,Properties 可保存在流中或從流中加載.
由於 Properties 繼承於 Hashtable,因此可對 Properties 對象應用 put 和 putAll 方法。但不建議使用這兩個方法,由於它們容許調用者插入其鍵或值不是 String 的項。

咱們能夠從中讀取到幾個重要的信息。map 集合、字符串鍵值對、持久的屬性集。
好了,我就不賣關子了,這玩意能夠用來設置配置文件。

相似於 SharedPreferences,咱們能夠本身用Properties 來實現MySharedPreferences呀。

我這裏手擼了一個 MySharedPreference,沒有通過測試的,你們湊合着看一下,哈哈😀

public class MySharedPreferences {
    private static MySharedPreferences mInstance;
    private final String mPath;

    public static MySharedPreferences getInstance() {
        if (mInstance == null) {
            synchronized (MySharedPreferences.class) {
                if (mInstance == null) {
                    mInstance = new MySharedPreferences();
                }
            }
        }
        return mInstance;
    }

    private MySharedPreferences() {
        mPath = Environment.getExternalStorageDirectory().getPath() + "SP.txt";
        File file = new File(mPath);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void putValue(String key, String value) {
        try {
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(mPath, true));
            BufferedReader bufferedReader = new BufferedReader(new FileReader(mPath));
            Properties properties = new Properties();
            properties.load(bufferedReader);
            properties.setProperty(key, value);
            properties.store(bufferedWriter, "");
            bufferedWriter.flush();
            bufferedReader.close();
            bufferedWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public String getValue(String key) {
        try {
            BufferedReader bufferedReader = new BufferedReader(new FileReader(mPath));
            Properties properties = new Properties();
            properties.load(bufferedReader);

            bufferedReader.close();
            return properties.getProperty(key);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}複製代碼

反正就是醬紫玩的咯,有興趣的小夥伴能夠幫我測試一下 MySharedPreference,記得在 Manifest 文件裏面申請讀寫權限哦。我以爲是不須要申請權限的,懶得去測試了,小夥伴們能夠根據本身對 android 的理解,告訴我這需不須要權限。至於性能問題,讀寫 SP 應該是一件低頻率的事情,因此讀寫流在須要的時候建立,不須要的時候關閉。

IO 流及文件操做的學習就到這裏吧~~NIO 的併發類的操做等之後學併發的時候再一次性掃盲。

相關文章
相關標籤/搜索