Android开发笔记之Android中数据的存储方式(一)


当前第2页 返回上一页

•java代码:

package com.bokeyuan.rwinsd;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import com.bokeyuan.rwinsd.R;
import android.os.Bundle;
import android.os.Environment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_name;
private EditText et_pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = (EditText) findViewById(R.id.et_name);
et_pass = (EditText) findViewById(R.id.et_pass);
readAccount();
}
public void login(View v){
String name = et_name.getText().toString();
String pass = et_pass.getText().toString();
CheckBox cb = (CheckBox) findViewById(R.id.cb);
if(cb.isChecked()){
//检测sd卡当前是否可用
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
// File file = new File("sdcard/info.txt");
//返回一个file对象,包含的路径就是sd卡的真实路径
File file = new File(Environment.getExternalStorageDirectory(), "info.txt");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write((name + "##" + pass).getBytes());
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
Toast.makeText(this, "sd卡不可用哟亲", 0).show();
}
}
//弹出提示框,提示用户登录成功
Toast.makeText(this, "登陆成功", 0).show();
}
public void readAccount(){
// File file = new File("sdcard/info.txt");
File file = new File(Environment.getExternalStorageDirectory(), "info.txt");
if(file.exists()){
try {
FileInputStream fis = new FileInputStream(file);
//把字节流转换成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String text = br.readLine();
String[] s = text.split("##");
et_name.setText(s[0]);
et_pass.setText(s[1]);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} 

注:

•//此api会把文件写到data/data/com.itheima.permission/files/文件夹下
•FileOutputStream fos = openFileOutput("info1.txt", MODE_PRIVATE) ;
•//此api会把文件读到data/data/com.itheima.permission/files/文件夹下
•FileOutputStream fos = openFileOutput("info1.txt", MODE_PRIVATE) ;

•所以,以后用Android 自带的API。可以看下面openFileOutput四种模式的小例子:

•openFileOutput的四种模式

•MODE_PRIVATE = 0:       -rw-rw----
•MODE_APPEND = 32768:    -rw-rw----
•MODEWORLDREADABLE = 1: -rw-rw-r--
•MODEWORLDWRITEABLE = 2: -rw-rw--w-

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Context.MODE_APPEND。

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

• 注:

•在Android中,每一个应用是一个独立的用户
•drwxrwxrwx
•第1位:d表示文件夹,-表示文件
•第2-4位:rwx,表示这个文件的拥有者用户(owner)对该文件的权限 •r:读
•w:写
•x:执行
•第5-7位:rwx,表示跟文件拥有者用户同组的用户(grouper)对该文件的权限
•第8-10位:rwx,表示其他用户组的用户(other)对该文件的权限

•布局文件:

<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: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" 
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建文件1" 
android:onClick="click1"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建文件2" 
android:onClick="click2"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建文件3" 
android:onClick="click3"
/>
</LinearLayout> 

•代码:

package com.bokeyuan.permission;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
@SuppressLint("WorldReadableFiles")
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click1(View v){
//此api会把文件写到data/data/com.bokeyuan.permission/files/文件夹下
try {
FileOutputStream fos = openFileOutput("info1.txt", MODE_PRIVATE) ;
fos.write("该文件是私有数据,只能被应用本身访问".getBytes());
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void click2(View v){
//此api会把文件写到data/data/com.bokeyuan.permission/files/文件夹下
try {
@SuppressWarnings("deprecation")
FileOutputStream fos = openFileOutput("info2.txt", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE) ;
fos.write("当前文件可以被其他应用读取或写入".getBytes());
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void click3(View v){
//此api会把文件写到data/data/com.bokeyuan.permission/files/文件夹下
try {
@SuppressWarnings("deprecation")
FileOutputStream fos = openFileOutput("info3.txt", MODE_WORLD_WRITEABLE) ;
fos.write("当前文件可以被其他应用写入".getBytes());
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} 

•获取SD卡剩余容量:

•有时候读写文件的时候,需要判断SD卡的剩余容量,再进行写入操作。下面小例子,引用Android系统底层的API,获取SD卡的剩余容量。

•布局文件:

<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" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout> 

•Java代码:

package com.bokeyuan.getsdavail;
import java.io.File;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.app.Activity;
import android.text.format.Formatter;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize;
long totalBlocks;
long availableBlocks; 
//检测系统当前版本号
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
blockSize = stat.getBlockSizeLong();
totalBlocks = stat.getBlockCountLong();
availableBlocks = stat.getAvailableBlocksLong();
}
else{
blockSize = stat.getBlockSize();
totalBlocks = stat.getBlockCount();
availableBlocks = stat.getAvailableBlocks();
} 
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(formatSize(availableBlocks * blockSize));
}
private String formatSize(long size) {
return Formatter.formatFileSize(this, size);
}
}

以上所述给大家介绍了Android开发笔记之Android中数据的存储方式(一)的相关知识,希望本文分享能够帮助到大家。下篇给android开发笔记之android中数据的存储方式(二),感兴趣的朋友点击了解详情。


标签:SQLite

返回前面的内容

相关阅读 >>

详解Sqlite中的数据类型

python web框架之django框架model基础详解

android Sqlite数据库连接实现登录功能

Sqlite3 api 编程手册

详解Sqlite中的查询规划器

mybatis如何自动生成sql语句

andriodstudio利用listview和数据库实现简单学生管理

Sqlite3 命令行操作指南

Sqlite3中的日期时间函数使用小结

django之模型层多表操作的实现

更多相关阅读请进入《Sqlite》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...