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

Android学习笔记之File存储(sd卡)

2013-08-18 14:47 155 查看
在sd卡下读写文件

1、要在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:

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

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

<!-- 往SDCard写入数据权限 -->

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

2、常用操作

(1)获取SD卡的路径

//获取SD卡的路径
String SDPATH = Environment.getExternalStorageDirectory() + "/";


(2)为程序在sd卡建立专用的文件夹note:

String sDir=Environment.getExternalStorageDirectory() + "/"+"note";
File destDir = new File(sDir);
if (!destDir.exists()) {
destDir.mkdirs();}


创建文件:file.mkdir();

(3)在sd卡新建文件并写入内容

write(et2.getText().toString());

protected void write(String Content) {
// 参数Content是要写入的内容
try{
String name=et1.getText().toString()+".txt";//确定文件名
String SDPATH = Environment.getExternalStorageDirectory() + "/note/";  //获取SD卡的路径+文件夹
File file = new File(SDPATH + name);
file.createNewFile();  //新建文件
FileOutputStream fos = new FileOutputStream(file);//实例化文件输出流
fos.write(Content.getBytes());
fos.close();//关闭文件流
}
catch(Exception e){
e.printStackTrace();
}
}


注意:FileOutputStream(String name, boolean append)

append默认为false,即覆盖原内容;若为 true,则将字节写入文件末尾处,而不是写入文件开始处

(4)在sd卡读文件方法

tv.setText(read(File_Name));

public static String read(String path) {
// 参数FileName是一个文件的完整绝对路径
try {
File file = new File(path);
FileInputStream inStream = new FileInputStream(file);//实例化文件输入流对象
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];//定义缓存数组
int length = -1;
while((length = inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, length);
}
outStream.close();
inStream.close();
return outStream.toString();
}catch (IOException e){
Log.i("Fileread", e.getMessage());
return null;}
}


(5)对文件重命名

File file = new File(Environment.getExternalStorageDirectory() + "/MyNote/"+Title_Name);
file.renameTo(new File(Environment.getExternalStorageDirectory() + "/MyNote/"+newname));


(6)判断是否是文件夹:

File root = new File(fromFile);
if(root.isDirectory()){ }


(7)获取文件夹下的内容

String[] m=fileList();   //搜索应用程序私有文件夹下的私有文件,返回所有文件名的String数




(1)  File file = new File(Environment.getExternalStorageDirectory() + "/note");
String[] m=file.list();  //列表项成为sd卡note文件夹下的文件名数组
(2)  File[] currentFiles;//如果则获取当前目录下的全部文件 填充数组
currentFiles = file.listFiles();//文件数组


(8)删除文件

File f = new File(sDir);
if(f.exists()&[code]f.isFile()
) f.delete();[/code]

删除文件夹

if
(file.isDirectory())

File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
this.deleteFile(files[i]); // 把每个文件 用这个方法进行迭代[/code]

(8)获取File的文件名

String=File.getFilname();

返回的是 quick_search_widget_morning.jpg 这种形式

(9)文件(夹)的复制

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity
{
private Button m_btn = null;
static String SDPATH = Environment.getExternalStorageDirectory()+"" ;
private final static String FROMPATH =SDPATH+"/MyNote";//文件名
private final static String TOPATH = SDPATH+"/tmp/picture";//文件夹名

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
m_btn = (Button)findViewById(R.id.button1);
m_btn.setOnClickListener(new OnClickListener()
{

@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
if(copy(FROMPATH, TOPATH)==0)
{
Toast.makeText(MainActivity.this,"文件拷贝成功!!!",20000).show();
}else
{
Toast.makeText(MainActivity.this,"文件拷贝失败!!!",20000).show();
}
}
});
}

public int copy(String fromFile, String toFile)
{
File root = new File(fromFile);
if(!root.exists())
return -1;//如果不存在则 return出去

File targetDir = new File(toFile);   //目标目录
//创建目录
if(!targetDir.exists())
{
targetDir.mkdirs();
}

if(root.isDirectory())
{
toFile=toFile+"/"+root.getName();
//要复制的文件目录
File[] currentFiles;
//如果存在则获取当前目录下的全部文件 填充数组
currentFiles = root.listFiles();

//遍历要复制该目录下的全部文件
for(int i= 0;i<currentFiles.length;i++)
{
if(currentFiles[i].isDirectory())//如果当前项为子目录 进行递归
{
//new File(toFile +"/"+currentFiles[i].getName()).mkdirs();
copy(currentFiles[i].getPath(), toFile);

}else//如果当前项为文件则进行文件拷贝
{
CopySdcardFile(currentFiles[i].getPath(), toFile +"/"+currentFiles[i].getName());
}
}
}else { //如果待复制目录是文件,则直接复制
CopySdcardFile(root.getPath(), toFile+"/"+root.getName());
}
return 0;
}
//文件拷贝
//要复制的目录下的所有非子目录(文件夹)文件拷贝
public int CopySdcardFile(String fromFile, String toFile)
{
try
{
InputStream fosfrom = new FileInputStream(fromFile);
OutputStream fosto = new FileOutputStream(toFile);
byte bt[] = new byte[1024];
int c;
while ((c = fosfrom.read(bt)) > 0)
{
fosto.write(bt, 0, c);
}
fosfrom.close();
fosto.close();
return 0;
} catch (Exception ex)
{
return -1;
}
}
}


文件(夹)的移动:

File root = new File(fromFile);
Mdelete(root);
.......

public void Mdelete(File file){
if(file.isFile()){
file.delete();
return;
}
if(file.isDirectory()){
File[] childFile = file.listFiles();
if(childFile == null || childFile.length == 0){
file.delete();
return;
}
for(File f : childFile){
Mdelete(f);
}
file.delete();
}
}


(10)在sd卡搜索某类型的文件

File file=new File(SDPATH);
File[] files=file.listFiles();
MMove(files);
....
public boolean MMove(File[] files) {
if (files != null) {// 先判断目录是否为空,否则会报空指针
for (File file : files) {
if (file.isDirectory()) {
MMove(file.listFiles());
} else {
//String fileName = file.getName();
if (file.getName().endsWith(".png") {
copy(file.getPath(),TOPATH);
}
}
}
return true;}
else
return false;
}


三、以下是一个对SD操作经常用到的类,以后如果需要对SD卡操作,直接可以拿过来用:

public class FileUtils {

private String SDPATH;

public String getSDPATH() {
return SDPATH;
}
public FileUtils() {
//得到当前外部存储设备的目录
// /SDCARD
SDPATH = Environment.getExternalStorageDirectory() + "/";
}
/**
* 在SD卡上创建文件
*
* @throws IOException
*/
public File creatSDFile(String fileName) throws IOException {
File file = new File(SDPATH + fileName);
file.createNewFile();
return file;
}

/**
* 在SD卡上创建目录
*
* @param dirName
*/
public File creatSDDir(String dirName) {
File dir = new File(SDPATH + dirName);
dir.mkdir();
return dir;
}

/**
* 判断SD卡上的文件夹是否存在
*/
public boolean isFileExist(String fileName){
File file = new File(SDPATH + fileName);
return file.exists();
}

/**
* 将一个InputStream里面的数据写入到SD卡中
*/
public File write2SDFromInput(String path,String fileName,InputStream input){
File file = null;
OutputStream output = null;
try{
creatSDDir(path);
file = creatSDFile(path + fileName);
output = new FileOutputStream(file);
byte buffer [] = new byte[4 * 1024];
while((input.read(buffer)) != -1){
output.write(buffer);
}
output.flush();
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
output.close();
}
catch(Exception e){
e.printStackTrace();
}
}
return file;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: