内部存储的读操作及使用API获得路径

这篇博客探讨了在Android应用中内部存储的读取操作。作者指出,按下back键后重新打开应用无法回显内容,而home键则可以,原因是activity的状态不同。为解决此问题,文章介绍了如何通过读取内部存储的txt文件来实现回显。博客详细展示了新增、全部和优化的读取代码,并强调了初始化全局变量和判断文件存在的必要性。此外,还讲解了如何使用API进行内部存储的读写操作,建议避免在缓存路径下存储重要文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内文件写操作博客中存在着一些问题,如下图所示,那就是在我们按下back键,再次打开时应用不进行回显,而按下home键时再次打开则可以回显,这是因为我们在按下back键后activity结束,再次打开时是重新创建了一个activity,而home键则是使activity进入后台运行而没有进入finish()状态,现在我们通过对内部txt文件的读取信息来使界面能够进行回显。
这里写图片描述

新增的读代码
 public void readAcount(){
         File file=new File("data/data/com.example.instorage/info.txt");
         FileInputStream fis;
        try {
            fis = new FileInputStream(file);
            //把字节流转换为字符流
             BufferedReader br=new BufferedReader(new InputStreamReader(fis));
             //读取txt中的用户名和密码
             String line=br.readLine();
             String[] s=line.split("##");
             //ctrl+1可以直接将局部变量设置为全局变量
             et_username.setText(s[0]);
             et_password.setText(s[1]);


        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
全部的读代码
package com.example.instorage;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.Checkable;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends Activity {
      private EditText et_username;
      private EditText et_password;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.instorage);
        readAcount();
    }
    public void readAcount(){
         File file=new File("data/data/com.example.instorage/info.txt");
         FileInputStream fis;
        try {
            fis = new FileInputStream(file);
            //把字节流转换为字符流
             BufferedReader br=new BufferedReader(new InputStreamReader(fis));
             //读取txt中的用户名和密码
             String line=br.readLine();
             String[] s=line.split("##");
             //ctrl+1可以直接将局部变量设置为全局变量
             et_username.setText(s[0]);
             et_password.setText(s[1]);


        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
   public void login (View v){
        et_username=(EditText) findViewById(R.id.et_username);
        et_password=(EditText) findViewById(R.id.et_password);
       String name=et_username.getText().toString();
       String password=et_password.getText().toString();       


       CheckBox cb=(CheckBox) findViewById(R.id.cb);
       //判断选框有没有被勾选,调用isChecked()
       if(cb.isChecked()){
           //这就是内部存储空间的路径
           //先进行部署,之后通过 Window-show View-other-File Explorer-data/data下找到相应包名的文件
              File file=new File("data/data/com.example.instorage/info.txt");
              FileOutputStream os;
            try {
                os = new FileOutputStream(file);
                String buffer=name+"##"+password;
                os.write(buffer.getBytes());
                os.close();//记得关闭文件               
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }             
           }
           Toast.makeText(MainActivity.this,"登陆成功",Toast.LENGTH_SHORT).show();

   }


}
优化代码

1、全局变量一般放在onCreate方法中赋初值
2、当第一次使用时,并不存在txt文件,此时读方法就会出现问题,因此需要判断文件是否存在。

public class MainActivity extends Activity {
      private EditText et_username;
      private EditText et_password;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.instorage);

        et_username=(EditText) findViewById(R.id.et_username);
        et_password=(EditText) findViewById(R.id.et_password);

        readAcount();

    }
    public void readAcount(){
         File file=new File("data/data/com.example.instorage/info.txt");
         if(file.exists()){
         FileInputStream fis;
        try {
            fis = new FileInputStream(file);
            //把字节流转换为字符流
             BufferedReader br=new BufferedReader(new InputStreamReader(fis));
             //读取txt中的用户名和密码
             String line=br.readLine();
             String[] s=line.split("##");
             //ctrl+1可以直接将局部变量设置为全局变量
             et_username.setText(s[0]);
             et_password.setText(s[1]);


        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

         } 
    }
   public void login (View v){

       String name=et_username.getText().toString();
       String password=et_password.getText().toString();       


       CheckBox cb=(CheckBox) findViewById(R.id.cb);
       //判断选框有没有被勾选,调用isChecked()
       if(cb.isChecked()){
           //这就是内部存储空间的路径
           //先进行部署,之后通过 Window-show View-other-File Explorer-data/data下找到相应包名的文件
              File file=new File("data/data/com.example.instorage/info.txt");
              FileOutputStream os;
            try {
                os = new FileOutputStream(file);
                String buffer=name+"##"+password;
                os.write(buffer.getBytes());
                os.close();//记得关闭文件               
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }             
           }
           Toast.makeText(MainActivity.this,"登陆成功",Toast.LENGTH_SHORT).show();

   }    
}

使用API在内部存储器中的读写

使用API在内部存储器中的读写仅需要修改一句话就可以了
1、将File file=new File("data/data/com.example.instorage/info.txt");
修改为

//获得的路径为data/data/com.example.instorage/files
  File file=new File(getFilesDir(),"info.txt");

2、获得缓存路径,该路径下的内容你不要企图让系统帮你删除,应该自己设定个值删除,比如1MB,因此一些重要的文件还是不要记录在这个文件下。

File file=new File(getCacheDir(),"info.txt");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值