在sd卡下读写文件
1、要在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:
1. <!-- 在SDCard中创建与删除文件权限 -->
2. "android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
3. <!-- 往SDCard写入数据权限 -->
4. "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();
}
}
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)删除文件
f.isFile()
删除文件夹
if
(file.isDirectory())
(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;
}
}