一、實作效果
主要是IO和Sharedpreferences的資料持久化,對于后者xml更為方便易實作
對于傳統IO,不僅需要各種 抓例外,還要確定找出檔案存盤的位置,很費力
Sharedpreferences的存取大致實作了,傳統IO的還存在些問題,可能是虛擬機的問題,大致邏輯基本跑通了
效果圖






二、代碼
- 清單檔案
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="henu.soft.demo2_ioandsharedpreferences">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Demo2_IOAndSharedpreferences">
<!-- 清單宣告-->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Io頁面-->
<activity android:name=".MyIoActivity"/>
<!-- Sharedpreferences頁面-->
<activity android:name=".MySharedpreferenceActivity">
<intent-filter>
<action android:name="sp" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
- MainActivity.java
package henu.soft.demo2_ioandsharedpreferences;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 監聽按鈕
findViewById(R.id.btn_io).setOnClickListener(this);
findViewById(R.id.btn_sp).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_io:
// 顯示意圖啟動
Intent intent = new Intent(MainActivity.this,MyIoActivity.class);
startActivity(intent);
break;
case R.id.btn_sp:
// 隱式意圖 啟動
Intent intent1 = new Intent();
intent1.setAction("sp");
startActivity(intent1);
break;
}
}
}
- activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:background="@color/purple_200"
>
<Button
android:id="@+id/btn_io"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="IO內、外部檔案存盤"
android:textSize="20sp"
android:layout_gravity="center_horizontal"
/>
<Button
android:id="@+id/btn_sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="sharedpreferences檔案存盤"
android:textSize="20sp"
android:layout_gravity="center_horizontal"
/>
</LinearLayout>
- MyIoActivity.java
package henu.soft.demo2_ioandsharedpreferences;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class MyIoActivity extends AppCompatActivity implements View.OnClickListener {
String filename;
String content;
String myFilename = "";
String myContent = "";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_io);
// 監聽按鈕
findViewById(R.id.btn_saveInternal).setOnClickListener(this);
findViewById(R.id.btn_saveExternal).setOnClickListener(this);
findViewById(R.id.btn_getInternal).setOnClickListener(this);
findViewById(R.id.btn_getExternal).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
// 存
case R.id.btn_saveInternal:
EditText editText = findViewById(R.id.et_filename);
filename = editText.getText().toString()+".txt";
EditText editText1 = findViewById(R.id.et_content);
content = editText1.getText().toString();
System.out.println("debug===> "+ filename);
System.out.println("debug===> "+ content);
if(filename.isEmpty() || content.isEmpty()){
Toast.makeText(this, "資料名稱和內容不能為空!請重新輸入~by:xiaosi", Toast.LENGTH_LONG).show();
return;
}
try {
MyInternalSave(filename,content);
Toast.makeText(this, "內部存盤檔案存盤成功!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.btn_saveExternal:
if("".equals(filename) || "".equals(content)){
Toast.makeText(this, "資料名稱和內容不能為空!請重新輸入~by:xiaosi", Toast.LENGTH_LONG).show();
}
EditText editText2 = findViewById(R.id.et_filename);
filename = editText2.getText().toString()+".txt";
EditText editText3 = findViewById(R.id.et_content);
content = editText3.getText().toString();
try {
MyExternalSave(filename,content);
Toast.makeText(this, "外部存盤檔案獲取成功!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
break;
// 取
case R.id.btn_getInternal:
try {
MyInternalGet(filename);
TextView tv = findViewById(R.id.tv_showInternalContent);
tv.setText("檔案路徑:" + myFilename +" ,內容:" + myContent);
Toast.makeText(this, "內部存盤檔案獲取成功!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "內部存盤檔案獲取失敗!", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_getExternal:
try {
MyInternalGet(filename);
TextView tv = findViewById(R.id.tv_showExternalContent);
tv.setText("檔案路徑:" + myFilename +" ,內容:" + myContent);
Toast.makeText(this, "外部存盤檔案獲取成功!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "外部存盤檔案獲取失敗!", Toast.LENGTH_SHORT).show();
}
break;
}
}
/**
* 1. 封裝Internal方法
* @param filename
* @param content
* @throws IOException
*/
public void MyInternalSave(String filename,String content) throws IOException {
FileOutputStream fos = null;
try {
fos = openFileOutput(filename,MODE_PRIVATE);
fos.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
fos.close();
}
}
/**
* 2. 封裝External方法
* @param filename
* @param content
* @throws IOException
*/
public void MyExternalSave(String filename,String content) throws IOException {
File file = null;
// 獲取外部存盤的狀態
String state = Environment.getExternalStorageState();
if(state.equals(Environment.MEDIA_MOUNTED)){
File SDPath = Environment.getDownloadCacheDirectory();
file = new File(SDPath,filename);
}else{
Toast.makeText(this, "外部存盤不可用!", Toast.LENGTH_LONG).show();
return;
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
fos.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
fos.close();
}
}
/**
* 3. 封裝獲取Internal方法
* @param filename
* @throws IOException
*/
public void MyInternalGet(String filename) throws IOException {
FileInputStream fis = null;
try {
fis = openFileInput(filename);
byte[] buffers = new byte[fis.available()];
fis.read(buffers);
myFilename = filename;
myContent = new String(buffers);
} catch (IOException e) {
e.printStackTrace();
} finally {
fis.close();
}
}
/**
* 4. 封裝獲取Externale方法
* @param filename
* @throws IOException
*/
public void MyExternalGet(String filename) throws IOException {
// 獲取外部存盤的狀態
String state = Environment.getExternalStorageState();
File file = null;
if(state.equals(Environment.MEDIA_MOUNTED)){
File SDPath = Environment.getDownloadCacheDirectory();
file = new File(SDPath,filename);
}else{
Toast.makeText(this, "外部存盤不可用!", Toast.LENGTH_LONG).show();
return;
}
FileInputStream fis = null;
BufferedReader br = null;
try {
fis = new FileInputStream(file);
br = new BufferedReader(new InputStreamReader(fis));
myContent = br.readLine();
} catch (IOException e) {
e.printStackTrace();
} finally {
br.close();
fis.close();
}
}
}
- layout_io.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<!-- 第一行,檔案名稱-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="檔案名稱:"
android:textSize="20sp"
/>
<EditText
android:id="@+id/et_filename"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="請輸入存入的檔案名稱"/>
</LinearLayout>
<!-- 第二行,檔案內容-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="檔案名稱:"
android:textSize="20sp"
/>
<EditText
android:id="@+id/et_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="請輸入存入的內容"/>
</LinearLayout>
<!-- 第三行,存入按鈕-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_saveInternal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="存入internal檔案"
/>
<Button
android:id="@+id/btn_saveExternal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="存入external檔案"
/>
</LinearLayout>
<!-- 第四行,顯示Internal檔案內容-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Internal檔案內容:"
android:textSize="20sp"
/>
<TextView
android:id="@+id/tv_showInternalContent"
android:layout_width="0dp"
android:layout_height="50sp"
android:layout_weight="1"
android:textSize="20sp"
/>
</LinearLayout>
<!-- 第五行,顯示External檔案內容-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="External檔案內容:"
android:textSize="20sp"
/>
<TextView
android:id="@+id/tv_showExternalContent"
android:layout_width="0dp"
android:layout_height="50sp"
android:layout_weight="1"
android:textSize="20sp"
/>
</LinearLayout>
<!-- 第六行,取出按鈕-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_getInternal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="取出顯示internal檔案"
/>
<Button
android:id="@+id/btn_getExternal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="取出顯示external檔案"
/>
</LinearLayout>
</LinearLayout>
- MySharedpreferenceActivity.java
package henu.soft.demo2_ioandsharedpreferences;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
public class MySharedpreferenceActivity extends AppCompatActivity implements View.OnClickListener {
String content = "";
String myContent = "";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_sharedpreferences);
// 監聽按鈕
findViewById(R.id.btn_saveContent).setOnClickListener(this);
findViewById(R.id.btn_showContent).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
// 存
case R.id.btn_saveContent:
EditText editText = findViewById(R.id.et_input);
content = editText.getText().toString();
if ("".equals(content)) {
Toast.makeText(this, "資料內容不能為空!請重新輸入~by:xiaosi", Toast.LENGTH_LONG).show();
}
saveContent(content);
Toast.makeText(this, "資料存入成功!~by:xiaosi", Toast.LENGTH_LONG).show();
break;
// 取
case R.id.btn_showContent:
TextView tv = findViewById(R.id.tv_result);
showContent(content);
if(myContent.isEmpty()){
Toast.makeText(this, "獲取了個寂寞~請重新保存再獲取~by:xiaosi", Toast.LENGTH_LONG).show();
}
tv.setText(myContent);
Toast.makeText(this, "資料獲取成功!~by:xiaosi", Toast.LENGTH_LONG).show();
break;
}
}
/**
* 1. 存盤資料到SharedPreferences
* @param content
*/
public void saveContent(String content){
SharedPreferences sp = getSharedPreferences("data",MODE_PRIVATE);
// 獲取編輯器物件
SharedPreferences.Editor edit = sp.edit();
edit.putString(content,content);
edit.commit();
}
/**
* 1. 讀取SharedPreferences
* @param content
*/
public void showContent(String content){
SharedPreferences sp = getSharedPreferences("data",MODE_PRIVATE);
myContent = sp.getString(content, "");
}
}
- layout_sharedpreferences.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<!-- 第一行,存入-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/et_input"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:hint="請輸入要保存的內容"
/>
<Button
android:id="@+id/btn_saveContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="保存到SharedPreference"
/>
</LinearLayout>
<!-- 第二行,取出-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_result"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
/>
<Button
android:id="@+id/btn_showContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="從SharedPreference取出來"
/>
</LinearLayout>
</LinearLayout>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/272913.html
標籤:其他
下一篇:安卓開發1 微信頁面框架設計
