移动应用开发四数据存储(Internal,External,Share Preferences,Xml,SQLite)

Internal存储

简介

1.Internal存储区是确保不被用户和其他app所访问的最佳存储区域。
2.app的内部存储区的目录在Android文件系统的指定目录下,由你的app的包名命名,通常为data/data/app_name/ 。
3.对于内部存储区的文件的读写,不需要向系统申请权限。

具体代码

即保存几个步骤创建流,打开文件,写入内容,关闭流

public class MainActivity extends AppCompatActivity {
   
    EditText edit1 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit1 = findViewById(R.id.edit_Inter_inputstr);
    }

    public void btnSaveClick(View view) {
   
        //要保存信息所在的文件名
        String filename = "myfile.txt";
        String savestr = edit1.getText().toString().trim();

        //开始准备保存信息
        FileOutputStream outputStream = null;
        try {
   
            //私有方式打开文件,不进行追加
            outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
            //写入文件信息,把String转化成二进制数组
            outputStream.write(savestr.getBytes());
            //关闭流
            outputStream.close();
            Toast.makeText(MainActivity.this, R.string.strsucc, Toast.LENGTH_LONG).show();//保存成功
        } catch (Exception e) {
   
            e.printStackTrace();
            Toast.makeText(MainActivity.this, R.string.strfail, Toast.LENGTH_LONG).show();//失败了
        }
    }

即读取几个步骤创建流,打开文件,将数据流读入到二进制数组中,关闭流,将数组转化为字符

 public void btnReadClick(View view) {
   
        FileInputStream inputStream = null;
        try {
   
            //打开文件
            inputStream = openFileInput("myfile.txt");
            //准备存放打开的文件,byte的长度是流可用的长度
            byte[] butter = new byte[inputStream.available()];
            //把流读入到数组里面
            inputStream.read(butter);
            //关闭流
            inputStream.close();
            //把数组转化成字符
            String str1 = new String(butter);
            edit1.setText(str1);
            Toast.makeText(MainActivity.this, R.string.strsuc, Toast.LENGTH_LONG).show();//读取成功了

        } catch (Exception e) {
   
            e.printStackTrace();
            Toast.makeText(MainActivity.this, R.string.strfail, Toast.LENGTH_LONG).show();//失败了
        }
    }
}

当然可以再建一个EditText,自己输入文件名,对应的代码改为:

String fileName = edit1.getText().toString().trim();
edit3.setText(getDir(edit1.getText().toString().trim(), MODE_PRIVATE).getAbsolutePath() + "&&" + str1);//多加一个获取路径

经过验证,内部存储在app重构时不会消失,可通过文件名反复读取,但当删除后重新安装,之前存储的文件就会消失,无法读取。

页面展示

1.既定文件名
在这里插入图片描述
2.自定义文件名加获取路径,且如图所示对应介绍第二条文件名的一般格式
如图所示对应介绍第三条文件名的一般格式

External存储

简介

1.不是总可用的,由于用户可以将USB存储mount 为external存储,在某些情况下会从设备中移除。
2.是world-readable的,因此存在这里的文件,它的读取不受你的控制。
3.当用户卸载你的app的时候,系统移除你app在通过getExternalFilesDir()方法取到的目录中的文件。

具体代码

首先需要在Mainfest中获取权限


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

存操作分三步:创建文件夹,创建文件,写入内容

public class BBActivity extends AppCompatActivity {
   
    EditText edit1, edit2, edit3 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bb);
        edit1 = findViewById(R.id.edit_Dir);
        edit2 = findViewById(R.id.edit_fliename);
        edit3 = findViewById(R.id.edit_flieCon);

    }

    /* 判断是否可读写 */
    public boolean isExternalStorageWritable() {
   
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
   
            return true;
        }
        return false;
    }

    //写一个方法在指定的文件目录下创建一个文件夹
    public File getExternalDir(String _Dirname) {
   
        File strdir = Environment.getExternalStoragePublicDirectory(_Dirname);
        if (!strdir.mkdir()) {
   
            Log.d("", "---创建失败---");
        }
        return strdir;
    }

    public void External_Save_Click(View v){
   
        //判断外部存储是否可用
        if (isExternalStorageWritable()){
   
            //在指定的位置创建文件夹,edit1.getText().toString().trim()即上面方法中的_Dirname
            File dirname=getExternalDir(edit1.getText().toString().trim());
            //判断文件夹是否创建成功
            if (dirname!=null){
   
                String fileName=edit2.getText().toString().trim();
                String fileCon=edit3.getText().toString().trim();
                File file=new File(dirname,fileName);         //⭐
                FileOutputStream outputStream=null;
                try {
   
                    //打开
                    outputStream=new FileOutputStream(file);      //⭐
                    outputStream.write(fileCon.getBytes());
                    outputStream.close();

                    Toast.makeText(BBActivity.this, R.string.strsucc, Toast.LENGTH_LONG).show();//保存成功
                }
                catch (Exception e){
   
                    e.printStackTrace();
                }
            }

        }
    }

读取操作,与内部存储相似

public void GetFromFile(View view) {
   
        //判断一下外部存储的可用性
        if (isExternalStorageWritable()) {
   
            //获取所在的文件夹位置
            File Dirname = getExternalDir(edit1.getText().toString().trim(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值