将文件保存在设备存储上分为内部存储(internal storage)和外部存储(external storage)
所有Android设备都有两个文件存储区:“内部”和“外部”存储。这些名称来自Android的早期,当时大多数设备提供内置的非易失性存储器(内部存储),以及可移动存储介质,如micro SD卡(外部存储)。现在,许多设备将永久存储空间划分为单独的“内部”和“外部”分区。因此,即使没有可移动存储介质,这两个存储空间也始终存在,无论外部存储是否可移动,API行为都是相同的。
由于外部存储可能是可移除的,因此这两个选项之间存在一些差异,如下所示。
内部存储器:
- 它始终可用。
- 此处保存的文件只能由您的应用访问。
- 当用户卸载您的应用程序时,系统会从内部存储中删除所有应用程序的文件。
如果您想确保用户和其他应用程序都无法访问您的文件,则最好使用内部存储。
外部存储:
- 它并不总是可用,因为用户可以将外部存储装载为USB存储器,并在某些情况下将其从设备中移除。
- 它是世界可读的,因此保存在此处的文件可能会在您的控件之外读取。
- 当用户卸载您的应用程序时,只有将应用程序的文件保存在目录中时,系统才会从此处删除应用程序的文件getExternalFilesDir()。
对于不需要访问限制的文件以及要与其他应用程序共享或允许用户使用计算机访问的文件,外部存储是最佳位置
引用Android developer document: https://developer.android.com/training/data-storage/files
内部存储(Internal Storage):
调用openFileOutput()来获取写入内部目录中文件的FileOutputStream。
实践:点击save file button将EditText里的内容保存,然后点击read file button读取文件,并将内容显示出来。
MainActivity.java
package com.example.jere.myapplication;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class MainActivity extends AppCompatActivity {
private static final String FILE_NAME = "FILE_NAME";
private EditText mEditText;
private Button mReadFileButton;
private Button mSaveFileButton;
private TextView mTextView;
private FileOutputStream mOutputStream;
private FileInputStream mInputStream;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewId();
//Write to file
mSaveFileButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
writeFile(mEditText.getText().toString());
}
});
//Read file content
mReadFileButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
readFile();
}
});
}
public void findViewId() {
mEditText = findViewById(R.id.input_content_edit_text);
mReadFileButton = findViewById(R.id.read_file_button);
mSaveFileButton = findViewById(R.id.save_file_button);
mTextView = findViewById(R.id.display_file_content);
}
public void writeFile(String editTextString) {
try {
mOutputStream = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
mOutputStream.write(editTextString.getBytes());
mOutputStream.close();
Toast.makeText(getBaseContext(),"file had saved", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
public void readFile() {
try {
mInputStream = openFileInput(FILE_NAME);
InputStreamReader inputRead= new InputStreamReader(mInputStream);
int content;
String temp="";
while( (content = inputRead.read()) != -1){
temp = temp + Character.toString((char)content);
}
mInputStream.close();
mTextView.setText(temp);
Toast.makeText(getBaseContext(),"read file",Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
tools:context=".MainActivity">
<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="@id/guideline"
android:orientation="vertical">
<EditText
android:id="@+id/input_content_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginLeft="10dp"
android:textColorHint="#4dFF0000"
android:hint="input your want"/>
<Button
android:id="@+id/save_file_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="save file"
android:textAllCaps="false"
android:layout_gravity="center"
android:layout_marginTop="50dp"
android:visibility="visible"
/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginBottom="260dp"
app:layout_constraintStart_toStartOf="@id/guideline"
app:layout_constraintBottom_toBottomOf="parent">
<Button
android:id="@+id/read_file_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="read file"
android:textAllCaps="false"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/display_file_content"
android:layout_width="wrap_content"
android:layout_height="37dp"
android:background="#4dFF0000"
android:layout_marginTop="50dp"
android:textSize="18dp"
android:layout_gravity="center"
android:gravity="center"
android:textColor="#000000"/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
效果图: