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 :
<🎜. >2 .Méthodes de fonctionnement liées aux fichiers3. 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 :
<. 🎜 >
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 :
Nous 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 :
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 :
/**
* 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
, 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
: Exemple de code : Exécution du rendu : 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 : Cliquez sur la carte SD, mais il n'y a rien. Nous continuons à chercher le /storage. à la fin. Recherchez sous /emulated/legacy : D'accord, il a encore sauté vers un autre endroit, continuons à chercher /storage/shell/emilated/0 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 : 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: Écrivons ensuite une classe d'opération SD : SDFileHelper.java Puis MainActivity.java implémente la logique pertinente : Enfin, n'oubliez pas d'écrire les autorisations de lecture et écrivez la carte SD dans AndroidManifest.xml oh ! 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 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 : ②Venez à l'emplacement de l'image avd Sous le chemin, copiez le chemin de sdcard.img : Par exemple, le mien :-sdcard C:UsersAdministrator.androidavdJay4.2.avdsdcard.img ③ Cliquez ensuite pour accéder à l'interface suivante : Enfin, appliquez ce qui suit, puis exécutez ! 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 : Lire les ressources du fichier : res/raw : actifs : 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~<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>
/**
* 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();
}
}
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;
}
}
}
<!-- 在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
①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 avdLisez les fichiers dans les dossiers bruts et actifs
InputStream is =getResources().openRawResource(R.raw.filename);
AssetManager am = getAssets();
InputStream is = am.open("filename");
Téléchargement du code :
Résumé de cette section :