什么是内部存储
内部存储就是手机应用里面的数据,对其他应用来说是不可见的。
- 往内部存储文件中写入数据:
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>