day08 SP存储和SD卡存储

android五大存储

1.SharedPreferences
2.SD卡存储
3.SQLite数据库存储
4.ContentProvider存储
5.网络存储:云服务

一.SharedPreferences

保存少量的数据,且这些数据的格式非常简单。 存储5种原始数据类型: boolean, float, int, long, String
存储位置:/data/data/应用程序包名/shared_prefs/Xxx.xml文件,以Key-Value的格式存储
简单读写:

public class MainActivity extends AppCompatActivity {

    Button b1,b2,b3,b4,b5;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1 = findViewById(R.id.write);
        b2 = findViewById(R.id.read);
        b3 = findViewById(R.id.remove);
        b4 = findViewById(R.id.clear);
        b5 = findViewById(R.id.delete);
        //写入
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences wxp = getSharedPreferences("wxp", Context.MODE_PRIVATE);
                SharedPreferences.Editor edit = wxp.edit();
                edit.putString("userName","小明");
                edit.putString("password","123456");
                edit.putInt("age",19);
                edit.commit();
                Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
            }
        });
        //读
        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences wxp = getSharedPreferences("wxp", Context.MODE_PRIVATE);
                String userName = wxp.getString("userName", "");
                int age = wxp.getInt("age", 0);
                Toast.makeText(MainActivity.this,"userName:" +userName+"  age:"+age, Toast.LENGTH_SHORT).show();
            }
        });
        //删除字段
        b3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences wxp = getSharedPreferences("wxp", Context.MODE_PRIVATE);
                SharedPreferences.Editor edit = wxp.edit();
                edit.remove("userName");
                edit.commit();
                Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
            }
        });
        //清空
        b4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences wxp = getSharedPreferences("wxp", Context.MODE_PRIVATE);
                SharedPreferences.Editor edit = wxp.edit();
                edit.clear();
                edit.commit();
                Toast.makeText(MainActivity.this, "清空", Toast.LENGTH_SHORT).show();
            }
        });
        //删除该文件
        b5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File file = new File("/data/data/"+getPackageName().toString()+"/shared_prefs","wxp.xml");
                if (file.exists()){
                    file.delete();
                    Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

记住密码

public class MainActivity extends AppCompatActivity {

    EditText user,pwd;
    CheckBox remember_pwd;
    Button login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        user = findViewById(R.id.user);
        pwd = findViewById(R.id.pwd);
        remember_pwd = findViewById(R.id.remember_pwd);
        login = findViewById(R.id.login);
        File file = new File("/data/data/"+getPackageName()+"/shared_prefs","users.xml");
        if (file.exists()){
            SharedPreferences users = getSharedPreferences("users", Context.MODE_PRIVATE);
            //第一个参数键名,第二个参数未找到值时的默认值
            String userName = users.getString("userName", "");
            user.setText(userName);
            if(users.getBoolean("remember_pwd",false)){
                remember_pwd.setChecked(true);
                String password = users.getString("password", "");
                pwd.setText(password);
            }
        }

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String userName = user.getText().toString();
                String password = pwd.getText().toString();
                if(userName.isEmpty()||password.isEmpty()){
                    Toast.makeText(MainActivity.this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (remember_pwd.isChecked()){
                    SharedPreferences users = getSharedPreferences("users", Context.MODE_PRIVATE);
                    SharedPreferences.Editor edit = users.edit();
                    edit.putString("userName",userName);
                    edit.putString("password",password);
                    edit.putBoolean("remember_pwd",true);
                    edit.commit();
                }else{
                    SharedPreferences users = getSharedPreferences("users", Context.MODE_PRIVATE);
                    SharedPreferences.Editor edit = users.edit();
                    edit.putString("userName",userName);
                    edit.putString("password",password);
                    edit.putBoolean("remember_pwd",false);
                    edit.commit();
                }

            }
        });
    }
}

二.SD卡存储

存储位置:一般手机文件管理 根路径 /storage/emulated/0/或者/mnt/shell/emulated/0
简写:/sdcard/…
存储权限设置:版本V6以上需动态获取权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!-- 写的权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission><!-- 读的权限 -->
<uses-permission android:name="android.permission.INTERNET"></uses-permission><!-- 网络的权限 -->

动态获取权限:

public class SDActivity extends AppCompatActivity implements View.OnClickListener {
    Button bt_write,bt_read,bt_dowmload,bt_read_image;
    ImageView imageView;
    String video_url="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4";
    String img_url="https://goss.veer.com/creative/vcg/veer/800water/veer-141874146.jpg";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sd);
        bt_read=findViewById(R.id.bt_read);
        bt_write=findViewById(R.id.bt_write);
        bt_read.setOnClickListener(this);
        bt_write.setOnClickListener(this);
        bt_dowmload=findViewById(R.id.bt_dowmload);
        bt_read_image=findViewById(R.id.bt_read_image);
        bt_dowmload.setOnClickListener(this);
        bt_read_image.setOnClickListener(this);
        imageView=findViewById(R.id.image);
        //TODO 1:判断SDK的版本
        if(Build.VERSION.SDK_INT>=23){//安卓6.0以后的手机
            Toast.makeText(this, "android6.0", Toast.LENGTH_SHORT).show();
            //TODO 2:判断SD卡读写权限是否授予过
            int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
            if(permission== PackageManager.PERMISSION_DENIED){//没有授予
                //TODO 3:动态获取权限
                //参数一 :权限数组 参数二 请求码
                requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},101);
            }
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bt_read:
                try {
                    read();//读文件
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case  R.id.bt_write://写一句话到SD卡中
                try {
                    wirte();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.bt_dowmload://下载图片到SD卡中
                image_write();

                break;
            case  R.id.bt_read_image://从SD卡读取图片到ImageView
                image_read();

                break;
        }

    }

    private void image_read() {
        //BitmapFactory bitmap工厂  根据文件的路径---->Bitmap对象
        Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/DCIM/Camera/dacheng.jpg");
        imageView.setImageBitmap(bitmap);
    }

    //下载图片
    private void image_write() {
        new MyThread(img_url,"/sdcard/DCIM/Camera/dacheng.jpg").start();
        new MyThread(video_url,"/sdcard/DCIM/Camera/dacheng.mp4").start();
    }

    //读取数据
    private void read() throws IOException {
        //TODO 1:判断SD卡是否挂载
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//已经挂载
            StringBuffer stringBuffer=new StringBuffer();
            FileInputStream fileInputStream = new FileInputStream("/sdcard/Download/1704B.txt");
            byte[] bytes=new byte[1024];
            int len=0;
            while((len=fileInputStream.read(bytes))!=-1){
                stringBuffer.append(new String(bytes,0,len));
            }
            Toast.makeText(this, ""+stringBuffer.toString(), Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "请检查SD卡", Toast.LENGTH_SHORT).show();
        }

    }
    //写入数据
    private void wirte() throws IOException {
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            FileOutputStream fileOutputStream = new FileOutputStream("/sdcard/Download/1704B.txt");
            fileOutputStream.write("你好吗".getBytes());
            fileOutputStream.close();
        }else{
            Toast.makeText(this, "请检查SD卡", Toast.LENGTH_SHORT).show();
        }
    }
}

开启的下载线程:

public class MyThread extends Thread {
    String url;
    String filepath;//文件的路径

    public MyThread(String url, String filepath) {
        this.url = url;
        this.filepath = filepath;
    }

    @Override
    public void run() {
        super.run();
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            try {
                URL url = new URL(this.url);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                if(urlConnection.getResponseCode()==200){
                    InputStream inputStream = urlConnection.getInputStream();
                    FileOutputStream fileOutputStream = new FileOutputStream(filepath);
                    //边读边写
                    byte[] bytes=new byte[1024];
                    int len=0;
                    while ((len=inputStream.read(bytes))!=-1){
                        fileOutputStream.write(bytes,0,len);
                    }
                    fileOutputStream.close();
                    inputStream.close();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值