1.android系统架构:
- Linux内核层:为各种硬件提供底层驱动
- 系统运行层/C++系统框架层:提供主要特性支持,运行时库提供一些核心库
- 应用框架层/JAVA系统框架层:提供构建程序可能用到的API
- 应用层/android应用框架层:应用程序
Android数据存储——File存储
1.openFileOutput 和 openFileInput
FileInputStream openFileInput(String name)
FileOutputStream openFileOutput(String name,int mode)
程序打开的是应用程序的数据文件夹的文件,文件大小有限,毕竟手机内置的存储空间有限。
应用示例见下示例。
2.读写SD卡的文件
SD卡大大扩充了手机的存储能力。
使用步骤:
- 调用Environment的getExternalStorageState()方法判断手机是否插入了SD卡,并且应用程序具有读写SD卡的权限。
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
- 调用Environment的getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡目录。
- 使用FileInputStream、FileOuputStream、FileReader或FileWriter读写SD卡里的文件。
注:
- 手机已经插入SD卡
- 清单文件申请权限,如下:
应用示例:
<user-permission android:name="android.perssion.MOUNT_UNMOUNT_FILESYSTEMS"/>
<user-permission android:name="android.perssion.WRITE_EXTERNAL_STORSGE"/>
public class MainActivity extends AppCompatActivity {
final String FILE_NAME = "test.bin";
final String filename = "/test.bin";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//System.out.println(new StringBuilder("a").append("b").append("c").toString());
Button read = (Button) findViewById(R.id.button1);
Button write = (Button) findViewById(R.id.button2);
final EditText editText1 = (EditText) findViewById(R.id.editText1);
final EditText editText2 = (EditText) findViewById(R.id.editText2);
write.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
write(editText1.getText().toString());
editText1.setText("");
}
});
read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText2.setText(read());
}
});
}
private String read() {
/* try {
//打开文件输入流
FileInputStream fis = openFileInput(FILE_NAME);
byte[] buff = new byte[1024];
int hasRead = 0;
StringBuilder sb = new StringBuilder("");
//读取文件内容
while ((hasRead = fis.read(buff)) > 0) {
sb.append(new String(buff, 0, hasRead));
}
//关闭文件流
fis.close();
return sb.toString();
}*/
try {
//如果手机装入了SD卡,并且程序具有访问SD卡的权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Log.i("read", "read: " + Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED));
//获取SD卡对应得存储目录
File sdCardDir = Environment.getExternalStorageDirectory();
//获取指定文件对应的输入流
FileInputStream fis = new FileInputStream(sdCardDir.getCanonicalPath() + filename);
//将指定输入流包装成BufferendReader
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
StringBuilder sb = new StringBuilder("");
String line = null;
//循环读取文件
while ((line = br.readLine()) != null) {
sb.append(line);
}
//关闭资源
br.close();
Log.i("read", "read: "+sb.toString());
return sb.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private void write(String content) {
/* try {
//已追加方式打开文件输出流
FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);
//将FileOutputStream包装成PrintStream
PrintStream ps = new PrintStream(fos);
//输出文件内容
ps.println(content);
//关闭文件输出流
ps.close();
}*/
try {
//如果手机装入了SD卡,并且程序具有访问SD卡的权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Log.i("write", "write: " + Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED));
//获取SD卡的目录
File sdCardDir = Environment.getExternalStorageDirectory();
File targetFile = new File(sdCardDir.getCanonicalPath() + filename);
//以指定文件创建RandomAccessFile对象
RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");
//将文件记录指针移动到最后
raf.seek(targetFile.length());
//输出文件内容
raf.write(content.getBytes());
//关闭RandomAccessFile
raf.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}