第一个小应用:图片浏览器 之 三 学会使用内部存储

什么是内部存储

内部存储就是手机应用里面的数据,对其他应用来说是不可见的。

  • 往内部存储文件中写入数据:

openFileOutput(文件名,操作模式) 返回类型是 FileOutputStream 字节流
如果操作的是文本文件,还需要把字节流封装成字符流,需要注意字符编码方式
OutputStreamWriter osw = new OutputStreamWriter (字节流对象,编码方式)
osw.write() 写入数据

  • 读数据的方式对应的是:

FileInputStream fir = openFileInput(文件名);
InputStreamReader isr = new InputStreamReader(fir,”UTF-8”);
char[] buffer = new char[fir.available()]
isr.read(buffer) 把数据读到buffer 中

  • 刷新缓冲区

flush()

  • 关闭流对象

close() 后打开的先关闭

界面如下:
程序主界面
MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    //文件名称
    private String fileName = "test";
    private EditText etText;
    private TextView tvShow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        etText = (EditText) findViewById(R.id.etText);
        tvShow = (TextView) findViewById(R.id.tvShow);
        findViewById(R.id.btnWrite).setOnClickListener(this);
        findViewById(R.id.btnRead).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btnWrite:
                try {//文件输出流
                    FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE);
                    //把字节流封装成字符流,需要添加编码方式
                    OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
                    //调用osw中的write方法即可
                    osw.write(etText.getText().toString());
                    Toast.makeText(getApplicationContext(),"写入完毕",Toast.LENGTH_SHORT).show();
                    //刷新缓冲区,保证把所有内容添加到内部存储文件
                    osw.flush();
                    fos.flush();
                    //关闭流对象,后打开的先关闭
                    osw.close();
                    fos.close();
                    //把输入框文本清空
                    etText.setText("");

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.btnRead:
                //文件输入流
                try {
                    //openFileInput读取应用程序内部空间的文件内容
                    FileInputStream fis = openFileInput(fileName);
                    InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
// isr.read(char[] buffer)这个方法的意思是,把文件的内容读取到buffer的字符数组中,
// 为了让数组能存下所有数据,需要知道文件的大小,可以使用fis.available()获取文件的可用长度
                    char[] buffer = new char[fis.available()];
                    isr.read(buffer);
                    isr.close();
                    fis.close();
                    String read = new String(buffer);
                    tvShow.setText(read);
                    //或者使用下面的这个
//                    tvShow.setText(buffer,0,buffer.length);


                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                break;

        }

    }
}

主布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.wang.readandwriteinsidedata.MainActivity"
    android:weightSum="1">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入内容:"
        android:id="@+id/etText"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="往内部存储文件写入数据"
        android:id="@+id/btnWrite"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="读取内部存储文件数据"
        android:id="@+id/tvShow"
        android:layout_weight="0.60"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读取内部存储文件数据"
        android:id="@+id/btnRead"/>

</LinearLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值