您的位置:首页 > 移动开发 > Android开发

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

2013-03-06 21:04 351 查看
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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐