一般数据存储包含以下五种: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);
}