Java IO流笔记4 --- File类

1 概述

IO流,流对象,只能操作设备上的数据,其他的都操作不了。
文件夹,文件的属性(文件的创建,修改,读写属性,文件名等),这些需要用 File类来操作。

File类

用来将文件或者文件夹(目录) 封装成对象

文件一旦变为对象,可以先操作文件,再操作文件中的数据

方便对文件或者文件夹的属性信息进行操作
File对象可以作为参数,传递给流的构造函数

文件一旦变为对象,可以先操作文件,再操作文件中的数据,可以将一个已存在的,或者不存在的 文件或者目录 封装成 File对象

几个构造函数
File(String pathname)
通过 将给定路径 名字字符串 转换为抽象路径名  来创建一个 新File实例
例:File f1 = new File("c:\\a.txt"); // 想把谁封装成对象,把谁往里写就可以了

File(String parent, String child) File(File parent, String child)
根据 parent路径名 字符串 和 child路径名 字符串,创建一个 新File实例
例:File f2 = new File("c:\\","a.txt");
File( URI uri )
通过 将给定的 file: URI 转换为一个 抽象路径名 来创建一个 新的File实例

File类的功能主要分为5种:获取,创建与删除,判断,重命名,过滤器,下面分别讲解

2 获取
2.1 获取 File类 本身的属性

获取 File类 本身的属性,包括,获取文件名称,文件路径,文件大小,文件修改时间等

File f = new File("G:\\test\\GestureTest\\a.txt");
String name = f.getName();
String absPath = f.getAbsolutePath(); // 绝对路径
String path = f.getPath();
long len = f.length(); // 文件的大小
long time = f.lastModified(); // 文件上次的修改时间
// 打印出来的时间是 1336102144203 怎么把它变为有效的时间
Date date = new Date(time); // 先把时间封装
// 把时间 格式化
DateFormat dateFormate = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
String str_time = dateFormate.format(date);
// 怎么判断文件有没有被改写,判断文件上次修改时间
// 单独开辟一条线程,监控文件的修改时间,一旦文件修改,就重新读取文件的内容
		         
System.out.println("parent:"+ f.getParent()); // getParent() 获取父目录
System.out.println("name:"+name);
System.out.println("absPath:"+absPath);
System.out.println("path:"+path);
System.out.println("len:"+len);
System.out.println("time:"+time);

输出结果

parent:G:\test\GestureTest
name:a.txt
absPath:G:\test\GestureTest\a.txt
path:G:\test\GestureTest\a.txt
len:35
time:1537322126301
2.2 获取系统根目录和容量

static File listRoots() 列出可用的文件系统根

private static void getListRoots() {
		File[] files = File.listRoots();
		for(File file:files){
			 System.out.println(file); // 这个打印电脑根目录 C:\   D:\  E:\  F:\  G:\
		}
		File file = new File("G:\\");
		System.out.println("getFreeSpace:"+file.getFreeSpace()); // 常用
		System.out.println("getTotalSpace:"+file.getTotalSpace());
		System.out.println("getUsableSpace:"+file.getUsableSpace());	
	}

输出结果:

C:\
D:\
E:\
F:\
G:\
getFreeSpace:32711270400
getTotalSpace:161060220928
getUsableSpace:32711270400
2.3 获取指定目录全部文件

如果现在给出了一个目录,则可以直接列出目录中的内容。列出的方法在File类中存在两个:

  • 以字符串数组的形式返回:public String[] list()
  • 以File数组的形式返回:public File[] listFiles()

分别演示如下:
public String[] list() ,以字符串数组的形式返回,列出了全部的名字,包括文件夹得名字和文件的名字

private static void getList() {
		File f = new File("G:"+ File.separator);
		String[] str = f.list();
		for(String s:str){
			System.out.println(s);
		}
}

输出结果:

$RECYCLE.BIN
a
app
cpcopy
demo
exerise
JAVA
Javaex
JAVA视频
jdk
jing
Jlex
... ...

public File[] listFiles(),以File数组的形式返回,列出了全部路径

private static void getlistFiles() {
		File f = new File("G:"+File.separator);
		File[] files = f.listFiles();
		for(File file:files){
			System.out.println(file);
		}	
	}

输出结果:

G:\$RECYCLE.BIN
G:\a
G:\app
G:\cpcopy
G:\demo
G:\exerise
G:\JAVA
... ... 
3 创建与删除

文件的创建与删除,方法的返回类型是 boolean类型

//	文件的创建和删除
File file = new File("file.txt");
// 和输出流不一样,如果文件不存在,则创建,如果文件存在,则不创建
boolean b = file.createNewFile();	
System.out.println("b="+b);
boolean b = file.delete();
System.out.println("b="+b);

// 文件夹的创建与删除
File dir = new File("abc\\q\\e\\c\\z\\r\\w\\y\\f\\e\\g\\s"); //创建多级目录
boolean b = dir.mkdir();//make directory		// 创建单级目录
dir.mkdirs();          //创建多级目录
System.out.println(dir.delete());  // 文件夹的删除
System.out.println(dir.delete());  // 文件夹的删除

说明:
windows的删除是从里往外删的,如果文件夹里有内容,直接删除,是删不掉的
如果文件夹里没有内容,直接删可以删掉
 对于多级目录,使用 delete()方法,返回true,最里面的 s 被删除掉
 如果文件正在被流所操作,同样也是删不掉
4 判断

我们若想操作一个文件,就要先判断这个文件存不存在

File f = new File("a.txt");
boolean b = f.exists();
System.out.println("b="+b);  // --- 判断一个文件是否存在的代码

File f = new File("aaa");
f.mkdir(); // 执行完这句,建立一个名为 aaa.txt的文件夹

File f = new File("aaa");
f.createNewFile(); // 建立一个文件

 aaa不一定是目录,a.txt 也不一定是文件
 所以如果文件未知,在操作前,先判断一下是否存在
 
 File f=new File("d:"+File.separator+"test.txt");
       if(f.exists()){
	      // 进行操作
        }else{
             try {
		     f.createNewFile(); // 不存在,就创建文件
	      } catch (IOException e) {
		     e.printStackTrace();
	      }
  }
}
5 重命名

如果在同一个目录下,是重命名,如果不在同一目录下,是剪切

public static void renameToDemo() {
		File f1 = new File("c:\\9.mp3");
		File f2 = new File("d:\\aa.mp3");
		boolean b = f1.renameTo(f2);
		System.out.println("b="+b);
	 }
6 过滤器

常用方法

String[] list( FilenameFilter filter )
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中,满足指定过滤器的文件和目录
FilenameFilter --- 接口

原理

过滤器,第一步做的,还是先调用 list,把这个 list下,所有目录都拿到,然后遍历数组,只要符合自己创建的 FilenameFilter.accept(dir, name);,只要返回true,就把符合条件的 内容 往数组里存

代码实例1

// 过滤器 --- 找发非隐藏文件
public class FilterByHidden implements FileFilter {
	public boolean accept(File pathname) {
		return !pathname.isHidden();
	}
}

private static void hiddenFile() {
		File f = new File("C:\\");
		File[] files = f.listFiles(new FilterByHidden());
		
		for(File file: files){
			System.out.println(file);
		}
	}

输出结果

C:\AppData
C:\BluetoothExchangeFolder
C:\dlcache
C:\Documents and Settings
C:\inetpub
C:\Intel
C:\MiFlashvcom.ini
C:\PerfLogs
C:\Program Files
C:\Program Files (x86)
C:\SWSETUP
C:\unintall.log
C:\Users
C:\WiFi_Log.txt
C:\Windows

代码实例2 专门用于过滤后缀名的过滤器

public class SuffixFilte implements FilenameFilter {

	private String suffix ;  // 我要过滤什么,不知道,你传什么,我过滤什么 
	public SuffixFilte(String suffix) {
		super();
		this.suffix = suffix;
	}
	public boolean accept(File dir, String name) {
		return name.endsWith(suffix);
	}
}


private static void txtFile() {
		File f = new File("C:\\");
		File[] files = f.listFiles(new SuffixFilte(".txt"));
		
		for(File file: files){
			System.out.println(file);
		}
	}

输出结果:

C:\WiFi_Log.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值