`
bcyy
  • 浏览: 1828244 次
文章分类
社区版块
存档分类
最新评论

文件操作与SDCard读写访问

 
阅读更多

Android中读写文件可以采用两种方式:一种是采用JDK提供的FileInputStreamFileOutputStream这些类来操作,另一种是采用AndroidContext类自带的一些方法操作,如FileOutputStream openFileOutput(String name, int mode)方法用于写文件,FileInputStream openFileInput(String name)方法用于读文件。

mode有四种模式,分别为:

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_READABLEContext.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

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

如果希望文件被其他应用读和写,可以传入:

openFileOutput("test.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

SDcard的读写访问

一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在SDCard SDCard是干什么的?你可以把它看作是移动硬盘或U盘。

在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下:
Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2GSDCard,文件后缀可以随便取,建议使用.img
mksdcard 2048M D:\AndroidTool\sdcard.img

在程序中访问SDCard,你需要申请访问SDCard的权限。
AndroidManifest.xml中加入访问SDCard的权限如下:
<!--
SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--
SDCard写入数据权限 -->
<uses-permission android:name="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, “happy.txt”);
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("Happy".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, "happy.txt");
//
上面两句代码可以合成一句: File saveFile = new File("/mnt/sdcard/happy.txt");
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("Happy ...".getBytes());
outStream.close();

下面列出项目代码以供参考:

AndroidManifest.xml

[html]view plaincopy

1. <?xmlversion="1.0"encoding="utf-8"?>

2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"

3. package="com.geniusxiaoyu.file"android:versionCode="1"

4. android:versionName="1.0">

5. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">

6. <uses-libraryandroid:name="android.test.runner"/>

7. <activityandroid:name=".FileActivity"android:label="@string/app_name">

8. <intent-filter>

9. <actionandroid:name="android.intent.action.MAIN"/>

10. <categoryandroid:name="android.intent.category.LAUNCHER"/>

11. </intent-filter>

12. </activity>

13.

14. </application>

15. <uses-sdkandroid:minSdkVersion="8"/>

16. <instrumentationandroid:name="android.test.InstrumentationTestRunner"

17. android:targetPackage="com.geniusxiaoyu.file"android:label="TestsforMyApp"/>

18. <!--SDCard中创建与删除文件权限-->

19. <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

20. <!--SDCard写入数据权限-->

21. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

22. </manifest>


res/values/strings.xml

[html]view plaincopy

1. <?xmlversion="1.0"encoding="utf-8"?>

2. <resources>

3. <stringname="hello">HelloWorld,FileActivity!</string>

4. <stringname="app_name">文件操作</string>

5. <stringname="filename">文件名称</string>

6. <stringname="filecontent">文件内容</string>

7. <stringname="button">保存文件</string>

8. <stringname="success">文件保存成功</string>

9. <stringname="failed">文件保存失败</string>

10. <stringname="sdcarderror">SDCard不存在或已被写保护了</string>

11. </resources>

界面布局文件res/layout/main.xml

[html]view plaincopy

1. <?xmlversion="1.0"encoding="utf-8"?>

2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

3. android:orientation="vertical"

4. android:layout_width="fill_parent"

5. android:layout_height="fill_parent"

6. >

7. <TextView

8. android:layout_width="fill_parent"

9. android:layout_height="wrap_content"

10. android:text="@string/filename"

11. />

12. <EditText

13. android:layout_width="fill_parent"

14. android:layout_height="wrap_content"

15. android:id="@+id/filename"

16. />

17. <TextView

18. android:layout_width="fill_parent"

19. android:layout_height="wrap_content"

20. android:text="@string/filecontent"

21. />

22. <EditText

23. android:layout_width="fill_parent"

24. android:layout_height="wrap_content"

25. android:minLines="3"

26. android:id="@+id/filecontent"

27. />

28. <Button

29. android:layout_width="wrap_content"

30. android:layout_height="wrap_content"

31. android:text="@string/button"

32. android:id="@+id/button"

33. />

34. </LinearLayout>



src/com/geniusxiaoyu/file/service/FileService
.java

[java]view plaincopy

1. packagecom.geniusxiaoyu.service;

2.

3. importjava.io.ByteArrayOutputStream;

4. importjava.io.File;

5. importjava.io.FileInputStream;

6. importjava.io.FileOutputStream;

7.

8. importandroid.content.Context;

9. importandroid.os.Environment;

10.

11. publicclassFileService{

12. privateContextcontext;

13. publicFileService(Contextcontext){

14. this.context=context;

15. }

16.

17. /**

18. *保存文件

19. *@paramfilename文件名

20. *@paramcontent内容

21. *@parammode模式

22. *@throwsException

23. */

24. publicvoidsave(Stringfilename,Stringcontent,intmode)throwsException{

25. FileOutputStreamfos=context.openFileOutput(filename,mode);

26. //写入数据

27. fos.write(content.getBytes());

28. //关闭输出流

29. fos.close();

30.

31. }

32.

33. /**

34. *保存文件,以私有模式保存

35. *@paramfilename文件名

36. *@paramcontent内容

37. *@throwsException

38. */

39. publicvoidsave(Stringfilename,Stringcontent)throwsException{

40. save(filename,content,Context.MODE_PRIVATE);

41. }

42.

43. /**

44. *往存储卡中写入数据

45. *@paramfilename

46. *@paramcontent

47. *@throwsException

48. */

49. publicvoidsaveToSDCard(Stringfilename,Stringcontent)throwsException{

50. //SDcard路径在2.2以前是/sdcard,在2.2以上版本中是/mnt/sdcard,最好采用下面的方式灵活获取,适用于所有版本

51. Filefile=newFile(Environment.getExternalStorageDirectory(),filename);

52. FileOutputStreamfos=newFileOutputStream(file);

53. //写入数据

54. fos.write(content.getBytes());

55. //关闭输出流

56. fos.close();

57.

58. }

59.

60. publicStringreadFile(Stringfilename)throwsThrowable{

61. FileInputStreamfis=context.openFileInput(filename);

62. byte[]buf=newbyte[1024];

63. intlen=0;

64. ByteArrayOutputStreambaos=newByteArrayOutputStream();

65. //读取数据

66. while((len=fis.read(buf))!=-1){

67. baos.write(buf,0,len);

68. }

69. byte[]data=baos.toByteArray();

70. //关闭流

71. baos.close();

72. fis.close();

73. returnnewString(data);

74. }

75. }


src/com/geniusxiaoyu/file/FileActivity.java

[java]view plaincopy

1. packagecom.geniusxiaoyu.file;

2.

3. importandroid.app.Activity;

4. importandroid.os.Bundle;

5. importandroid.os.Environment;

6. importandroid.util.Log;

7. importandroid.view.View;

8. importandroid.widget.Button;

9. importandroid.widget.EditText;

10. importandroid.widget.Toast;

11.

12. importcom.geniusxiaoyu.service.FileService;

13.

14. publicclassFileActivityextendsActivity{

15. privateFileServicefileService;

16. privatestaticfinalStringTAG="FileActivity";

17.

18. /**Calledwhentheactivityisfirstcreated.*/

19. @Override

20. publicvoidonCreate(BundlesavedInstanceState){

21. super.onCreate(savedInstanceState);

22. setContentView(R.layout.main);

23.

24. fileService=newFileService(this);

25.

26. Buttonbutton=(Button)this.findViewById(R.id.button);

27. button.setOnClickListener(newView.OnClickListener(){

28.

29. @Override

30. publicvoidonClick(Viewv){

31. //1.获取输入的数据

32. EditTextfilenameText=(EditText)findViewById(R.id.filename);

33. EditTextfilecontentText=(EditText)findViewById(R.id.filecontent);

34. Stringfilename=filenameText.getText().toString();

35. Stringfilecontent=filecontentText.getText().toString();

36.

37. //2.保存内容

38. try{

39. //直接存入手机

40. fileService.save(filename,filecontent);

41. //判断手机上是否有SDCard,并且可以进行读写访问

42. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

43. fileService.saveToSDCard(filename,filecontent);

44. Toast.makeText(FileActivity.this,R.string.success,Toast.LENGTH_LONG).show();

45. }else{

46. Toast.makeText(FileActivity.this,R.string.sdcarderror,Toast.LENGTH_LONG).show();

47. }

48. }catch(Exceptione){

49. Log.e(TAG,e.toString());

50. Toast.makeText(FileActivity.this,R.string.failed,Toast.LENGTH_LONG).show();

51. }

52.

53. }

54. });

55. }

56. }


单元测试类src/com/geniusxiaoyu/file/FileServiceTest.java

[java]view plaincopy

1. packagecom.geniusxiaoyu.file;

2.

3. importandroid.content.Context;

4. importandroid.test.AndroidTestCase;

5. importandroid.util.Log;

6.

7. importcom.geniusxiaoyu.service.FileService;

8.

9. publicclassFileServiceTestextendsAndroidTestCase{

10. privatestaticfinalStringTAG="FileServiceTest";

11.

12. publicvoidtestSave()throwsThrowable{

13. FileServiceservice=newFileService(this.getContext());

14. service.save("test1.txt","哈哈哈hahaha");

15. }

16.

17. publicvoidtestReadFile()throwsThrowable{

18. FileServiceservice=newFileService(this.getContext());

19. Stringcontent=service.readFile("rwa.txt");

20. //日志输出文件内容

21. Log.i(TAG,content);

22. }

23.

24. publicvoidtestSaveAppend()throwsThrowable{

25. FileServiceservice=newFileService(this.getContext());

26. service.save("test1.txt","appendsomething.",Context.MODE_APPEND);

27. }

28.

29. publicvoidtestSaveReadable()throwsThrowable{

30. FileServiceservice=newFileService(this.getContext());

31. service.save("readable.txt","I'mreadable.",Context.MODE_WORLD_READABLE);

32. }

33.

34. publicvoidtestSaveWriteable()throwsThrowable{

35. FileServiceservice=newFileService(this.getContext());

36. service.save("writeable.txt","I'mwriteable.",Context.MODE_WORLD_WRITEABLE);

37. }

38.

39. publicvoidtestSaveRW()throwsThrowable{

40. FileServiceservice=newFileService(this.getContext());

41. service.save("rw.txt","I'mreadable&writeable.",Context.MODE_WORLD_WRITEABLE+Context.MODE_WORLD_READABLE);

42. }

43.

44. publicvoidtestSaveRWA()throwsThrowable{

45. FileServiceservice=newFileService(this.getContext());

46. service.save("rwa.txt","I'mreadable&writeable&append.",Context.MODE_WORLD_WRITEABLE+Context.MODE_WORLD_READABLE+Context.MODE_APPEND);

47. }

48. }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics