Stockage et accès aux données - lecture et écriture du stockage de fichiers


Introduction à cette section :

Hé, en voyant ce titre, je pense que certains lecteurs se demanderont : avez-vous fini d'écrire le fragment précédent ? Eh bien, je n'ai pas fini de l'écrire parce que je veux des exemples et j'ai besoin Afin d'améliorer l'efficacité, j'ai décidé d'écrire des tutoriels simultanément, comme en multithreading, cela peut accélérer la progression de l'écriture des tutoriels. Jusqu'à présent, j'ai écrit exactement 60 articles, et je suis encore loin d'avoir terminé le tutoriel d'introduction, comme je l'ai déjà dit, je souhaite le terminer d'ici un mois et demi à deux. Cet ensemble de didacticiels est disponible aujourd'hui sur la version 9.1, alors continuez votre bon travail ~ D'accord, tant de bêtises, cette section vous présentera le stockage de données Android et L'une des méthodes d'accès est le stockage de fichiers, la lecture et l'écriture. Bien entendu, en plus de cette méthode, nous pouvons enregistrer dans SharedPreference, base de données, Ou Application, bien sûr, ceux-ci seront discutés plus tard, eh bien, commençons cette section ~


1 Mode de fonctionnement des fichiers Android

Étudiants qui ont étudié Java. Comme nous le savons tous, nous créons un nouveau fichier et nous pouvons ensuite écrire des données, mais Android est différent car Android est Basé sur Linux, lorsque nous lisons et écrivons des fichiers, nous devons également ajouter le mode de fonctionnement des fichiers. Le mode de fonctionnement sous Android est le suivant :

1.png


<🎜. >2 .Méthodes de fonctionnement liées aux fichiers

2.png

3. Implémentation de la lecture et de l'écriture de fichiers

Lecture et écriture de fichiers dans Android et fichier I/in Java O est le même et le processus est très simple. Écrivons un exemple simple ci-dessous :

Rendu d'implémentation :

<. 🎜 >3.gif

PS :

Le simulateur est utilisé ici, car le N5 de l'auteur n'a pas de racine et ne peut pas voir le répertoire de stockage des fichiers. Ensuite, nous ouvrons DDMS. L'Explorateur de fichiers peut voir qu'il y a des fichiers que nous avons écrits dans data/data/<package name>/file :

4.pngNous pouvons cliquer sur la réponse dans le coin supérieur droit. pour importer le fichier dans l'ordinateur et l'ouvrir pour vérifier le contenu écrit :

5.jpg6.png

Implémentation du code :

Premier C'est le fichier de mise en page :

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>
Ensuite on écrit une classe d'assistance de fichier :

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();
    }

}
Enfin

MainActivity.java

, nous complétons les opérations pertinentes ici :

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. Lire le fichier sur la carte SD

Organigramme de lecture

 :

7.png

Exemple de code :

Exécution du rendu  :

8.gif

Ouvrez également l'Explorateur de fichiers de DDMS Sur l'ancienne version du système, on peut le trouver directement sur mmtsdcard, mais dans la nouvelle version. Nous devrons peut-être le rechercher nous-mêmes. Tout d'abord, nous allons sur ce chemin :

9.png

Cliquez sur la carte SD, mais il n'y a rien. Nous continuons à chercher le /storage. à la fin. Recherchez sous /emulated/legacy :

10.png

D'accord, il a encore sauté vers un autre endroit, continuons à chercher /storage/shell/emilated/0

11.png

Effectivement, nous avons trouvé le test.txt que nous avons généré dans la carte SD ! Exportez vers l'ordinateur et jetez un œil au contenu :

12.png

Héhé, comme prévu, la carte SD a été lue et écrite avec succès ~ Ensuite, regardons comment le le code est écrit :

Implémentation du code :

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>

Écrivons ensuite une classe d'opération 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();
    }


}

Puis MainActivity.java implémente la logique pertinente :

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;
        }
    }
}

Enfin, n'oubliez pas d'écrire les autorisations de lecture et écrivez la carte SD dans AndroidManifest.xml oh !

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

5. Concernant le problème de la carte SD du simulateur natif

S'il s'agit d'un débogage de machine réelle, c'est généralement possible, mais pour les machines virtuelles natives , il y a beaucoup de problèmes , nous l'avons utilisé plus tôt Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) possible Ce qui renvoie toujours faux, c'est que la carte SD n'existe pas. C'est le principal problème. Désormais, la nouvelle version du SDK sera disponible. Lors de la création d'un AVD, une zone de stockage d'une carte SD sera demandée en même temps

13.jpg

Pour les anciennes versions du SDK ou pour d'autres raisons, vous pourriez en avoir besoin. pour associer manuellement la carte SD. Les paramètres sont les suivants :
①Trouvez le chemin d'accès à l'image avd créée :
Cliquez pour ouvrir l'interface avd, cliquez sur détail et affichez le répertoire de l'image avd

14.jpg

②Venez à l'emplacement de l'image avd Sous le chemin, copiez le chemin de sdcard.img :

15.jpg

Par exemple, le mien :-sdcard C:UsersAdministrator.androidavdJay4.2.avdsdcard.img

③ Cliquez ensuite pour accéder à l'interface suivante :

16.jpg

Enfin, appliquez ce qui suit, puis exécutez !


Lisez les fichiers dans les dossiers bruts et actifs

Je pense que tout le monde connaît les deux dossiers. Si nous ne voulons pas que nos fichiers soient compilés en fichiers binaires, On peut mettre les fichiers dans ces deux répertoires, et la différence entre les deux est la suivante :

  • res/raw : Le fichier sera mappé sur le fichier R.java , l'accès est accessible directement via l'ID de ressource, et Il ne peut pas avoir de structure de répertoires, c'est-à-dire qu'il ne peut pas créer le dossier
  • assets : il ne sera pas mappé au fichier R.java et est accessible via AssetManager. une structure de répertoires, c'est-à-dire Vous pouvez créer votre propre dossier

Lire les ressources du fichier :

res/raw :

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

actifs :

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

Téléchargement du code :


Résumé de cette section :

D'accord, ceci est la première section sur le stockage et l'accès aux données Android - lecture et écriture de fichiers si vous étudiez cet article. Si vous rencontrez des problèmes ou pensez qu'il y a des erreurs, n'hésitez pas à les signaler. Je vous en suis très reconnaissant~

.