Android内部存储--InternalStorage
特点:1,内部存储总是有效的,只要内存未满就可以存储进去
2,默认情况下 只能被本应用程序读写
3,当删除当前应用程序时,内部存储数据也会跟着删除,因为内部存储数据保存在应用程序包名下
步骤:
存数据:输出流
读数据:输入流
区分:包名和保存数据的文本的名称
实例
布局文件
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入内容"/>
<!-- 显示读取后的数据 -->
<TextView
android:id="@+id/tv"
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/et"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/button1"
android:layout_alignRight="@+id/tv"
android:layout_marginRight="51dp"
android:text="读出数据"
android:onClick="onClick"/>
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button3"
android:layout_alignBottom="@+id/button3"
android:layout_toRightOf="@+id/button1"
android:onClick="onClick"
android:text="读出数据2" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/button1"
android:layout_below="@+id/button1"
android:onClick="onClick"
android:text="写入数据2" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv"
android:layout_marginRight="14dp"
android:layout_marginTop="20dp"
android:layout_toLeftOf="@+id/button2"
android:onClick="onClick"
android:text="写入数据" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/button3"
android:layout_below="@+id/button3"
android:onClick="onClick"
android:text="写入数据3" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button5"
android:layout_alignBottom="@+id/button5"
android:layout_alignLeft="@+id/button4"
android:onClick="onClick"
android:text="读出数据3" />
<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button1"
android:layout_alignRight="@+id/button6"
android:layout_below="@+id/button5"
android:onClick="onClick"
android:text="删除数据" />
</RelativeLayout>
逻辑代码
package com.example.week3_day3_internalstorage;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
// 内部存储,不用加权限
private EditText et;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et);
tv = (TextView) findViewById(R.id.tv);
}
// 点击按钮时的事件
public void onClick(View v) {
switch (v.getId()) {
// 写入数据
case R.id.button1:
OutputStream outputStream = null;
try {
// 输出流
// name:文件名
// mode:模式
outputStream = openFileOutput("info.txt", MODE_PRIVATE);
// 写入到流中
outputStream.write(et.getText().toString().trim().getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
break;
// 读出数据
case R.id.button2:
BufferedReader br = null;
StringBuffer stringBuffer = new StringBuffer();
try {
InputStream inputStream = openFileInput("info.txt");
br = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while ((line = br.readLine()) != null) {
// 每次读入一行时就添加到stringBuffer
stringBuffer.append(line);
}
// 显示到界面上
tv.setText(stringBuffer.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
break;
/**
* 文件流读写数据
*/
case R.id.button3:// 写入数据2
FileOutputStream fileOutputStream = null;
// getFilesDir():得到存储路径
File file = new File(getFilesDir(), "test.txt");
try {
// 缺少文件,新建一个
fileOutputStream = new FileOutputStream(file);// 创建文件流
fileOutputStream.write(et.getText().toString().trim()// 把数据写入到文件输出流
.getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();// 关闭流
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
break;
case R.id.button4:// 读出数据2
File file1 = new File(getFilesDir(), "test.txt");
ByteArrayOutputStream outputStream2 = null;
try {
FileInputStream fileInputStream = new FileInputStream(file1);// 创建文件输入流,缺少文件,新建一个文件
outputStream2 = new ByteArrayOutputStream();// 创建文件输出流,存放读出的数据
byte[] buffer = new byte[1024];// 每次读1024字节
int temp = 0;// 文件的长度
while ((temp = fileInputStream.read(buffer)) != -1) {
outputStream2.write(buffer, 0, temp);// 写数据到输出流
outputStream2.flush();// 刷新流
}
tv.setText(outputStream2.toString().trim());// 将数据显示到界面上
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream2 != null) {
try {
outputStream2.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
case R.id.button5:
FileOutputStream fileOutputStream2 = null;
try {
// 参数1:文件的名称,参数2:文件的后缀名,参数3:文件的保存路径
File file2 = File.createTempFile("temp", null, getCacheDir());
// 创建文件输出流,缺少文件,新建一个文件
fileOutputStream2 = new FileOutputStream(file2);
fileOutputStream2.write(et.getText().toString().trim()
.getBytes());// 写数据到内存
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileOutputStream2 != null) {
try {
fileOutputStream2.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
break;
case R.id.button6:
// 文件名是随机的
File file2 = new File(getCacheDir(), "");
StringBuffer stringBuffer2 = new StringBuffer();
BufferedReader bufferedReader = null;
try {
// 文件输入流,缺少文件,新建一个文件
FileInputStream fileInputStream = new FileInputStream(file2);
// 读数据
bufferedReader = new BufferedReader(new InputStreamReader(
fileInputStream));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
stringBuffer2.append(line);// 将数据添加到缓冲流中
}
tv.setText(stringBuffer2.toString().trim());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
break;
case R.id.button7:
// 删除数据
Boolean b = deleteFile("info.txt");
if (b) {
Toast.makeText(MainActivity.this, "删除成功", 0).show();
} else {
Toast.makeText(MainActivity.this, "删除失败", 0).show();
}
break;
default:
break;
}
}
}