把文件存放在SDCard

http://www.apkbus.com/android-2413-1-1.html


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


在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下:在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用.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, “ljq.txt”);
         FileOutputStream outStream = new FileOutputStream(saveFile);
         outStream.write("abc".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, "ljq.txt");
//上面两句代码可以合成一句: File saveFile = new File("/mnt/sdcard/ljq.txt");
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("abc".getBytes());
outStream.close();


案例

main.xml布局文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns: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.     <!-- 相对布局 -->
  8.     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  9.         android:orientation="vertical"
  10.         android:layout_width="fill_parent"
  11.         android:layout_height="wrap_content">
  12.         <TextView android:layout_width="wrap_content"
  13.             android:layout_height="wrap_content"
  14.             android:text="@string/filename"
  15.             android:id="@+id/filenameLable" />
  16.         <EditText android:layout_width="250px"
  17.             android:layout_height="wrap_content"
  18.             android:layout_toRightOf="@id/filenameLable"
  19.             android:layout_alignTop="@id/filenameLable"
  20.             android:layout_marginLeft="10px"
  21.             android:text="ljq.txt"
  22.             android:id="@+id/filename" />
  23.     </RelativeLayout>
  24.     <TextView android:layout_width="fill_parent"
  25.         android:layout_height="wrap_content"
  26.         android:text="@string/content" />
  27.     <EditText android:layout_width="fill_parent"
  28.         android:layout_height="wrap_content"
  29.         android:minLines="3"
  30.         android:id="@+id/content" />
  31.     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  32.         android:orientation="vertical"
  33.         android:layout_width="fill_parent"
  34.         android:layout_height="wrap_content">
  35.         <Button android:layout_width="wrap_content"
  36.             android:layout_height="wrap_content"
  37.             android:text="@string/button"
  38.             android:id="@+id/button" />
  39.         <Button android:layout_width="wrap_content"
  40.             android:layout_height="wrap_content"
  41.             android:layout_toRightOf="@id/button"
  42.             android:layout_alignTop="@id/button"
  43.             android:layout_marginLeft="10px"
  44.             android:minLines="3"
  45.             android:text="@string/readButton"
  46.             android:id="@+id/readButton" />
  47.     </RelativeLayout>
  48.      <TextView android:layout_width="wrap_content"
  49.             android:layout_height="wrap_content"
  50.             android:id="@+id/resultView" />
  51. </LinearLayout>
复制代码

strings.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3.     <string name="hello">Hello World, FileActivity!</string>
  4.     <string name="app_name">数据保存</string>
  5.     <string name="filename">文件名称</string>
  6.     <string name="content">文件内容</string>
  7.     <string name="button">保存</string>
  8.     <string name="readButton">读取内容</string>
  9.     <string name="error">保存失败</string>
  10.     <string name="success">保存成功</string>
  11. </resources>
复制代码
FileService工具类
  1. package com.ljq.service;

  2. import java.io.ByteArrayOutputStream;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;

  5. public class FileService {

  6.     /**
  7.      * 保存数据
  8.      *
  9.      * @param outputStream
  10.      * @param content
  11.      * @throws Exception
  12.      */
  13.     public static void save(OutputStream outputStream, String content) throws Exception {
  14.         outputStream.write(content.getBytes());
  15.         outputStream.close();
  16.     }

  17.     /**
  18.      * 读取数据
  19.      *
  20.      * @param inputStream
  21.      * @return
  22.      * @throws Exception
  23.      */
  24.     public static String read(InputStream inputStream) throws Exception {
  25.         ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 往内存写数据
  26.         byte[] buffer = new byte[1024]; // 缓冲区
  27.         int len = -1;
  28.         while ((len = inputStream.read(buffer)) != -1) {
  29.             byteArrayOutputStream.write(buffer, 0, len);
  30.         }
  31.         byte[] data = byteArrayOutputStream.toByteArray(); // 存储数据
  32.         byteArrayOutputStream.close();
  33.         inputStream.close();
  34.         return new String(data);
  35.     }
  36. }
复制代码
SdcardActivity类
  1. package com.ljq.sdcard;

  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.InputStream;

  6. import android.app.Activity;
  7. import android.os.Bundle;
  8. import android.os.Environment;
  9. import android.util.Log;
  10. import android.view.View;
  11. import android.widget.Button;
  12. import android.widget.EditText;
  13. import android.widget.TextView;
  14. import android.widget.Toast;

  15. import com.ljq.service.FileService;

  16. public class SdcardActivity extends Activity {
  17.     private final String TAG = "FileActivity";
  18.     private EditText filenameText;
  19.     private TextView resultView;
  20.     private EditText contentText;
  21.     @Override
  22.     public void onCreate(Bundle savedInstanceState) {
  23.         super.onCreate(savedInstanceState);
  24.         setContentView(R.layout.main);
  25.         filenameText = (EditText)this.findViewById(R.id.filename);
  26.         contentText = (EditText)this.findViewById(R.id.content);
  27.         resultView = (TextView)this.findViewById(R.id.resultView);
  28.         Button button = (Button)this.findViewById(R.id.button);
  29.         button.setOnClickListener(listener);
  30.         Button readButton = (Button)this.findViewById(R.id.readButton);
  31.         readButton.setOnClickListener(listener);
  32.     }
  33.    
  34.     private View.OnClickListener listener = new View.OnClickListener() {

  35.         public void onClick(View v) {
  36.             Button button = (Button) v;
  37.             String filename = filenameText.getText().toString();
  38.             // Environment.getExternalStorageDirectory()等价于new File("/sdcard")---->获取sdcard目录
  39.             //获取sdcard目录
  40.             //File file = new File("/sdcard" + filename);
  41.             File file = new File(Environment.getExternalStorageDirectory(), filename);
  42.             switch (button.getId()) {
  43.             case R.id.button:
  44.                 int resId = R.string.success; // 默认成功
  45.                 String content = contentText.getText().toString();
  46.                 //sdcard存在并且可以读写
  47.                 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
  48.                     try {
  49.                         FileOutputStream fileOutputStream = new FileOutputStream(file);
  50.                         FileService.save(fileOutputStream, content);
  51.                     } catch (Exception e) {
  52.                         Log.e(TAG, e.toString());
  53.                         resId = R.string.error;
  54.                     }
  55.                     Toast.makeText(SdcardActivity.this, resId, Toast.LENGTH_LONG).show();
  56.                 }else {
  57.                     Toast.makeText(SdcardActivity.this, "sdcard不存在或写保护", Toast.LENGTH_LONG).show();
  58.                 }
  59.                 break;
  60.             case R.id.readButton:
  61.                 try {
  62.                         InputStream inputStream= new FileInputStream(file);
  63.                         String text = FileService.read(inputStream);
  64.                         resultView.setText(text);
  65.                     } catch (Exception e) {
  66.                         Log.e(TAG, e.toString());
  67.                         Toast.makeText(SdcardActivity.this, "读取失败", Toast.LENGTH_LONG).show();
  68.                     }
  69.                 break;
  70.             }
  71.         }

  72.     };
  73. }
复制代码
清单文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="com.ljq.sdcard" android:versionCode="1"
  4.     android:versionName="1.0">
  5.     <application android:icon="@drawable/icon"
  6.         android:label="@string/app_name">
  7.         <activity android:name=".SdcardActivity"
  8.             android:label="@string/app_name">
  9.             <intent-filter>
  10.                 <action android:name="android.intent.action.MAIN" />
  11.                 <category
  12.                     android:name="android.intent.category.LAUNCHER" />
  13.             </intent-filter>
  14.         </activity>

  15.     </application>
  16.     <uses-sdk android:minSdkVersion="7" />
  17.     <!-- 在SDCard中创建与删除文件权限 -->
  18.     <uses-permission
  19.         android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  20.     <!-- 往SDCard写入数据权限 -->
  21.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  22. </manifest>
复制代码


运行结果

把文件存放在SDCard_第1张图片


你可能感兴趣的:(exception,android,String,File,layout,button)