多種數據存儲詳解(SharedPreferences、文件存儲、網絡存儲、數據庫、ContentProvider)獲取剩餘SD卡大小

一般數據存儲包含以下五種:SharedPreferences、File內部存儲、外部存儲、網絡存儲、數據庫

效果圖:

代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入"
        android:gravity="center"/>

    <Button
        android:id="@+id/sp_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="SharePreference"/>

    <Button
        android:id="@+id/file_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="File"/>

    <Button
        android:id="@+id/sql_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="SQLite" />

    <Button
        android:id="@+id/sd_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="SD Card"/>

    <Button
        android:id="@+id/internet_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="Internet"/>
</LinearLayout>
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private static final String SP_NAME = "app_test";
    private static final String SD_CARD_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator + "TEST" + File.separator;
    private static final int SP_DATA = 0;
    private static final int FILE_DATA = 1;
    private static final int SD_CARD_DATA = 2;

    private EditText editText;
    private Button btnSp;
    private Button btnFile;
    private Button btnSdCard;
    private Button btnSQlite;
    private Button btnInternet;
    private SharedPreferences.Editor editor;
    private SharedPreferences preferences;

    private final String fileName = "test.txt";
    private String saveContent;
    private String initType = "";
    private String saveType = "";


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

        initView();
        askPermission();        //權限
        initData(preferences.getInt("init_type", 0));
        setListener();
    }

    private void askPermission() {

    }

    private void initView() {
        editText = (EditText) findViewById(R.id.edit_text);
        btnSp = (Button) findViewById(R.id.sp_btn);
        btnFile = (Button) findViewById(R.id.file_btn);
        btnSdCard = (Button) findViewById(R.id.sd_btn);
        btnSQlite = (Button) findViewById(R.id.sql_btn);
        btnInternet = (Button) findViewById(R.id.internet_btn);
        preferences = getSharedPreferences(SP_NAME, MODE_PRIVATE);
    }

    private void setListener() {
        btnSp.setOnClickListener(this);
        btnFile.setOnClickListener(this);
        btnSdCard.setOnClickListener(this);
        btnInternet.setOnClickListener(this);
        btnSQlite.setOnClickListener(this);
    }

    private void initData(int type) {
        switch (type) {
            case SP_DATA:
                initSpData();
                break;
            case FILE_DATA:
                initFileData();
                break;
            case SD_CARD_DATA:
                initSdCard();
                break;
        }
        Toast.makeText(this, "初始化方式:" + initType, Toast.LENGTH_SHORT).show();
    }

    private void initSdCard() {
        File dir = new File(SD_CARD_PATH);
        String content = "";
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File fileName = new File("test.txt");
        try {
            FileInputStream fis = new FileInputStream(SD_CARD_PATH + File.separator + fileName);
            BufferedReader br = new BufferedReader(new InputStreamReader(fis));
            content = br.readLine();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        updateEditText(content);
        initType = "SdCard";
    }

    private void initFileData() {
        FileInputStream fis = null;
        BufferedReader br = null;
        StringBuilder content = new StringBuilder();
        try {
            fis = openFileInput(fileName);
            br = new BufferedReader(new InputStreamReader(fis));

            String line = "";
            while ((line = br.readLine()) != null) {
                content.append(line);
            }
            br.close();
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        updateEditText(content.toString());
        initType = "file";
        Log.i("TAG", "file save:" + content.toString());
    }

    private void initSpData() {
        preferences = getSharedPreferences(SP_NAME, MODE_PRIVATE);
        String s = preferences.getString("str", "");
        updateEditText(s);
        initType = "sharePreference";
    }

    private void updateEditText(String str) {
        if (!str.equals("")) {
            editText.setText(str);
            editText.setSelection(str.length());
        }
    }

    @Override
    public void onClick(View view) {
        saveContent = editText.getText().toString();
        switch (view.getId()) {
            case R.id.sp_btn:
                saveSp();
                break;
            case R.id.file_btn:
                saveFile();
                break;
            case R.id.sd_btn:
                saveSdCard();
                break;
            case R.id.sql_btn:
                Toast.makeText(this, "請參照LitePal", Toast.LENGTH_SHORT).show();
                break;
            case R.id.internet_btn:
                Toast.makeText(this, "請參照okttp3", Toast.LENGTH_SHORT).show();
                break;
        }
        Toast.makeText(this, "保存方式:"+saveType,Toast.LENGTH_SHORT).show();
    }

    private void saveSdCard() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            //可讀可寫
            File dir = new File(SD_CARD_PATH);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            File fileName = new File(dir, "test.txt");
            try {
                fileName.createNewFile();
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName));
                bos.write(saveContent.getBytes());
                bos.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            //可讀
        } else {
            //不可讀,不可寫
        }
        saveType = "saveSdCard";
    }

    private void saveFile() {
        try {
            FileOutputStream fos = openFileOutput(fileName,MODE_PRIVATE);
            fos.write(saveContent.getBytes());
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        saveType = "file";
    }

    private void saveSp() {
        editor = getSharedPreferences(SP_NAME, MODE_PRIVATE).edit();
        editor.putString("str", saveContent);
        editor.apply();
        saveType = "sharePreference";
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        editor = preferences.edit();
        if (saveType.equals("sharePreference")) {
            editor.putInt("init_type", 0);
        } else  if (saveType.equals("file")) {
            editor.putInt("init_type", 1);
        } else if (saveType.equals("saveSdCard")) {
            editor.putInt("init_type", 2);
        }
        editor.apply();
    }
}

Kotlin代碼如下: 

class MainActivity : AppCompatActivity(),View.OnClickListener {

    private val SP_NAME = "app_test"
    private val SD_CARD_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator + "TEST" + File.separator
    private val SP_DATA = 0
    private val FILE_DATA = 1
    private val SD_CARD_DATA = 2

    private val fileName = "test.txt"
    private var saveContent = ""
    private var initType = ""
    private var saveType = ""

    private var preferences: SharedPreferences? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        preferences = getSharedPreferences(SP_NAME, Context.MODE_PRIVATE)
        askPermission()         //權限
        initData(preferences!!.getInt("init_type", 0))
        setListener()
    }

    private fun askPermission(){

    }

    private fun setListener() {
        sp_btn.setOnClickListener(this)
        file_btn.setOnClickListener(this)
        sd_btn.setOnClickListener(this)
        internet_btn.setOnClickListener(this)
        sql_btn.setOnClickListener(this)
    }

    private fun initData(type: Int?) {
        when (type) {
            SP_DATA -> initSpData()
            FILE_DATA -> initFileData()
            SD_CARD_DATA -> initSdCard()
        }
        Toast.makeText(this, "初始化方式:$initType", Toast.LENGTH_SHORT).show()
    }

    private fun initSdCard() {
        val dir = File(SD_CARD_PATH)
        var content = ""
        if (!dir.exists()) {
            dir.mkdirs()
        }
        val fileName = File("test.txt")
        try {
            val fis = FileInputStream(SD_CARD_PATH + File.separator + fileName)
            val br = BufferedReader(InputStreamReader(fis))
            content = br.readLine()
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }

        updateEditText(content)
        initType = "SdCard"
    }

    private fun initFileData() {
        var fis: FileInputStream? = null
        var br: BufferedReader? = null
        val content = StringBuilder()
        try {
            fis = openFileInput(fileName)
            br = BufferedReader(InputStreamReader(fis))

            var line: String? = null
            while ({ line = br?.readLine();line}() != null) {
                content.append(line)
            }
            br.close()
            fis!!.close()
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }

        updateEditText(content.toString())
        initType = "file"
        Log.i("TAG", "file save:" + content.toString())
    }

    private fun initSpData() {
        val s = preferences?.getString("str", "")
        updateEditText(s)
        initType = "sharePreference"
    }

    private fun updateEditText(str: String?) {
        if (str != "") {
            edit_text.setText(str)
            edit_text.setSelection(str!!.length)
        }
    }

    override fun onClick(view: View) {
        saveContent = edit_text.getText().toString()
        when (view.id) {
            R.id.sp_btn -> saveSp()
            R.id.file_btn -> saveFile()
            R.id.sd_btn -> saveSdCard()
            R.id.sql_btn -> Toast.makeText(this, "請參照LitePal", Toast.LENGTH_SHORT).show()
            R.id.internet_btn -> Toast.makeText(this, "請參照okttp3", Toast.LENGTH_SHORT).show()
        }
        Toast.makeText(this, "保存方式:$saveType", Toast.LENGTH_SHORT).show()
    }

    private fun saveSdCard() {
        val state = Environment.getExternalStorageState()
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            //可讀可寫
            val dir = File(SD_CARD_PATH)
            if (!dir.exists()) {
                dir.mkdirs()
            }
            val fileName = File(dir, "test.txt")
            try {
                fileName.createNewFile()
                val bos = BufferedOutputStream(FileOutputStream(fileName))
                bos.write(saveContent?.toByteArray())
                bos.close()
            } catch (e: FileNotFoundException) {
                e.printStackTrace()
            } catch (e: IOException) {
                e.printStackTrace()
            }

        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            //可讀
        } else {
            //不可讀,不可寫
        }
        saveType = "saveSdCard"
    }

    private fun saveFile() {
        try {
            val fos = openFileOutput(fileName, Context.MODE_PRIVATE)
            fos.write(saveContent.toByteArray())
            fos.close()
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }

        saveType = "file"
    }

    private fun saveSp() {
        val editor = preferences!!.edit()
        editor.putString("str", saveContent)
        editor.apply()
        saveType = "sharePreference"
    }

    override fun onDestroy() {
        super.onDestroy()
        val editor = preferences!!.edit()
        if (saveType == "sharePreference") {
            editor.putInt("init_type", 0)
        } else if (saveType == "file") {
            editor.putInt("init_type", 1)
        } else if (saveType == "saveSdCard") {
            editor.putInt("init_type", 2)
        }
        editor.apply()
    }
}

獲取剩餘SD卡大小:下載大文件前用於判斷控件是否足夠

	/**
	 * 獲取剩餘SD卡大小:下載大文件前用於判斷控件是否足夠
	 * @return
	 */
	private String getRemainSdSize() {
		String path = Environment.getExternalStorageDirectory().getPath();
		StatFs stat = new StatFs(path);

		long blockSize;          //區塊大小
		long blockCount;        //區塊數量
		long availableBlocks;	 //剩餘區塊數量
		//
		//是否大於4.3
		if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
			blockSize = stat.getBlockSizeLong();        //區塊大小
			blockCount = stat.getBlockCountLong();        //區塊數量
			availableBlocks = stat.getAvailableBlocksLong();        //剩餘區塊數量
		} else {
			blockSize = stat.getBlockSize();
			blockCount = stat.getBlockCount();
			availableBlocks = stat.getAvailableBlocks();
		}
		return formatSize(availableBlocks * blockSize);	//剩餘內存大小
//		return formatSize(blockCount * blockSize);	//內存大小
	}

	private String formatSize(long size) {
		return Formatter.formatFileSize(this, size);
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章