开发系统:Android4.4.2
开发平台:广州微嵌安卓工业平板
开发工具:eclipse
开发语言:Java
文件操作在各个开发语言中都是是使用的比较多,比较重要的部分,这次我们就来学习下在安卓系统的上是如何通过java编程来对文件进行的各种操作。
在Java中文件操作使用的一个类File,该类的一些基本方法如下:
File file = new File(path); //该path应为绝对路径名
createNewFile(); //创建新文件,如果文件不存在而且创建成功返回true,文件已存在返回false
delete(); //删除文件,删除文件或目录成功返回true,如果删除的是目录,该目录必须是空目录才能删除成功
exists(); //判断文件或目录是否存在
getAbsolutePath(); //返回该文件的绝对路径名
getName(); //获取该文件的文件名(与绝对路径名有区别)
getParent(); //返回上一级目录名(返回值类型String)
getParentFile(); //获取上一级目录(返回值类型File)
isDirectory(); //判断该File实例是否是个目录
isFile(); //判断该File实例是否是个文件
list(); //获取该目录下的子目录名跟文件名(返回值类型String[])
listFiles(); //获取该目录下的子目录跟文件(返回值类型File[])
length(); //获取该文件的大小
mkdir(); //创建新目录,创建成功返回true
renameTo(File); //将该文件重命名,也可以当作移动文件使用
以上是File的一些常用的方法,下面我们就来使用这些方法实现一些文件的基本操作,包括文件的增、删、 查、复制/ 粘贴等
1、新建目录:
File file = new File(dirpath);
//先是判断该目录是否存在,以存在则不再创建
if(file.exists()){
Toast.makeText(MainActivity.this,
"该目录已存在", Toast.LENGTH_SHORT).show();
}else{
try {
//新建目录
if(!file.mkdir()){
Toast.makeText(MainActivity.this,
"创建失败", Toast.LENGTH_SHORT).show();
return;
}else{
Toast.makeText(MainActivity.this,
"创建成功", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(MainActivity.this,
"IOException", Toast.LENGTH_SHORT).show();
}
}
2、新建文件
File file = new File(filepath);
//先是判断该文件是否存在,以存在则不再创建
if(file.exists()){
Toast.makeText(MainActivity.this,
"该文件已存在", Toast.LENGTH_SHORT).show();
}else{
try {
//新建文件
if(!file.createNewFile()){
Toast.makeText(MainActivity.this,
"创建失败", Toast.LENGTH_SHORT).show();
return;
}else{
Toast.makeText(MainActivity.this,
"创建成功", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(MainActivity.this,
"IOException", Toast.LENGTH_SHORT).show();
}
}
3、获取目录下的子目录跟文件
File dir = new File(dirpath);
//先判断dir是否是目录
if(dir.isDirectiry()){
//获取该目录下的所有文件列表
File[] filelist = dir.listFiles();
//判断该列表下的具体某个文件是属于目录还是文件
for(File file:filelist){
if(file.isFile()){
Log.d("File",file.getName());
}else if(file.isDirectory()){
Log.d("Dir",file.getName());
}
}
}
4、获取可以打开文件的应用程序
//获取可以打开该类文件的应用程序
private void openFile(File file) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
//获取该文件的文件类型
String type = getMIMEType(file);
try{
//获取可以打开该类文件的应用,并且打开
intent.setDataAndType(Uri.fromFile(file), type);
startActivity(intent);
}catch(ActivityNotFoundException e){
//没有可以打开该类文件的应用,弹出所以应用让用户选择
intent.setDataAndType(Uri.fromFile(file), "*/*");
startActivity(intent);
}
}
5、获取文件类型
//获取文件类型
private String getMIMEType(File file) {
String type = "";
String name = file.getName();
//文件扩展名
String end = name.substring(name.lastIndexOf(".") + 1, name.length()).toLowerCase();
if (end.equals("m4a") || end.equals("mp3") || end.equals("wav")) {
type = "audio";
} else if (end.equals("mp4") || end.equals("3gp")) {
type = "video";
} else if (end.equals("jpg") || end.equals("png") || end.equals("jpeg") || end.equals("bmp") || end.equals("gif")) {
type = "image";
} else if (end.equals("txt") || end.equals("doc") ) {
type = "txt";
} else if (end.equals("zip") || end.equals("rar") || end.equals("taz") ) {
type = "zip";
} else {
//如果无法直接打开,跳出列表由用户选择
type += "*";
}
type += "/*";
return type;
}
6、重命名或移动文件或目录
File oldFile = new File(oldName);
File newFile = new File(newName);
//先判断旧文件已存在并且新文件名没有被使用,就将旧文件重命名为新文件名
if(oldFile.exists()&&(!newFile.exists()){
oldFile.renameTo(newFile);
}
7、复制粘贴文件
因为在Java中没有直接复制文件或目录的方法,所以这里的复制文件或目录得自己实现该方法:
复制文件:在新的路径中的新建一个同名的文件,通过读取原文件的数据,再将数据写进目标文件
/*拷贝文件的操作,将原文件拷贝到目标文件
* resFile:需要拷贝的文件,不能是目录
* destFile:目标文件的完整路径名,应为新建的空文件,不能是目录
*/
private void copyfile(File resFile,File destFile){
try {
//获取原文件的FileInputStream流,用于读取原文件中的数据
FileInputStream resread= new FileInputStream(resFile);
//获取目标文件的FileInputStream流,用于将数据写进目标文件中
FileOutputStream destwrite = new FileOutputStream(destFile);
byte[] buffer = new byte[1024*1024];
int cnt= 0;
//判断是否已将原文件中的所有数据都全部写入目标文件
while(cnt<resFile.length()){
int a = 0;
//从原文件中读取数据
a = resread.read(buffer);
cnt+=a;
//将读取到的数据写入目标文件
if(a<1024*1024)
{
destwrite.write(buffer,0, a);
}else{
destwrite.write(buffer);
}
}
//关闭流
resread.close();
destwrite.close();
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
复制目录:先是获取源目录下的子目录跟文件,如果是文件则用复制文件的方法将文件复制进目标目录,
如果是目录则重复前面的操作,直到将该目录下所有的子文件跟子目录全复制完毕。
/*拷贝目录
* resname:复制源文件或目录的完整路径名
* destname:需要拷贝到的目标目录的完整路径名
*/
private void copy(String resname,String destname){
File destdir= new File(destname);
File resdir = new File(resname);
//先是判断源文件的类型
if(resdir.isDirectory()){
//判断目标目录是否存在,不存在则新建
if(!destdir.exists()){
destdir.mkdir();
}
//获取原目录下的子文件跟目录
String[] list = resdir.list();
int i=0;
while(i<list.length){
//递归调用该方法拷贝子目录中的子文件,这里传的参数应实时变换
copy(resname+"/"+list[i],destname+"/"+list[i]);
i++;
}
}
//判断原文件是属于文件类型
else if(resdir.isFile()){
try {
if(!destdir.exists()){
destdir.createNewFile();
}
//使用上面的复制文件的方法将原文件复制到目标文件
copyfile(resdir,destdir);
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
8、删除文件:
在Java中可以直接删除文件或目录,但是在删除目录时只能对空目录执行删除操作,所以在删除非空目录时,需将其目录下的所有子文件跟子目录删除掉,最后在删除该目录。
//删除文件或目录,跟拷贝目录有点相似,通过递归调用该方法逐一的将目录中的子目录跟子文件都删除掉
public boolean deletefile(String name){
boolean deleteFlag = true;
File dir = new File(name);
try{
//先是判断删除文件的类型
if(dir.isDirectory()){
String[] list =dir.list();
int i=0;
while(i<list.length && deleteFlag){
//将目录中的子目录跟子文件调用该方法逐一删除掉
deleteFlag = deletefile(name+"/"+list[i]);
i++;
}
}
//执行到这一步时dir只有两种情况:一、dir是个文件,二、dir是个空目录。该两种情况都可直接使用delete的方法删除掉
if(!dir.delete()){
return false;
}else{
return true;
}
}catch(NullPointerException e){
return false;
}
}
9、文件的读写操作
在拷贝文件的操作中就用到了文件的读写
FileInputStream:从文件中读取数据
FileOutputStream:往文件中写入数据
构造方法:
//获取原文件的FileInputStream流,用于读取原文件中的数据
FileInputStream in= new FileInputStream(file);
int size = in.read(buffer);
//获取目标文件的FileInputStream流,用于将数据写进目标文件中
FileOutputStream out = new FileOutputStream(file);
out.write(buffer,0,size);
以上就是在安卓系统的文件操作的一些最基本的操作,包括新建文件、目录,重命名,删除,复制粘贴,移动、文件读写等。这些的基本操作足够我们在日常的开发中对文件的操作需求。