Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android簡單介紹SharedPreference,內部文件,sdcard數據存儲,

Android簡單介紹SharedPreference,內部文件,sdcard數據存儲,

編輯:關於android開發

Android簡單介紹SharedPreference,內部文件,sdcard數據存儲,


SharedPreference

  以xml的結構儲存簡單的數據,儲存在data/data/程序包名/shared_prefs文件夾中

  使用方式     

    創建對象的方式有三種

      Context 的 getSharedPreferences()

      Activity 的 getPreferences()

      PreferenceManager 的 getDefaultSharedpreferences()

    獲取數據

      sharedPrefs.getXXX()方法,如getInt(),getString()等

    儲存數據  獲取Editor對象 sharedPrefs.edit();

    存入數據  editor.putXXX()方法,如putInt()、putString()

    提交要保存的數據    editor.commit()

我們通過路徑找文件 看一下運行結果 路徑我在上面已經提到了  我使用的是Genymotion測試   

訪問手機內部存儲需要root權限才可以訪問

 

 

 

 

 

 

 

內部存儲

    將數據保存在內存空間中,數據用戶不能輕易訪問的區域,訪問需要root權限。存儲在/data/data/程序包名/files文件夾下

  使用方式

    其使用還是要通過FileInputStream和FileOutputStream對文件File進行操作,只不過不是通過他們的構造方法來創建。

  獲取FileInputStream

    FileInputStream fis = openFileInput();        (Activity的方法)

    FileOuputStream fos = openFileOutput();         (Activity的方法)

      文件File將會自動創建

 

外部SDCard存儲

在操作sd卡的時候需要在清單文件中添加權限

 

將數據保存到SDCard卡中,任何程序都可以訪問,用戶也很容易查看、修改。

  使用方式

    通過FileInputStream和FileOutputStream對文件File進行操作。

  SDCard操作類Environment      進行SDCard狀態獲取

    Environment.getExternalStorageState();    獲取擴展卡狀態

    Environment.MEDIA_MOUNTED    安裝的並可讀寫

    Environment.MEDIA_MOUNTED_READ_ONLY    安裝的但只讀

    Environment.MEDIA_REMOVED        移除的

  獲取常用文件夾路徑

    Environment.getExternalStorageDirectory();    獲取擴展卡根文件夾

 這個路徑在sd卡下自己寫  找不到 只能輕輕說聲加油~

 

貼一個小demo

運行效果

在edittext 輸入文本點擊寫入按鈕   點擊讀取顯示到textview      重要的事情說三遍   加權限~加權限~加權限~

 

activity_main.xml

  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.lesson15_data_storage.MainActivity">

    <CheckBox
        android:id="@+id/push"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="是否追加到原文件末尾"/>

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="顯示文本"/>
    <Button
        android:id="@+id/inner_storage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存文本到內部存儲中"
        android:onClick="onClick"/>
    <Button
        android:id="@+id/inner_read"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="讀取內部存儲的文本到TextView"
        android:onClick="onClick"/>

    <Button
        android:id="@+id/outter_read"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="讀取擴展卡的文本到textview"/>

    <Button
        android:id="@+id/outter_write"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="將文本寫入到擴展卡中"/>
</LinearLayout>

 

MainActivity

  

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private CheckBox cbPush;
    private TextView textView;
    private EditText edit;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        cbPush= (CheckBox) findViewById(R.id.push);
        textView= (TextView) findViewById(R.id.text_view);
        edit= (EditText) findViewById(R.id.edit);
        getSharedPreferences();


    }

    /**
     * 存儲一個CheckBox的選中狀態
     */
    private void getSharedPreferences() {

        //Context獲取  參數1文件名  參數2文件權限
        SharedPreferences preferences=getSharedPreferences("setting", Context.MODE_PRIVATE);
        //activity獲取  文件名是當前活動名
        SharedPreferences preferences1=getPreferences(MODE_PRIVATE);
        //獲取editor對象
        SharedPreferences.Editor editor1=preferences1.edit();
        //保存數據
        editor1.putString("text","通過activity對象獲取");
        //提交數據
        editor1.commit();
        //PreferenceManager獲取  文件名自動生成 訪問權限默認私有
        PreferenceManager.getDefaultSharedPreferences(MainActivity.this)
                .edit()
                .putString("text","通過PreferenceManager獲取")
                .commit();
        //參數1 key  參數2 默認值 基本數據類型要求不可以為空 所以必須有默認值
        boolean checked=preferences.getBoolean("cbPush",false);


        cbPush.setChecked(checked);
        cbPush.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                //通過context獲取 參數1 存儲的文件名  參數2 數據的訪問權限
                SharedPreferences sharedPreferences=getSharedPreferences("setting", Context.MODE_PRIVATE);
                //獲取編輯器對象
                SharedPreferences.Editor edit=sharedPreferences.edit();
                //存入數據
                edit.putBoolean("cbPush",isChecked);
                //提交修改
                edit.commit();
            }
        });
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.inner_storage:
                write();//寫入到內部文件
                Toast.makeText(MainActivity.this,"寫入成功",Toast.LENGTH_SHORT).show();
                break;
            case R.id.inner_read:
                read();//讀取內部文件
                Toast.makeText(MainActivity.this,"讀取成功",Toast.LENGTH_SHORT).show();
                break;
            case R.id.outter_read:
                oread();//讀取sdcard文件
                Toast.makeText(MainActivity.this,"讀取成功",Toast.LENGTH_SHORT).show();
                break;
            case R.id.outter_write:
                owrite();//寫入sdcard文件
                Toast.makeText(MainActivity.this,"寫入成功",Toast.LENGTH_SHORT).show();
                break;
        }
    }

    private void oread() {
        String state=Environment.getExternalStorageState();
        try {
            //判斷是否讀寫 或只讀
            if(state.equals(Environment.MEDIA_MOUNTED)||state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)){
                File sdcardRoot=Environment.getExternalStorageDirectory();
                File read=new File(sdcardRoot,"my/text.txt");
                if(read.exists()){
                    FileInputStream fis=new FileInputStream(read);
                    //字節轉字符會進行字節編碼的轉換  new InputStreamReader(fis,"utf-8") android默認utf-8
                    BufferedReader reader=new BufferedReader(new InputStreamReader(fis));
                    String str=reader.readLine();
                    textView.setText(str);
                    reader.close();
                    fis.close();
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void owrite() {
        try {
            //獲取擴展卡狀態
            String state= Environment.getExternalStorageState();
            //是否可讀寫
            if(state.equals(Environment.MEDIA_MOUNTED)){
                //獲取擴展卡文件夾目錄
                File sdcardRoot=Environment.getExternalStorageDirectory();
                File save=new File(sdcardRoot,"my/text.txt");
                //判斷文件是否存在
                if (save.exists()){

                }else{
                    //判斷父級文件夾是否存在
                    if(!save.getParentFile().exists()){
                        //創建文件夾
                        save.getParentFile().mkdirs();
                    }
                    //創建文件
                    save.createNewFile();
                }
                String text=edit.getText().toString();
                //文件是否在原文件末尾追加 cbPush.isChecked() checkbox 是否選中
                FileOutputStream fos=new FileOutputStream(save,cbPush.isChecked());
                fos.write(text.getBytes("utf-8"));
                fos.flush();
                fos.close();

//                //是否是文件夾
//                save.isDirectory();
//                //是否是文件
//                save.isFile();
//                //是否是隱藏文件  文件名以  .開頭的文件
//                save.isHidden();
//                //獲取所有子文件的文件名數組
//                save.list();
//                //獲取所有子文件的文件數組
//                save.listFiles();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void read() {
        try {
            //讀取寫入的文件
            FileInputStream fis=openFileInput("text.txt");
            int len=-1;
            byte [] b=new byte[1024];
            ByteArrayOutputStream bos=new ByteArrayOutputStream();
            while ((len=fis.read(b))!=-1){
                bos.write(b,0,len);
            }
            textView.setText(bos.toString("utf-8"));
            bos.close();
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void write() {
        try {
            //獲取輸入框內容
            String text=edit.getText().toString();
            //判斷是否為空
            if(TextUtils.isEmpty(text))return;
            //寫入方式  追加或覆蓋
            int mode=cbPush.isChecked()?MODE_APPEND:MODE_PRIVATE;
            //獲取FileOutputStream
            FileOutputStream fos=openFileOutput("text.txt",mode);
            //字符串轉換為byte 寫入文件
            fos.write(text.getBytes("utf-8"));
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved