之前,我们所学的东西—— 流!都是用来操作设备上的数据,它有着自身的局限性,流不能操作数据所属的文件的属性——
诸如:修改时间,创建时间…………等信息。
【File类】
专门用于描述系统中文件或者文件夹的对象。可以用于操作文件或文件夹的属性信息。File对象可以作为参数传递给流的构造函数。
对于File类的学习:
【1】获取文件信息。
获取名称,getName()
获取路径。getAbsolutePath();获取绝对路径,无论file中封装的是什么,获取的都是绝对的全路径。
getparent(): 获取父目录
获取大小。
获取时间。
获取到具体的时间后,需要进行转换:
1. 将time 毫秒值转成Date对象。
2. 对Date对象进行格式化。 ...
【2】判断。
是只读的不?
是隐藏的不?
【3】文件的创建和删除以及该文件是否存在,文件对象自己最清楚。
具体创建,删除,是否存在等功能。
具体示例1 : 演示File对象的创建方式:
import java.io.File;
public class FileDemo {
//获取系统中的分隔符。
private static final String NAME_SEPARATOR = File.separator;
public static void main(String[] args) {
/*
* 演示File中的这些成员。
* 1,构造函数。
* 2,字段。
* 3,一般方法。
*/
fileConsDemo();
}
// 演示构造函数,file对象的创建。
public static void fileConsDemo(){
/*
* File中构造时,指定的路径可以是存在的,也可以是不存在的。
* 如果存在:覆盖;不存在,创建。
*/
//将c盘下的demo.txt封装成file对象。
File f1 = new File("c:\\demo.txt");
//将c盘下的abc文件夹封装成file对象。
File f2 = new File("c:\\abc");
File f3 = new File("c:\\","demo.txt");
File dir = new File("c:\\");
File f4 = new File(dir,"demo.txt");
File f5 = new File("c:\\abc\\ahha\\a.txt");//windows上使用。
File f6 = new File("c:"+NAME_SEPARATOR+"abc"+NAME_SEPARATOR+"ahha"+NAME_SEPARATOR+"a.txt");//可以在任何平台都可以使用。
}
}
上述示例中,主要是对:File对象的创建进行了具体的讲解!我们应当注意的是:路径分隔符 和 路径中的名称分隔符的区别。
路径分隔符: c:\\dba;d:demo.txt 其中的分号就是
路径中的名称分隔符: c:\\abc 其中的 \\即 是。
示例二:具体方法的使用:
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
public class FileDemo2 {
public static void main(String[] args) throws IOException {
methodDemo_5();
}
public static void methodDemo_5(){
File f1 = new File("c:\\haha.jpg");
File f2 = new File("d:\\xixi.jpg");
//将文件路径f1 命名为 f2 的名字。
f1.renameTo(f2);
//列出——可用的文件系统根路径。
File[] roots = File.listRoots();
for(File root : roots){
System.out.println(root);
}
}
public static void methodDemo_4() throws IOException {
File file = new File("c:\\2.txt");
// file.createNewFile(); 创建新的文件。
// file.mkdir(); //创建目录。
//要判断file中封装的是文件还是目录必须有前提,必须存在。用exists进行判断。
//if(file.exists() && file.isFile())
System.out.println("file:"+file.isFile());
System.out.println("dir:"+file.isDirectory());
//1,创建。
boolean b = file.createNewFile();
/*
* 如果文件不存在,就创建。如果文件存在,就不创建。输出流流会覆盖,如果不覆盖,需要在构造函数中加入true参数。续写。
*/
}
//获取文件最后一次被修改的时间。
public static void methodDemo_3() {
File file = new File("c:\\0.mp3");
long time = file.lastModified();
System.out.println("time="+time);
//为了知道具体的时间,需要进行转换。
//1,将time毫秒值转成Date对象。
//2,对Date对象进行格式化。
Date d = new Date(time);
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
String str_time = format.format(d);
System.out.println(str_time);
}
//获取大小。
public static void methodDemo_2() {
File file = new File("c:\\0.mp3");
long len = file.length();//获取文件大小
System.out.println("len="+len);
//获取文件所在系统盘的大小。
long len2 = file.getTotalSpace();
System.out.println("len2="+len2);
}
//file类方法演示
public static void methodDemo_1(){
File file = new File("abc");
String name = file.getName();//获取名称
String absPath = file.getAbsolutePath();//获取绝对路径。无论file中封装的是什么,获取到的都是绝对的。全路径。
String path = file.getPath();//获取路径。获取的是file中封装的内容。
String dir = file.getParent();//获取父目录。
System.out.println("name:"+name);
System.out.println("absPath:"+absPath);
System.out.println("path:"+path);
System.out.println("dir:"+dir);
}
}
接下里将重点讲解一个重点方法——
list():将指定目录下的文件或者文件夹的名称存储到字符串数组中,包含隐藏文件。
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
File file = new File("c:\\");
//必须是该文件中封装的是一个已存在目录。
String[] names = file.list();//将指定目的下的文件或者文件夹的名称存储到字符串数组中,包含隐藏文件。
System.out.println(names);
for(String name : names){
System.out.println(name);
}
}
}
问题又来了,这样我们得到的是:file 中所有的文件夹 和 文件,但我们现在有这个一个需求:想要系统中被隐藏的文件,那又该怎么办呢?
那就要用到——过滤器,同时File类为我们提供了方法:
File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
FileFilter过滤器接口,这个接口的实例对象可以传给上述方法listFiles().
他只有一个方法 :
boolean accept(File pathname)
测试指定抽象路径名是否应该包含在某个路径名列表中。
示例:用于找出f盘下被隐藏的文件。
import java.io.File;
public class FileFilterTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("f:\\");
File[] files = file.listFiles(new FilterByHidden());
for(File file1 : files){
System.out.println(file1);
}
}
}
过滤器:
import java.io.File;
import java.io.FileFilter;
//需要实现:接口—— FileFilter。
public class FilterByHidden implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.isHidden();
}
}
过滤器的原理:
1,首先获取到该目录所有内容,用list()
2. 对这些内容进行遍历在遍历中加入条件。条件:accept(pathname);
3. 凡是符合条件,accept 方法返回true,就将这些符合条件的进行存储
4. 将存储的内容返回,这样就得到了过滤后的内容。
因此当我们需要找出:想需要的文件时,就可以使用文件名过滤器。FilenameFileFilter。
例如想找 D盘中的以 “.java” 结束的文件。就可以造个过滤器。
import java.io.File;
import java.io.FilenameFilter;
public class FilterByJavaFile implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
}
如果你觉着这样不过瘾 可以定义一个万能的 文件名过滤器。
public class FilterBySuffix implements FilenameFilter{
private String suffix;
public FilterBySuffix(String suffix){
super();
this.suffix = suffix;
}
@Override
public Boolean accept(File dir , String name){
return name.endsWith(suffix);
}
}
这样的话,不论想要什么文件,都会 信手拈来。
下面我们将做三个练习:
练习一:给定一个系统路径,请将这个目录中的所有内容打印在控制台上。
练习二:给定一个系统路径,请将指定扩展名为“.doc”所有文件名,存储在一个名为javalist.txt的文件中。
练习三:给定一个系统路径,请删除下的所有内容。
练习一:
import java.io.File;
public class FileTest {
public static void main(String[] args) {
/*
* 需求:获取指定目录中的所有内容(包含子目录中的内容)
*
*/
File dir = new File("d:\\My Documents\\学习,工作:心得");
showDir(dir,0);
}
//递归。
public static void showDir(File dir,int count){
System.out.println(getSpace(count)+dir.getName());
count++;
File[] files = dir.listFiles();
for(File f : files){
if(f.isDirectory()){
showDir(f,count);
}
else
System.out.println(getSpace(count)+f.getName());
}
}
//打印格式:方便查看。
private static String getSpace(int count) {
StringBuilder sb = new StringBuilder();
for(int x=0; x<count; x++){
sb.append("|--");
}
return sb.toString();
}
}
练习二:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class TestFileList {
public static void main(String[] args) throws IOException {
File dir = new File("e:\\shipin\\就业班");
//文件名过滤器。
FilenameFilter filter = new FilenameFilter(){
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(".doc");
}
};
List<File> list = new ArrayList<File>();
//使用递归过滤并存储。
listAllJavaFile(dir , filter , list);
//创建目的地文件
File file = new File(dir , "javalist.txt");
//写入 file。
write2File(list , file);
}
public static void listAllJavaFile(File dir , FilenameFilter filter , List<File> list ){
File[] files = dir.listFiles();
if(files != null){
for(File file : files){
if(file.isDirectory()){ //如果是目录就递归,
listAllJavaFile(file , filter , list);
}else{
if(filter.accept(file,file.getName())){ //否则使用过滤器对指定的文件名,过滤。
//符合条件,进行存储。
list.add(file);
}
}
}
}
}
//对集合中存储的内容的信息写入到文件中。
//参数: 集合,文件。
public static void write2File(List<File> list , File dest) throws IOException{
BufferedWriter bufw = new BufferedWriter(new FileWriter(dest));
//遍历集合。
for(File file : list){
bufw.write(file.getAbsolutePath());
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}
练习三:
在开始这个练习之前,我们必须的知道:Windows 中,删除文件的原理:
如果目录里面有内容,不能直接将目录删除,必须将目录里的内容删光之后,才能将目录删除。
import java.io.File;
public class FileTest2 {
public static void main(String[] args) {
/*
* 练习:删除一个带内容的文件夹。
*
* 思路:
* 1,删除一个带内容的目录,必须按照window的规则,从里往外删。
* 2,要删除最里面,如果做到的呢?可以使用递归。
*/
File dir = new File("e:\\demodir");
removeDir(dir);
}
public static void removeDir(File dir){
File[] files = dir.listFiles();
for(File file : files){
if(file.isDirectory()){
removeDir(file);
}else{
System.out.println(file+":"+file.delete());
}
}
System.out.println(dir+":"+dir.delete());
}
}