现在的位置: 首页 > 移动开发 > 正文

Android学习笔记—13_文件的操作模式.各个应用之间的文件权限

2019年09月19日 移动开发 ⁄ 共 12180字 ⁄ 字号 评论关闭

2013-03-05
13_文件的操作模式
---------------------------------------
1.注意在应用相同的情况下,不同的项目一定不要用相同的包名这样的话,会被视为是一个应  


----------------------------------
2.a.Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访  

  问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文    

件可以使用Context.MODE_APPEND
  b.Context.MODE_PRIVATE:只可以被本应用访问,不可以被其他应用访问
---------------------------------
3. Unable to find instrumentation target package的问题
本例为以下DemoDao类进行单元测试
----------------新建DemoDao.java--------------
package com.neter.test.dao;

import android.util.Log;

public class DemoDao{

public void save(){
Log.i("DemoDao", "用来测试的方法");
}
}
----------------新建DemoDaoTest.java--------------
package com.neter.test.dao;

import android.test.AndroidTestCase;
import android.util.Log;

public class DemoDaoTest extends AndroidTestCase {

public void testSave() {
new DemoDao().save();
Log.i("DemoDaoTest", "测试");
}

}
-------------------------------AndroidManifest.xml--------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.neter.test.dao"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<uses-library android:name="android.test.runner"/>
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<instrumentation android:name="android.test.InstrumentationTestRunner" 

android:targetPackage="com.neter.test.dao" 

android:label="Testing"></instrumentation>
</manifest>
上面配置文件中
MainActivity为android程序入口,请自已新建代码略
<uses-library android:name="android.test.runner"/>不可修改
android:name="android.test.InstrumentationTestRunner不可修改
android:label="Testing"可不写
如出现Test run failed:Unable to find instrumentation target package
是因为 android:targetPackage="com.neter.test.dao" 必须和
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.neter.test.dao"
package相同的包名
-------------------------------------------------------------------
3.新建一个项目来测试,在
FileOutputStream outStream=context.openFileOutput(filename,Context.MODE_PRIVATE);
  模式下,其他应用不可以访问用这个模式创建的文件
-------------------------------------------------------
a.创建Android项目OherFile
b./OherFile/src/com/credream/otherfile/OherFileActivity.java  这个文件自动生成
c./OherFile/src/com/credream/othertest/AccessOtherPrivateTest.java
  package com.credream.othertest;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;

import android.test.AndroidTestCase;
import android.util.Log;

public class AccessOtherPrivateTest extends AndroidTestCase
{private static final String TAG="AccessOtherPrivateTest";
public void testAccessPrivate() throws Throwable{

String path="/data/data/com.credream.file/files/lidewei.txt";
File file=new File(path);
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
FileInputStream inputStream=new FileInputStream(file);
byte[] buffer=new byte[1024];
int len=0;
while ((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
byte[] data=outputStream.toByteArray();
outputStream.close();
inputStream.close();
String content=new String(data);
Log.i(TAG, content);
}
}
-------------------------------------------------------
d./OherFile/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.credream.otherfile"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".OherFileActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    <uses-library android:name="android.test.runner" />
        </application>

 <instrumentation android:name="android.test.InstrumentationTestRunner"
  android:targetPackage="com.credream.otherfile" android:label="Tests for My App" 

/>
</manifest>
--------------------------------------------------------
e.在AccessOtherPrivateTest.java选择那个方法来右键Android junit  test来测试
  出现如下错误:
java.io.FileNotFoundException: /data/data/com.credream.file/files/lidewei.txt 

(Permission denied)
at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
at java.io.FileInputStream.<init>(FileInputStream.java:82)
at com.credream.othertest.AccessOtherPrivateTest.testAccessPrivate

(AccessOtherPrivateTest.java:17)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart

(InstrumentationTestRunner.java:520)
at android.app.Instrumentation$InstrumentationThread.run

(Instrumentation.java:1447)提示没有权限
  说明在模式下,其他应用无法访问该文件;
-----------------------------------------------------
2.第二种操作模式:
  Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新 

  文件。
 a.Context.MODE_APPEND:追加模式创建的文件只能被本应用访问
---------------------------------------------------
3.小技巧:
  选中字母:按ctrl+shift+y变成小写
  ctrl+shift+x变成大写
--------------------------------------------------------------
4.选中相同部分的代码,自动生成方法
  如果相同部分代码有很多的话,那么可以选中重复部分的代码,然后右键--->Refactor-->
  Extract Mehtod-->填写上方法名,就可以自动的生成这部分代码的方法了
  a.这个方法适用于:一个类里面有很多方法,而每个方法里面都有一部分这种代码
    那么这种代码就可以抽出来自动生成
------------------------------------------------
5.MODE_WORLD_READABLE:模式表示当前文件可以被其他应用读取,同时如果存在这个文件
  则会覆盖原来文件的内容
--------------------------------------------------------------------
6.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。同时如果存在这个文件
  则会覆盖原来文件的内容
---------------------------------------------------------------
2013-03-06
各种文件模式的测试代码:
----------------------------------
File项目:
------------------
/File/src/com/credream/file/readTest.java
package com.credream.file;

import com.credream.service.FileService;

import android.test.AndroidTestCase;
import android.util.Log;

public class readTest extends AndroidTestCase
{
private static final String TAG="FileServiceTest";
public void testRead()throws Exception{
FileService service=new FileService(this.getContext());
String result=service.read("lidewei.txt");
Log.i(TAG, result);
}

public void testAppend()throws Exception{
FileService service=new FileService(this.getContext());
service.saveAppend("append.txt",",www.credream.com");
}

public void testReadable()throws Exception{
FileService service=new FileService(this.getContext());
service.saveReadable("readable.txt","www.ream.com");
}

public void testWriteable()throws Exception{
FileService service=new FileService(this.getContext());
service.saveWriteable("writeable.txt","writeable");
}

}
---------------------------------------------------------------
/File/src/com/credream/service/FileService.java
package com.credream.service;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import android.content.Context;

public class FileService
{
/**
 *保存文件
 * @param filename 文件名称
 * @param content  文件内容
 */
private Context context;



public FileService(Context context)
{
this.context = context;
}
public void save(String filename, String content) throws Exception
{
//IO j2ee
FileOutputStream outStream=context.openFileOutput

(filename,Context.MODE_PRIVATE);
//mode:以覆盖形式和追加形式两种
       //context.openFileOutput(filename,mode)

//Context.MODE_PRIVATE私有操作模式 创建出来的文件只能被本应用访问

;其他应用无法访问该文件
//另外采用私有操作模式创建的文件,写入文件中的内容覆盖源文件的内容
outStream.write(content.getBytes());//content.getBytes()这个方法

调用系统的
//Returns a new byte array containing the characters of this 

string encoded using the system's default charset. 
        //默认是用utf-8
//The behavior when this string cannot be represented in the 

system's default charset is unspecified. In practice, when the default charset is 

UTF-8 (as it is on Android), all strings can be encoded. 
        //没有默认编码的时候,会用iso8859-1来编码
   outStream.close();
}


public void saveAppend(String filename, String content) throws Exception
{
//IO j2ee
FileOutputStream outStream=context.openFileOutput

(filename,Context.MODE_APPEND);
outStream.write(content.getBytes());//content.getBytes()这个方法

调用系统的
outStream.close();
}


public void saveReadable(String filename, String content) throws 

Exception
{
//IO j2ee
FileOutputStream outStream=context.openFileOutput

(filename,Context.MODE_WORLD_READABLE);
outStream.write(content.getBytes());//content.getBytes()这个方法

调用系统的
outStream.close();
}

public void saveWriteable(String filename, String content) throws 

Exception
{
//IO j2ee
FileOutputStream outStream=context.openFileOutput

(filename,Context.MODE_WORLD_WRITEABLE);
outStream.write(content.getBytes());//content.getBytes()这个方法

调用系统的
outStream.close();
}


/**
* 文件读取内容
* @param filename 文件名
* @return
* @throws Exception
*/
public String read(String filename) throws Exception{
FileInputStream inputStream=context.openFileInput(filename);
ByteArrayOutputStream  outputStream=new ByteArrayOutputStream();
//这个方法会在/data/data/<package name>/files目录下查找这个文件
//如果找到了就返回一个输入流
byte[] buffer=new byte[1024];

//inputStream.read(buffer);//读满这个数组后返回
//只要数据没有读完,需要一直调用这个方法
//这个方法的返回值为-1的时候,是读完了,不是-1的时候返回的是
//读取的大小字节
int len=0;
while ((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
//把读取的数据放到内存中
}
byte[] data=outputStream.toByteArray();
return new String(data);
}

}
------------------------------------------------------------
/File/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.credream.file"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".FileActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
     <uses-library android:name="android.test.runner" />
        </application>
         <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.credream.file" />
        

</manifest>
---------------------------------------------------------------
OherFile项目:
/OherFile/src/com/credream/othertest/AccessOtherPrivateTest.java
package com.credream.othertest;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import android.test.AndroidTestCase;
import android.util.Log;

public class AccessOtherPrivateTest extends AndroidTestCase
{private static final String TAG="AccessOtherPrivateTest";
public void testAccessPrivate() throws Throwable{

String path="/data/data/com.credream.file/files/lidewei.txt";
File file=new File(path);
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
FileInputStream inputStream=new FileInputStream(file);
byte[] buffer=new byte[1024];
int len=0;
while ((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
byte[] data=outputStream.toByteArray();
outputStream.close();
inputStream.close();
String content=new String(data);
Log.i(TAG, content);
}

public void testAccessAppend() throws Throwable{
String TAG="testAccessAppend";
String path="/data/data/com.credream.file/files/append.txt";
File file=new File(path);
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
FileInputStream inputStream=new FileInputStream(file);
byte[] buffer=new byte[1024];
int len=0;
while ((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
byte[] data=outputStream.toByteArray();
outputStream.close();
inputStream.close();
String content=new String(data);
Log.i(TAG, content);
}

public void testAccessReadable() throws Throwable{
String TAG="testAccessReadable";
String path="/data/data/com.credream.file/files/readable.txt";
File file=new File(path);
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
FileInputStream inputStream=new FileInputStream(file);
byte[] buffer=new byte[1024];
int len=0;
while ((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
byte[] data=outputStream.toByteArray();
outputStream.close();
inputStream.close();
String content=new String(data);
Log.i(TAG, content);
}

public void testAccessWriteable() throws Throwable{
 
String path="/data/data/com.credream.file/files/writeable.txt";
File file=new File(path);
FileOutputStream outputStream=new FileOutputStream(file);
outputStream.write("lidewei".getBytes());
outputStream.close();
 
}

}

抱歉!评论已关闭.