测试、文件的读写、SharedPreferences

本文介绍了Android平台上的冒烟测试及单元测试方法,并详细阐述了应用内部文件存储的多种方式,包括私有文件存储、缓存文件存储及外部存储等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒烟测试:
adb shell monkey -p <程序的包名> -v <事件的数量>

android下单元测试:
在AndroidManifest.xml文件中配置一下信息:

    在manifest节点下:    
<!--     指定测试信息和要测试的包 -->
    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.itheima28.junittest" />

    在application节点下配置下面信息:
    <!--      指定引用的测试包 -->
    <uses-library android:name="android.test.runner" />

测试时, 定义一个类继承AndroidTestCase
int result = MathUtils.incrment(9, 10);
        // 断言, 断定某一个对象就是某一个值        
        assertEquals(19, result);


文件存储:
        this.getFilesDir(); // /data/data/包名/files
        this.getCacheDir(); // /data/data/包名/cache

        openFileOutput("aa.txt", 0); /data/data/包名/files/aa.txt

在上下文中有一个方法叫openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
FileOutputStream outStream = this.openFileOutput("itcast.txt", Context.MODE_PRIVATE);
outStream.write("传".getBytes());
outStream.close();   
openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,
如果文件不存在,Android会自动创建它。创建的文件保存在/data/data/<package name>/files目录
openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为: Context.MODE_PRIVATE    =  0
Context.MODE_APPEND    =  32768
Context.MODE_WORLD_READABLE =  1
Context.MODE_WORLD_WRITEABLE =  2

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

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则
就创建新文件。

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控
制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

如果希望文件被其他应用读和写,可以传入: 
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个
userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况
下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位
于/data/data/<package name>/files),其他程序无法访问。除非在创建时指
定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE 
,只有这样其他程序才能正确访问。


//读取文件内容
如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可
以使用Activity提供openFileInput()方法。
FileInputStream inStream = this.getContext().openFileInput("itcast.txt");
Log.i("FileTest", readInStream(inStream));
readInStream()的方法请看本页下面备注。

或者直接使用文件的绝对路径:
File file = new File("/data/data/cn.itcast/files/itcast.txt");
FileInputStream inStream = new FileInputStream(file);
Log.i("FileTest", readInStream(inStream));

对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以
在创建文件时,指定Context.MODE_WORLD_READABLE和
Context.MODE_WORLD_WRITEABLE权限。

Activity还提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于获取/data/data/<package name>/cache目录
getFilesDir()方法用于获取/data/data/<package name>/files目录

//把文件存放在SDCard
使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一
般手机的存储空间不是很大,存放些小文件还行

在程序中访问SDCard,你需要申请访问SDCard的权限。
// 挂载和卸载SDCard
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
// 写入外存储设备权限
android.permission.WRITE_EXTERNAL_STORAGE

要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。
注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
         File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录

         File saveFile = new File(sdCardDir, “itcast.txt”);
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("传".getBytes());
outStream.close();
}

Environment.getExternalStorageState()方法用于获取SDCard的状态,如
果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于
Environment.MEDIA_MOUNTED。

Environment.getExternalStorageDirectory()方法用于获取SDCard的目
录,当然要获取SDCard的目录,你也可以这样写:
File sdCardDir = new File("/mnt/sdcard"); //获取SDCard目录
File saveFile = new File(sdCardDir, "itcast.txt"); 

//上面两句代码可以合成一句: 
File saveFile = new File("/mnt/sdcard/itcast.txt");
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("传test".getBytes());
outStream.close();


权限相关:
1. 私有文件
2. 可读文件
3. 可写文件
4. 可读可写文件.

Linux 文件权限
位置0 -:代表文件
     d:代表目录

位置1-3:当前用户 r:可读 w:可写  x可执行

位置4-6:当前用户所在的组

位置7-9:其它的用户




SharedPreferences存储路径: /data/data/包名/shared_prefs/
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tvMemoryInfo = (TextView) findViewById(R.id.tv_memory_info);

        // 获得sd卡的内存状态
        File sdcardFileDir = Environment.getExternalStorageDirectory();
        String sdcardMemory = getMemoryInfo(sdcardFileDir);

        // 获得手机内部存储控件的状态
        File dataFileDir = Environment.getDataDirectory();
        String dataMemory = getMemoryInfo(dataFileDir);

        tvMemoryInfo.setText("SD卡: " + sdcardMemory + "\n手机内部: " + dataMemory);
    }

    /**
     * 根据路径获取内存状态
     * @param path
     * @return
     */
    private String getMemoryInfo(File path) {
        // 获得一个磁盘状态对象
        StatFs stat = new StatFs(path.getPath());

        long blockSize = stat.getBlockSize();   // 获得一个扇区的大小

        long totalBlocks = stat.getBlockCount();    // 获得扇区的总数

        long availableBlocks = stat.getAvailableBlocks();   // 获得可用的扇区数量

        // 总空间
        String totalMemory =  Formatter.formatFileSize(this, totalBlocks * blockSize);
        // 可用空间
        String availableMemory = Formatter.formatFileSize(this, availableBlocks * blockSize);

        return "总空间: " + totalMemory + "\n可用空间: " + availableMemory;
    }
}
//SharedPreferences :作用:用于保存一些配置信息或系统的参数信息
    /**
     * 保存用户登陆时的信息 ,将信息写成 xml的格方   文件存入在 应用程序包下的 shared_prefs/config 
     * @param context
     * @param name
     * @param password
     */
    public static void saveUserInfo(Context context,String name,String password) {

        SharedPreferences sp =  
                        context.getSharedPreferences("config", Context.MODE_PRIVATE);

        //得到一个 sp 的编辑器
        Editor editor = sp.edit();

        editor.putString("user", name);
        editor.putString("password", password);

        //获取xml中的存入的数据 String name = sp.getString("user", "");

        //保存数据成功,类似于事务
        editor.commit();
    }


如果想访问其他应用中的Preference。
有两个前提条件是:
两个应用程序需要在AndroidManifest.xml中manifest节点里添加sharedUserId属性,并且要一样,而且还要有两级,也就是需要有个“.”

该preference创建时必须指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。

满足上面两个条件之后在我们应用中需要得到另一个应用的上下文对象:
Context otherAppsContext = createPackageContext("cn.itcast.action",             Context.CONTEXT_IGNORE_SECURITY);

拿到上下文对象之后通过调用上下文中的方法得到SharedPreferences对象,最后进行数据的交互。
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("itcast", Context.MODE_WORLD_READABLE);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值