1、I/O框架介绍
I/O(Input/Output)是计算机输入/输出的接口。Java的核心库java.io提供了全方面的I/O接口,包括:文件系统的操作,文件读写,标准设备输出等等。
2、File类及使用
(1)一个File类的对象,表示了磁盘上的文件或者目录。File类提供了与平台无关的方法来对磁盘上的文件或者目录进行操作。File类直接处理文件和文件系统。比如删除文件,获取文件长度大小等信息。File类没有提供方法从文件读取或者向文件存储信息。其构造方法有:File(String directoryPath);File(String directoryPath,String filename);File(File dirObj,String filename);
(2)File定义了获取File对象标准属性的方法:
public String getName();获取文件或目录的名字
public String getParent();获取父目录的路径字符串
public File getParentFile();获取父目录的File对象
public String getAbsolutePath();获取文件或目录的绝对路径
public boolean exists();判断文件或目录是否存在
public String[] list();获得目录里面的文件名和目录名。
public boolean isDirectory();判断是否是目录
public boolean isFile();判断是否是文件
public long length();获取文件的大小
public boolean delete();删除目录或者文件夹
public boolean mkdir();创建文件夹
......
3、IO方法举例
package com.iotek.file;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
File file = new File("f:\\hehe");
System.out.println(file.getAbsolutePath());//获得绝对路径
System.out.println(file.getParent());//获得父目录的路径字符串
System.out.println(file.isDirectory());//判断是否为目录
System.out.println(file.isFile());//判断是否为文件
System.out.println(file.exists());//判断是否存在
System.out.println(file.length());//获取长度
File myFile = new File("f:\\hehe");
System.out.println(myFile.mkdir());//新建一个目录
File myFile1 = new File("f:/hehe/hehe.txt");
try {
System.out.println(myFile1.createNewFile());//新建一个文件
} catch (IOException e) {
e.printStackTrace();
}
/*String[] filesStrings = file.list();//获取当前目录下的所有文件名和目录名
for(String f:filesStrings){
System.out.println(f);
}*/
/*String[] filesString = myFile.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".gif");//查找gif后缀的文件,打印文件名
}
});
for(String f:filesString){
System.out.println(f);
}*/
/*File[] files = myFile.listFiles();
for(File f:files){
System.out.println(f.getName() + "--" + f.length());//打印文件或目录的名字和大小
}*/
/*File[] filesString = myFile.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".gif");//查找gif后缀的文件,打印文件名
}
});
for(File f:filesString){
System.out.println(f.getName() + "--" + f.length());
}*/
File[] files = myFile.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".gif");
}
});
for(File f:files){
System.out.println(f.getName() + "--" + f.length());
}
}
}
4、案例
(1)案例说明:给定一个目录要求按层次显示目录结构信息,文件名后面加上*或者\来表示文件夹。
(2)案例分析:使用递归算法,使用File类中的ListFile方法来遍历文件夹,使用List集合。
(3)案例实现
package com.iotek.file;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class IteratorDirDemo {
public static void main(String[] args) {
IteratorUtil.IteratorDir(new File("f:/git"));
}
}
class IteratorUtil{
private static int level = 0;
public static void IteratorDir(File file){
if(null!=file){
/*
* 找到递归的出口,如果是文件或者是空文件夹就触碰到边界
*/
if(file.isFile()||file.listFiles().length==0){
return;
}else{
File[] files = file.listFiles();
files = sortFiles(files);
for(File f:files){
StringBuilder sBuilder = new StringBuilder();
sBuilder.append(getTab(level));
sBuilder.append(f.getName());
if(!f.isFile()){
sBuilder.append("\\");
}
System.out.println(sBuilder.toString());
if(f.isDirectory()){//如果是文件夹,进入目录遍历,层级自增1
level++;
IteratorDir(f);
level--;//目录自减1,返回上一级目录
}
}
}
}
}
private static File[] sortFiles(File[] files) {//对File类型的数组进行先目录后文件的排列
List<File> fList = new ArrayList<File>();
for(File f:files){//先存放文件夹
if(f.isDirectory()){
fList.add(f);
}
}
for(File f:files){//再存放文件
if(f.isFile()){
fList.add(f);
}
}
return fList.toArray(new File[fList.size()]);//把集合中的元素转化成指定大小的和指定类型的数组
}
private static String getTab(int level) {//根据层级数来得到制表符的个数
StringBuilder stringBuilder = new StringBuilder();
for(int i=0;i<level;i++){
stringBuilder.append("\t");
}
return stringBuilder.toString();
}
}