安卓之创建,读写文件,本地收藏,访问文件的权限和产品测试种类(方法)
2016-05-31 21:11
603 查看
转发请注明出处:http://blog.csdn.net/qq_28055429/article/details/51548562
一,测试:
(1)盒子测试
黑盒测试: 只关心程序执行的过程和结果
白盒测试: 根据源代码写测试方法或者测试用例
(2)根据测试的次数:
冒烟测试: smoke test
------在android中,常用android猴子(monkey)
压力测试:pressure test 测试抗压能力等
(3)用android猴子测试来举例
---》进入cmd命令,进入到某工程下
-----》输入adb shel
----->>输入 # monkey
---->>输入 # monkey 5000 //注释:看看模拟器是否承受得了5000次点击,然后再去调bug
二, 创建,读取文件,来实现本地收藏功能
(1)Context: 上下文 (类),提供一些方便的API,可得到应用程序的环境
例如; 环境包名 , 安装路径,文件路径,资源路径,资产路径等
(2)android开发中: 默认会为每个应用创建一个文件
放置于:data+包名下,
(3)Context.getFilesDir() 相当于 data/data/包名/
(4)常用创建文件方式:
如在手机创建一个文本,命名为info ,位于data/data/com.maiyu.test下
可以直接 File file = new File("data/data/com.maiyu.test/info.txt");
也可以: File file = new File(context.getFilesDir() , "info.txt");
当然还有别的方法,就不列举
(5)创建文件并写入数据,来收藏数据
这样就在data/data/包名/files下创建一个名字为info的文本,内容为傻逼
(6)判断某文件是否存在,若存在则写入map集合,代码如下:
三,权限:
(1)Linux系统下的文件权限:
位置0
- 代表:文件
d 代表:目录
一般情况下,android下的每一个应用程序都是一个独立的用户,对应一个独立的组
r 代表可读 , w 代表可写, x代表可执行
位置 1~3 :代表当前用户
位置4~6 :代表当前用户所在的组
位置7~9 :代表其他用户的权限
如:(第一个位代表一个数,其余3位代表一个数,二进制)
除第一位外:其他每一组的三位:rwx顺序
- --- --- --- 代表0000
- rw- --- --- 代表0600
- rw- rw- rw- 代表0666
如可以更改读写权限:
本来为 0000 即不允许其他应用读写本应用的数据
可进入 cd files
输入 : # chmod 666 info.txt
即可改为可读可写,
(2)Context.openFileOutput(参数1,参数2):
参数1:文件名,如“info.txt"
参数2:mode值
mode值:常用有
私有(不允许其他应用读写):Context.MODE_PRIVATE
公有(可读可写):Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE
只可读:Context.MODE_WORLD_READABLE
只可写:Context.MODE_WORLD_WRITEABLE
下面综合上面写一个例子:
两个应用,一个应用为手机创建文件并写入数据
另一个应用:用于测试访问第一个应用的文件,看是否可读和可写
第一个应用:
布局文件:
辅助类:
主类:
先运行第一应用,查看,data/data/包名/files下是否创建了文件,,,
第二个应用:
布局:
测试类:
这里测试类能否读取,,,,
一,测试:
(1)盒子测试
黑盒测试: 只关心程序执行的过程和结果
白盒测试: 根据源代码写测试方法或者测试用例
(2)根据测试的次数:
冒烟测试: smoke test
------在android中,常用android猴子(monkey)
压力测试:pressure test 测试抗压能力等
(3)用android猴子测试来举例
---》进入cmd命令,进入到某工程下
-----》输入adb shel
----->>输入 # monkey
---->>输入 # monkey 5000 //注释:看看模拟器是否承受得了5000次点击,然后再去调bug
二, 创建,读取文件,来实现本地收藏功能
(1)Context: 上下文 (类),提供一些方便的API,可得到应用程序的环境
例如; 环境包名 , 安装路径,文件路径,资源路径,资产路径等
(2)android开发中: 默认会为每个应用创建一个文件
放置于:data+包名下,
(3)Context.getFilesDir() 相当于 data/data/包名/
(4)常用创建文件方式:
如在手机创建一个文本,命名为info ,位于data/data/com.maiyu.test下
可以直接 File file = new File("data/data/com.maiyu.test/info.txt");
也可以: File file = new File(context.getFilesDir() , "info.txt");
当然还有别的方法,就不列举
(5)创建文件并写入数据,来收藏数据
<pre name="code" class="java"> File file = new File(context.getFilesDir() , "info.txt"); //创建FileOutputStream流 FileOutputStream fos = new FileOutputStream(file); //写入username + "##" + password,转换成Bytes fos.write(("傻逼" ).getBytes()); //关闭文件流 fos.close();
这样就在data/data/包名/files下创建一个名字为info的文本,内容为傻逼
(6)判断某文件是否存在,若存在则写入map集合,代码如下:
public static Map<String , String> useSaveLoginMessage(Context context ){ File file = new File(context.getFilesDir() , "info.txt"); try{ //创建FileInputStream对象 FileInputStream fis = new FileInputStream(file); //创建BufferedReader对象,参数为Reader对象 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String st = br.readLine(); String[] str = st.split("##"); Map<String , String> map = new HashMap<String, String>(); map.put("useName" ,str[0]); map.put("passWord", str[1]); br.close(); //关闭 fis.close(); return map; }catch (Exception e){ e.printStackTrace(); return null; } }
三,权限:
(1)Linux系统下的文件权限:
位置0
- 代表:文件
d 代表:目录
一般情况下,android下的每一个应用程序都是一个独立的用户,对应一个独立的组
r 代表可读 , w 代表可写, x代表可执行
位置 1~3 :代表当前用户
位置4~6 :代表当前用户所在的组
位置7~9 :代表其他用户的权限
如:(第一个位代表一个数,其余3位代表一个数,二进制)
除第一位外:其他每一组的三位:rwx顺序
- --- --- --- 代表0000
- rw- --- --- 代表0600
- rw- rw- rw- 代表0666
如可以更改读写权限:
本来为 0000 即不允许其他应用读写本应用的数据
可进入 cd files
输入 : # chmod 666 info.txt
即可改为可读可写,
(2)Context.openFileOutput(参数1,参数2):
参数1:文件名,如“info.txt"
参数2:mode值
mode值:常用有
私有(不允许其他应用读写):Context.MODE_PRIVATE
公有(可读可写):Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE
只可读:Context.MODE_WORLD_READABLE
只可写:Context.MODE_WORLD_WRITEABLE
下面综合上面写一个例子:
两个应用,一个应用为手机创建文件并写入数据
另一个应用:用于测试访问第一个应用的文件,看是否可读和可写
第一个应用:
布局文件:
<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:gravity="center_horizontal" android:orientation="vertical"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用户名:" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/username" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密码 :" /> <EditText android:inputType="textPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/password" /> </LinearLayout> <RadioGroup android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:id="@+id/rg_mode"> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="私有" android:id="@+id/rb_private" android:checked="true"/> <RadioButton android:layout_width="match_parent" android:layout_height="wrap_content" android:text="可读" android:id="@+id/rb_readable" android:checked="false" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="可写" android:id="@+id/rb_writeable" android:checked="false" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="公有" android:id="@+id/rb_public" android:checked="false" /> </RadioGroup> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:checked="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存数据" android:id="@+id/rmpassword" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录" android:layout_alignParentRight="true" android:id="@+id/login" /> </RelativeLayout> </LinearLayout>
辅助类:
package com.maiyu.logintest; import android.content.Context; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; /** * Created by maiyu on 2016/5/31. */ public class SaveLogin { /** * 根据mode选择保存模式 1--private ,2 --readable , 3---writeable , 4--public * @param context * @param username * @param password * @param mode * @return */ public static boolean saveLoginMessage(Context context , String username , String password , int mode) { //创建File文件:data/data/files/info.txt try { FileOutputStream fos = null; switch (mode) { case 1: fos = context.openFileOutput("private.txt", Context.MODE_PRIVATE); break; case 2: fos = context.openFileOutput("readable.txt", Context.MODE_WORLD_READABLE); break; case 3: fos = context.openFileOutput("writeable.txt", Context.MODE_WORLD_WRITEABLE); break; case 4: fos = context.openFileOutput("public.txt", Context.MODE_WORLD_READABLE | Context.MODE_WORLD_READABLE); break; default: break; } fos.write(("abcdefg" + "##" + username + "##" + password).getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); return false; } return true; }
主类:
package com.maiyu.logintest; import com.maiyu.logintest.SaveLogin; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; import android.app.Activity; import android.content.pm.PackageManager; import android.support.annotation.NonNull; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.app.LoaderManager.LoaderCallbacks; import android.content.CursorLoader; import android.content.Loader; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.provider.ContactsContract; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.EditorInfo; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static android.Manifest.permission.READ_CONTACTS; /** * A login screen that offers login via email/password. */ public class LoginActivity extends Activity { private static String TAG = "LoginActivity" ; private EditText username , password ; private CheckBox rmPassword ; private Button login ; private RadioButton rbtnPrivate , rbtnRead , rbtnWrite, rbtnPublic; private RadioGroup rg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); findViewById(); //useSave(); login.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { String strName = username.getText().toString(); //获取登录名字 String strWord = password.getText().toString(); //获取登录密码 //判空 if((strName.isEmpty() || strWord.isEmpty())){ Toast.makeText(LoginActivity.this , "用户名或者密码不能为空" , Toast.LENGTH_SHORT).show(); Log.d(TAG , "用户名或者密码为空"); } else { if(rmPassword.isChecked()){ //是保存数据 int mode = 1; String msg = "保存私有文件成功" ; int id = rg.getCheckedRadioButtonId() ; //判断保存数据的类型 switch (id){ case R.id.rb_private: mode = 1; msg = "保存私有文件成功" ; break; case R.id.rb_readable: mode = 2; msg = "保存可读文件成功" ; break; case R.id.rb_writeable: mode = 3; msg = "保存可写文件成功" ; break; case R.id.rb_public: mode = 4; msg = "保存公有文件成功" ; break; default: break; } //调用方法保存 SaveLogin.saveLoginMessage(LoginActivity.this , strName , strWord , mode); Toast.makeText(LoginActivity.this , msg , Toast.LENGTH_SHORT).show(); Log.d(TAG , "已经保存成功"); } if("zhangsan".equals(strName) && "123".equals(strWord)){ Toast.makeText(LoginActivity.this , "登录成功" , Toast.LENGTH_SHORT).show(); Log.d(TAG , "登录成功"); } else{ Toast.makeText(LoginActivity.this , "用户名或者密码错误" , Toast.LENGTH_SHORT).show(); Log.d(TAG , "登录失败"); } } } }); } //绑定id private void findViewById(){ username = (EditText)findViewById(R.id.username); password = (EditText)findViewById(R.id.password); rmPassword = (CheckBox)findViewById(R.id.rmpassword) ; login = (Button)findViewById(R.id.login); rg = (RadioGroup)findViewById(R.id.rg_mode); } }
先运行第一应用,查看,data/data/包名/files下是否创建了文件,,,
第二个应用:
布局:
<?xml version="1.0" encoding="utf-8"?> <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:orientation="vertical"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="访问私有文件" android:id="@+id/btn_private" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="访问可读文件" android:id="@+id/btn_read" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="访问可写文件" android:id="@+id/btn_write" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="访问公有文件" android:id="@+id/btn_public" /> </LinearLayout>
测试类:
package com.maiyu.testRead; import android.app.Activity; import android.content.DialogInterface; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; public class MainActivity extends Activity { private Button privateBtn , readBtn , writeBtn , publicBtn ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(); btnOnClickListener(); } public void findViewById(){ privateBtn = (Button)findViewById(R.id.btn_private); readBtn = (Button)findViewById(R.id.btn_read); writeBtn = (Button)findViewById(R.id.btn_write); publicBtn = (Button)findViewById(R.id.btn_public); } public void btnOnClickListener(){ privateBtn.setOnClickListener(new myOnClickListener()); readBtn.setOnClickListener(new myOnClickListener()); writeBtn.setOnClickListener(new myOnClickListener()); publicBtn.setOnClickListener(new myOnClickListener()); } class myOnClickListener implements View.OnClickListener { @Override public void onClick(View v) { File file = null; String msg = null ; int id = v.getId(); switch (id){ case R.id.btn_private: msg = "私有文件" ; file = new File("data/data/com.maiyu.logintest/files/private.txt"); break; case R.id.btn_read: msg = "可读文件" ; file = new File("data/data/com.maiyu.logintest/files/readable.txt"); break; case R.id.btn_write: msg = "可写文件" ; file = new File("data/data/com.maiyu.logintest/files/writeable.txt"); break; case R.id.btn_public: msg = "公有文件" ; file = new File("data/data/com.maiyu.logintest/files/public.txt"); break; } try { FileInputStream fis = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String result = br.readLine(); br.close(); fis.close(); // String[] str = result.split("##"); Toast.makeText(MainActivity.this , result , Toast.LENGTH_SHORT).show(); }catch (Exception e){ e.printStackTrace(); Toast.makeText(MainActivity.this , msg + "读取失败" , Toast.LENGTH_SHORT).show(); } } } }
这里测试类能否读取,,,,
相关文章推荐
- android使用selector实现按下去的效果注意事项
- 【BZOJ4405】挑战NPC 带花树模板 一般图最大匹配
- HDOJ--Rightmost Digit
- Linux内核模块编程
- 原生servlet配合smartupload实现批量下载和批量上传
- C语言 链表相关 操作
- Linux - 常用命令
- [iOS]UITableView回调和table相关成员方法详解
- ngrok内网发布到外网神器
- 深入学习java并发编程:Thread类的使用
- lookmore-Apache Commons包含开源工具
- osgAnimation之动画管理器
- Linux设置环境变量方法
- FZU 2147(找规律)
- <%@include file=""%>和 <jsp:include file="">之间的区别
- BZOJ 3110 【ZJOI2013】 K大数查询
- iOS开发UI篇—字典转模型
- ADS-WK11-Review of Programming Contest Rules-回溯剪枝
- 1011. World Cup Betting (20)
- hdu1045(二分图)