Android学习之文件File

       Android中文件file的使用与其他平台类似的基于磁盘文件系统(disk-based file systems)。File 对象非常适合用来读写那种流式顺序的数据,例如:适合用来读写图片文件或者是网络中交换的数据。
       文件存储分为内部存储(Internal Storage)和外部存储(External Storage)两种。这两个名称来自于早先的Android系统中,那时候大多数的设备都内置了不可变的内存(internal storage),再加上一个类似SD card(external storage)可以卸载的存储部件。后来有一些设备把"internal" 与 "external" 的部分都做成不可卸载的内置存储了,虽然如此,但是这一整块还是从逻辑上还是被划分为"internal"与"external"的。

      Internal storage:总是可用的;这里的文件默认是只能被你的app所访问的;当用户卸载你的app的时候,系统会把internal里面的相关文件都清除干净;Internal是在你想确保不被用户与其他app所访问的最佳存储区域。

     External storage:并不总是可用的,因为用户可以选择把这部分作为USB存储模式,这样就不可以访问了;是大家都可以访问的,因此保存到这里的文件是失去访问控制权限的;当用户卸载你的app时,系统仅仅会删除external根目录(getExternalFilesDir())下的相关文件。

     External是在你不需要严格的访问权限并且你希望这些文件能够被其他app所共享或者是允许用户通过电脑访问时的最佳存储区域。
     Tip: 尽管app是默认被安装到internal storage的,你还是可以通过在程序的manifest文件中声明android:installLocation 属性来指定程序也可以被安装到external storage。当某个程序的安装文件很大,这个程序能够提供安装到external storage的选项。

     获取External存储的权限:为了写数据到external storage, 你必须在你的manifest文件中请求WRITE_EXTERNAL_STORAGE权限:

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

       Caution:目前,所有的apps都可以在不指定某个专门的权限下做读external storage的动作。但是,这在以后的版本中会有所改变。如果你的app只需要读的权限(不是写), 那么你将需要声明 READ_EXTERNAL_STORAGE 权限。为了确保你的app能持续地正常工作,你需要现在就声明读权限。

<manifest ...>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    ...
</manifest>

        但是,如果你的程序有声明读的权限,那么就默认有了写的权限。对于internal storage,你不需要声明任何权限,因为你的程序默认就有读写程序目录下的文件的权限。


       以下图所示为例:

Android学习之文件File_第1张图片

 

    其xml布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/file_imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/xqx1" />

    <TextView
        android:id="@+id/file_dir_txt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/file_write_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="写入图片到区域" />

    <Button
        android:id="@+id/file_pic_reader_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读取图片到区域" />

    <ImageView
        android:id="@+id/file_show_imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


       其代码如下:

package com.sc.android.file;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.sc.android.R;

public class MyFileActivity extends Activity {
	private TextView mDirtxt;
	private Button mWriteBtn, mReaderBtn;
	private ImageView mShowImg, mWriteImg;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_file_layout);
		mDirtxt = (TextView) findViewById(R.id.file_dir_txt);
		mWriteBtn = (Button) findViewById(R.id.file_write_btn);
		mReaderBtn = (Button) findViewById(R.id.file_pic_reader_btn);
		mShowImg = (ImageView) findViewById(R.id.file_show_imageView1);
		mWriteImg = (ImageView) findViewById(R.id.file_imageView1);

		Drawable drawable = getResources().getDrawable(R.drawable.xqx1);
		mWriteImg.setImageDrawable(drawable);

		final String fileEdress = Environment
				.getExternalStoragePublicDirectory(
						Environment.DIRECTORY_PICTURES).getPath();
		mDirtxt.setText(fileEdress);

		mWriteBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (!isExternalStorageWritable()) {
					Toast.makeText(MyFileActivity.this, "外部存储不可用",
							Toast.LENGTH_SHORT).show();
					return;
				}
				File file = new File(fileEdress, "mypic.png");
				FileOutputStream out;
				try {
					out = new FileOutputStream(file);
					Bitmap bitmap = BitmapFactory.decodeResource(
							getResources(), R.drawable.xqx1);
					bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
					out.close();
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
		mReaderBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (!isExternalStorageWritable()) {
					Toast.makeText(MyFileActivity.this, "外部存储不可用",
							Toast.LENGTH_SHORT).show();
					return;
				}
				File file = new File(fileEdress, "mypic.png");
				mDirtxt.setText(file.getPath());
				Bitmap bitmap = BitmapFactory.decodeFile(file.getPath());
				mShowImg.setImageBitmap(bitmap);
			}
		});
	}

	/**
	 * 检查外部存储是否可用
	 */
	private boolean isExternalStorageWritable() {
		String state = Environment.getExternalStorageState();
		if (state.equals(Environment.MEDIA_MOUNTED)) {
			return true;
		} else {
			return false;
		}
	}
}


 

     

你可能感兴趣的:(Android学习之文件File)