小白开发程序之路(7-2)File

Android存储概念

分为内部存储和外部存储

内部存储

内部存储随应用卸载被删除
/data/data//shared_prefs
… /databases
… /files context.getFilesDir()
… /cache context.getCacheDir()

外部存储

外部存储分为公有目录和私有目录,其中私有目录也随应用卸载被删除

公有目录:Environment.getExternalStoragePublicDirectory(int type)
私有目录:/mnt/sdcard/Android/data/datad//cache
… /files

代码 FileActivity.java

package com.example.myapplication.datastorage;

import android.Manifest;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import com.example.myapplication.R;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;

public class FileActivity extends AppCompatActivity {
    private EditText mEtName;
    private TextView mTvContent;
    private Button mBtnSave,mBtnShow;
    private SharedPreferences mSharedPreferneces;
    private SharedPreferences.Editor mEditor;
    private final String  mFileName="test.txt";

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file);
        mEtName = findViewById(R.id.et_name);
        mBtnSave = findViewById(R.id.btn_save);
        mBtnShow = findViewById(R.id.btn_show);
        mTvContent = findViewById(R.id.tv_content);

        mBtnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                save(mEtName.getText().toString());
            }
        });

        mBtnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mTvContent.setText(read());
            }
        });

        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
        //请求权限

    }
    private void save(String content){
        FileOutputStream fileOutputStream=null;
        //存储
        try {
//            fileOutputStream=openFileOutput(mFileName,MODE_PRIVATE);
            //这里可以把MODE改成MODE_APPEND 就能不被覆盖
            File dir =new File(getExternalFilesDir(null),"test_external");
            //创建文件夹
            if(!dir.exists()){
                dir.mkdirs();
                // boolean mkdir() :  创建此抽象路径名指定的目录。
                // boolean mkdirs() :  创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
            }
            File file=new File(dir,mFileName);
            //创建文件
            if(!file.exists()){
                file.createNewFile();
            }
            fileOutputStream=new FileOutputStream(file);
            fileOutputStream.write(content.getBytes());

        }
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if (fileOutputStream != null) {
                //注意到close被标黄提示可能空指针异常,因为如果file Out Stream为空就会发生,所以先给一个判断
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    private String read(){
        FileInputStream fileInputStream=null;
        //读
        try {
//            fileInputStream=openFileInput(mFileName);
            File file=new File(getExternalFilesDir(null).getAbsolutePath()+File.separator+"test_external",mFileName);
            //File.separator就是斜杠
            fileInputStream=new FileInputStream(file);
            byte[]buff=new byte[1024];
            //每次读取1M的数据
            StringBuilder sb=new StringBuilder("");
            int len=0;
            while((len=fileInputStream.read(buff))>0){
                sb.append(new String(buff,0,len));
            }
            return sb.toString();
        }catch (IOException e) {
            e.printStackTrace();
        }
        if(fileInputStream != null){
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

内部存储

FileOutputStream
FileInputStream

代码 FileActivity.java

package com.example.myapplication.datastorage;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.myapplication.R;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileActivity extends AppCompatActivity {
    private EditText mEtName;
    private TextView mTvContent;
    private Button mBtnSave,mBtnShow;
    private SharedPreferences mSharedPreferneces;
    private SharedPreferences.Editor mEditor;
    private final String  mFileName="test.txt";

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file);
        mEtName = findViewById(R.id.et_name);
        mBtnSave = findViewById(R.id.btn_save);
        mBtnShow = findViewById(R.id.btn_show);
        mTvContent = findViewById(R.id.tv_content);

        mBtnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                save(mEtName.getText().toString());
            }
        });

        mBtnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mTvContent.setText(read());
            }
        });

    }
    private void save(String content){
        FileOutputStream fileOutputStream=null;
        //存储
        try {
            fileOutputStream=openFileOutput(mFileName,MODE_PRIVATE);
            //这里可以把MODE改成MODE_APPEND 就能不被覆盖
            fileOutputStream.write(content.getBytes());

        }
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if (fileOutputStream != null) {
                //注意到close被标黄提示可能空指针异常,因为如果file Out Stream为空就会发生,所以先给一个判断
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    private String read(){
        FileInputStream fileInputStream=null;
        //读
        try {
            fileInputStream=openFileInput(mFileName);
            byte[]buff=new byte[1024];
            //每次读取1M的数据
            StringBuilder sb=new StringBuilder("");
            int len=0;
            while((len=fileInputStream.read(buff))>0){
                sb.append(new String(buff,0,len));
            }
            return sb.toString();
        }catch (IOException e) {
            e.printStackTrace();
        }
        if(fileInputStream != null){
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值