Penyimpanan dan akses data - storan fail membaca dan menulis


Pengenalan kepada bahagian ini:

Hei, melihat tajuk ini, saya percaya sesetengah pembaca akan bertanya, adakah anda sudah selesai menulis serpihan sebelumnya? Nah, saya belum habis menulisnya kerana saya mahukan contoh dan keperluan Untuk meningkatkan kecekapan, saya memutuskan untuk menulis tutorial secara serentak seperti multi-threading Ini boleh mempercepatkan kemajuan menulis tutorial. Setakat ini, saya telah menulis tepat 60 artikel, dan saya masih jauh untuk menyiapkan tutorial pengenalan seperti yang saya katakan sebelum ini, saya ingin menyiapkannya dalam masa satu setengah hingga dua bulan. Set tutorial ini keluar hari ini pada 9.1, jadi teruskan kerja yang baik~ Okay, banyak perkara karut, bahagian ini akan memperkenalkan anda kepada storan data Android dan Salah satu kaedah akses - penyimpanan fail dan membaca dan menulis Sudah tentu, sebagai tambahan kepada kaedah ini, kita boleh menyimpan ke SharedPreference, pangkalan data,. Atau Aplikasi, sudah tentu ini akan dibincangkan kemudian, baik, mari kita mulakan bahagian ini~


1 mod operasi fail Android

Pelajar yang telah mempelajari Java. Seperti yang kita semua tahu, kita mencipta fail baharu dan kemudian kita boleh menulis data, tetapi Android adalah berbeza, kerana Android adalah Berdasarkan Linux, apabila kita membaca dan menulis fail, kita juga perlu menambah mod operasi fail Mod operasi dalam Android adalah seperti berikut:

1.png


<🎜. >2 .Kaedah operasi berkaitan fail

2.png

3. Pelaksanaan membaca dan menulis fail

Membaca dan menulis fail dalam Android dan fail I/in Java O adalah sama dan prosesnya sangat mudah Mari kita tulis contoh mudah di bawah:

Rendering pelaksanaan:

3.gif

PS:Simulator digunakan di sini, kerana N5 pengarang tidak mempunyai akar dan tidak dapat melihat direktori storan fail Seterusnya kami membuka DDMS Penjelajah Fail boleh melihat bahawa terdapat fail yang kami tulis dalam data/data/<nama pakej>/fail:

4.png

Kita boleh klik pada respons di sudut kanan atas Ikon untuk mengimport fail ke dalam komputer dan membukanya untuk mengesahkan kandungan bertulis:

5.jpg6.png

Pelaksanaan kod:

Pertama Ia ialah fail susun atur:

main_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.jay.example.filedemo1.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/nametitle" />

    <EditText
        android:id="@+id/editname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/detailtitle" />

    <EditText
        android:id="@+id/editdetail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minLines="2" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btnsave"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/btnwrite" />

        <Button
            android:id="@+id/btnclean"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/btnclean" />
    </LinearLayout>

    <Button
        android:id="@+id/btnread"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btnread" />

</LinearLayout>

Kemudian kami menulis kelas pembantu fail:

FileHelper.java

/**
 * Created by Jay on 2015/9/1 0001.
 */
public class FileHelper {

    private Context mContext;

    public FileHelper() {
    }

    public FileHelper(Context mContext) {
        super();
        this.mContext = mContext;
    }

    /*
    * 这里定义的是一个文件保存的方法,写入到文件中,所以是输出流
    * */
    public void save(String filename, String filecontent) throws Exception {
        //这里我们使用私有模式,创建出来的文件只能被本应用访问,还会覆盖原文件哦
        FileOutputStream output = mContext.openFileOutput(filename, Context.MODE_PRIVATE);
        output.write(filecontent.getBytes());  //将String字符串以字节流的形式写入到输出流中
        output.close();         //关闭输出流
    }


    /*
    * 这里定义的是文件读取的方法
    * */
    public String read(String filename) throws IOException {
        //打开文件输入流
        FileInputStream input = mContext.openFileInput(filename);
        byte[] temp = new byte[1024];
        StringBuilder sb = new StringBuilder("");
        int len = 0;
        //读取文件内容:
        while ((len = input.read(temp)) > 0) {
            sb.append(new String(temp, 0, len));
        }
        //关闭输入流
        input.close();
        return sb.toString();
    }

}

Akhir sekali

MainActivity.java, kami melengkapkan operasi yang berkaitan di sini:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText editname;
    private EditText editdetail;
    private Button btnsave;
    private Button btnclean;
    private Button btnread;
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = getApplicationContext();
        bindViews();
    }


    private void bindViews() {
        editdetail = (EditText) findViewById(R.id.editdetail);
        editname = (EditText) findViewById(R.id.editname);
        btnclean = (Button) findViewById(R.id.btnclean);
        btnsave = (Button) findViewById(R.id.btnsave);
        btnread = (Button) findViewById(R.id.btnread);

        btnclean.setOnClickListener(this);
        btnsave.setOnClickListener(this);
        btnread.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnclean:
                editdetail.setText("");
                editname.setText("");
                break;
            case R.id.btnsave:
                FileHelper fHelper = new FileHelper(mContext);
                String filename = editname.getText().toString();
                String filedetail = editdetail.getText().toString();
                try {
                    fHelper.save(filename, filedetail);
                    Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.btnread:
                String detail = "";
                FileHelper fHelper2 = new FileHelper(getApplicationContext());
                try {
                    String fname = editname.getText().toString();
                    detail = fHelper2.read(fname);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Toast.makeText(getApplicationContext(), detail, Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

4 Baca fail pada kad SD

Membaca carta alir :

7.png

Contoh kod:

Menjalankan rendering :

8.gif

Buka juga Penjelajah Fail DDMS Pada versi lama sistem, kita boleh menemuinya secara langsung pada mmtsdcard, tetapi dalam versi baharu Kita mungkin perlu mencarinya sendiri Mula-mula kita pergi ke laluan ini:

9.png

Klik pada sdcard, tetapi tiada apa-apa, jadi kami terus mencari /storage. di penghujungnya. Cari di bawah /emulated/legacy:

10.png

Okey, dia melompat ke tempat lain lagi, mari kita sambung mencari /storage/shell/emilated/0

11.png

Sudah tentu, kami menemui test.txt yang kami hasilkan dalam kad SD! Eksport ke komputer dan lihat kandungan di dalamnya:

12.png

Hehe, seperti yang dijangka, membaca dan menulis kad SD telah berjaya~ Seterusnya, mari kita lihat bagaimana kod ditulis:

Pelaksanaan kod:

main_activity.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.jay.example.filedemo2.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="清输入文件名" />

    <EditText
        android:id="@+id/edittitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="文件名" />


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="清输入文件内容" />

    <EditText
        android:id="@+id/editdetail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="文件内容" />

    <Button
        android:id="@+id/btnsave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="保存到SD卡" />

    <Button
        android:id="@+id/btnclean"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="清空" />

    <Button
        android:id="@+id/btnread"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读取sd卡中的文件" />

</LinearLayout>

Kemudian mari kita tulis kelas operasi SD : SDFileHelper.java

/**
 * Created by Jay on 2015/9/1 0001.
 */
public class SDFileHelper {

    private Context context;

    public SDFileHelper() {
    }

    public SDFileHelper(Context context) {
        super();
        this.context = context;
    }

    //往SD卡写入文件的方法
    public void savaFileToSD(String filename, String filecontent) throws Exception {
        //如果手机已插入sd卡,且app具有读写sd卡的权限
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
            //这里就不要用openFileOutput了,那个是往手机内存中写数据的
            FileOutputStream output = new FileOutputStream(filename);
            output.write(filecontent.getBytes());
            //将String字符串以字节流的形式写入到输出流中
            output.close();
            //关闭输出流
        } else Toast.makeText(context, "SD卡不存在或者不可读写", Toast.LENGTH_SHORT).show();
    }

    //读取SD卡中文件的方法
    //定义读取文件的方法:
    public String readFromSD(String filename) throws IOException {
        StringBuilder sb = new StringBuilder("");
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
            //打开文件输入流
            FileInputStream input = new FileInputStream(filename);
            byte[] temp = new byte[1024];

            int len = 0;
            //读取文件内容:
            while ((len = input.read(temp)) > 0) {
                sb.append(new String(temp, 0, len));
            }
            //关闭输入流
            input.close();
        }
        return sb.toString();
    }


}

Kemudian MainActivity.java melaksanakan logik yang berkaitan:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText editname;
    private EditText editdetail;
    private Button btnsave;
    private Button btnclean;
    private Button btnread;
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = getApplicationContext();
        bindViews();
    }

    private void bindViews() {
        editname = (EditText) findViewById(R.id.edittitle);
        editdetail = (EditText) findViewById(R.id.editdetail);
        btnsave = (Button) findViewById(R.id.btnsave);
        btnclean = (Button) findViewById(R.id.btnclean);
        btnread = (Button) findViewById(R.id.btnread);

        btnsave.setOnClickListener(this);
        btnclean.setOnClickListener(this);
        btnread.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btnclean:
                editdetail.setText("");
                editname.setText("");
                break;
            case R.id.btnsave:
                String filename = editname.getText().toString();
                String filedetail = editdetail.getText().toString();
                SDFileHelper sdHelper = new SDFileHelper(mContext);
                try
                {
                    sdHelper.savaFileToSD(filename, filedetail);
                    Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show();
                }
                catch(Exception e){
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.btnread:
                String detail = "";
                SDFileHelper sdHelper2 = new SDFileHelper(mContext);
                try
                {
                    String filename2 = editname.getText().toString();
                    detail = sdHelper2.readFromSD(filename2);
                }
                catch(IOException e){e.printStackTrace();}
                Toast.makeText(getApplicationContext(), detail, Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

Akhir sekali, jangan lupa untuk menulis kebenaran untuk baca dan tulis kad SD dalam AndroidManifest.xml oh!

<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

5 Berkenaan masalah kad SD simulator asli

Jika ia adalah penyahpepijatan mesin sebenar, ia biasanya boleh dilakukan, tetapi untuk mesin maya asli , ada banyak masalah , kami guna lebih awal Environment.getExternalStorageState().sama dengan(Environment.MEDIA_MOUNTED) mungkin Apa yang selalu mengembalikan palsu ialah kad SD tidak wujud Ini adalah masalah utama Kini versi baharu SDK akan masuk Apabila membuat AVD, kawasan storan kad SD akan digunakan pada masa yang sama

13.jpg

Untuk versi lama sdk atau sebab lain, anda mungkin perlu. untuk mengaitkan kad sd secara manual Tetapan adalah seperti berikut:
①Cari laluan ke imej avd yang dibuat:
Klik untuk membuka antara muka avd, klik butiran dan lihat direktori imej avd

14.jpg

②Datang ke lokasi imej avd Di bawah laluan, salin laluan sdcard.img:

15.jpg

Contohnya, saya :-sdcard C:UsersAdministrator.androidavdJay4.2.avdsdcard.img

③ Kemudian klik untuk pergi ke antara muka berikut:

16.jpg

Akhirnya gunakan perkara berikut, kemudian Jalankan!


6 Baca fail dalam folder mentah dan aset

Saya percaya semua orang sudah biasa dengan kedua-dua folder tersebut. Jika kita tidak mahu fail kita disusun menjadi fail binari, Kita boleh meletakkan fail dalam dua direktori ini, dan perbezaan antara keduanya adalah seperti berikut:

  • res/raw: Fail akan dipetakan ke fail R.java , akses boleh diakses terus melalui ID sumber, dan Ia tidak boleh mempunyai struktur direktori, iaitu, ia tidak boleh mencipta folder
  • aset: ia tidak akan dipetakan ke fail R.java dan boleh diakses melalui AssetManager struktur direktori, iaitu, Anda boleh mencipta folder anda sendiri

Baca sumber fail:

res/raw:

InputStream is =getResources().openRawResource(R.raw.filename);

aset:

AssetManager am =  getAssets();  
InputStream is = am.open("filename");

Muat turun kod:


Ringkasan bahagian ini:

Baiklah, ini ialah bahagian pertama tentang penyimpanan dan akses data Android - membaca dan menulis fail Jika anda sedang mengkaji artikel ini Jika anda menghadapi sebarang masalah atau merasakan terdapat beberapa kesilapan, anda dialu-alukan untuk membangkitkannya. Terima kasih~